https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119091

            Bug ID: 119091
           Summary: RISC-V eliminate redundancies in constant synthesis
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: law at gcc dot gnu.org
  Target Milestone: ---

Compile on rv64 with -O2:

#define const1 0x0101010101010101ULL 
#define const2 0x0080402010080400ULL 
#define const0 const1
unsigned long long g(unsigned long long occ, const unsigned int sq) {
  return const0 ;
}
unsigned long long f(unsigned long long occ, const unsigned int sq) {
  unsigned long long t= (const0)>>32<<32 ;
  unsigned long long t1= (unsigned int)(const0) ;
  asm("":"+r"(t));
  return t | t1;
}


Results in this for "f":

f:
        li      a0,16842752
        li      a5,16842752
        addi    a5,a5,257
        addi    a0,a0,257
        slli    a0,a0,32
        or      a0,a0,a5
        ret

Obviously there's a redundant li+addi in there.

Reply via email to