The sign-extending Alpha instructions like addl are sometimes not used. I
don't know whether the SEE pass is supposed to affect this, or whether it
is something a combiner pass should do...

#include <stdlib.h>

/* gcc 4.2.0 20060506:
        negq    a0,v0
        cmovge  a0,a0,v0
        sextl   v0,v0
   optimal:
        negl    a0,v0
        cmovge  a0,a0,v0  */   
int f5(int x) {
    return abs(x);
}


/* gcc 4.2.0 20060506:
        s4addq  a0,a0,v0
        s4addq  v0,v0,v0
        s8addq  v0,a0,v0
        s8addq  v0,a0,v0 #
        sextl   v0,v0    # can be combined to s8addl  v0,a0,v0 */
int64_t f23(int16_t x) {
    return 1609 * x;
}


/* gcc 4.2.0 20060506:
       ldah    t0,-32768
       xor     a0,t0,v0
       addq    v0,t0,v0 #
       sextl   v0,v0    # can be combined to addl    v0,t0,v0 */
unsigned f49(unsigned val) {
    return (val ^ 0x80000000) - 0x80000000;
}


-- 
           Summary: sign-extending Alpha instructions not exploited
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: falk at debian dot org
 GCC build triplet: alphaev68-unknown-linux-gnu
  GCC host triplet: alphaev68-unknown-linux-gnu
GCC target triplet: alphaev68-unknown-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27468

Reply via email to