[Bug target/90363] New: or1k: Extra mask insn after load from memory

shorne at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon May 6 12:44:00 GMT 2019


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

            Bug ID: 90363
           Summary: or1k: Extra mask insn after load from memory
           Product: gcc
           Version: 9.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: shorne at gcc dot gnu.org
  Target Milestone: ---

When compiling the below code we see and extra "l.andi  r17, r17, 0xff" mask
instruction when reading a byte from memory.  This is not needed as loads
already zero extend.


Example:

#include <stdint.h>                                                             

volatile uint8_t g_doswap = 1;                                                  

uint64_t swap_1(uint64_t u64)                                                   
{                                                                               
   uint32_t u64_lo, u64_hi, u64_tmp;                                            

   u64_lo = u64 & 0xFFFFFFFF;                                                   
   u64_hi = u64 >> 32;                                                          

   if (g_doswap) {                                                              
      u64_tmp = u64_lo;                                                         
      u64_lo  = u64_hi;                                                         
      u64_hi  = u64_tmp;                                                        
   }                                                                            

   u64 = u64_lo;                                                                
   u64 += ((uint64_t) u64_hi << 32);                                            

   return u64;                                                                  
}  // swap_1


Output: or1k-elf-gcc -O2 -S doswap_1.c


        .file   "doswap_1.c"
        .section        .text
        .align 4
        .global swap_1
        .type   swap_1, @function
swap_1:
        l.movhi r17, ha(.LANCHOR0)
        l.lbz   r17, lo(.LANCHOR0)(r17)
        l.andi  r17, r17, 0xff                        // <---- Where is this
coming from
        l.movhi r19, hi(0)
        l.sfeq  r17, r19
        l.or    r12, r4, r4
        l.bf    .L6
        l.or    r11, r3, r3
        l.bf    .L6
        l.or    r11, r4, r4
        l.or    r12, r3, r3
.L6:
        l.jr    r9
         l.nop

        .size   swap_1, .-swap_1
        .global g_doswap
        .section        .data
        .set    .LANCHOR0,. + 0
        .type   g_doswap, @object
        .size   g_doswap, 1
g_doswap:
        .byte   1
        .ident  "GCC: (GNU) 9.0.1 20190326 (experimental)"


More information about the Gcc-bugs mailing list