[LLVMdev] introducing sign extending halfword loads into the LLVM IR

Arnold Schwaighofer aschwaighofer at apple.com
Wed Jan 23 13:29:35 PST 2013


Hi Bjorn,

could you file a bug on llvm.org/bugs and cc me on it.

Thanks,
Arnold


> So it appears that also the ARM backend has a big problems with sign-extending loads.
> 
> I've compiled the following loop
> 
> short in[];
> int out[];
> int value;
> 
>  for (i = 0; i < nr; i++) {
>          value = in[i];
>          if (value>2047)
>                 value = 2047;
>          else if (value<-2048)
>                 value = -2048;
>          out[i]=value;
>   }
> 
> I used opt -O3 and llc -O3 -march=arm -regalloc=greedy, and here is the code that is generated for the loop body (and two instructions that set a loop-invariant mask beforehand), with some comments of mine:
> 
>         mov     r12, #255       
>         orr     r12, r12, #65280  
> LBB1_1:
>         ldrsh   r3, [r1]               # loads a short that is sign-extended to 32 bits
>         mov     r4, lr  
>         cmp     r3, #2048       
>         bge     .LBB1_3
>         and     r4, r3, r12        # mask with 0xffff to convert to short again
>         lsl     r4, r4, #16          # this lsl and the following 
>         asr     r5, r4, #16        # asr implement sign-extension to 32 bits again ....
>         ldr     r4, .LCPI1_1    
>         cmn     r5, #2048       
>         movge   r4, r3
> .LBB1_3:
>         str     r4, [r2, r0, lsl #2]
>         add     r0, r0, #1      
>         add     r1, r1, #2      
>         cmp     r0, #67 
>         blt     .LBB1_1
> 
> Clearly the sign-extensions are not handled correctly ...



More information about the llvm-dev mailing list