Regression caused by r218653 - [FastISel][AArch64] Fold sign-/zero-extends into the load instruction.

Juergen Ributzka juergen at apple.com
Mon Oct 6 20:57:10 PDT 2014


Hi Richard,

I committed a fix in r219185. Please let me know if that worked.

Thanks

Cheers,
Juergen

> On Oct 6, 2014, at 8:01 AM, Richard Barton <richard.barton at arm.com> wrote:
> 
> Hi Juergen
> 
> This commit introduces a bug for the following (also attached) c-code.
> 
> The c code:
>  int a = INT_MIN;
>  long b = INT_MIN;
>  if (a != b) {
>     printf("FAIL - a = %d, b = %ld (should compare equal)\n", a, b);
>  }
> 
> The transformed assembly sequences look like:
> ldur    w9, [blah]      ldursw  x8, [blah] 
> mov     w8, w9         mov     w9, w8
> sxtw    x8, w8           mov     w8, x9
> ldr     x10 [blah2]     ldr     x10 [blah2]
> cmp     x8, x10         cmp     x8, x10
> 
> In your transformed sequence, the load instruction sign-extends to 64 bits
> in x8, but the subsequent 32-bit mov to w9 disregards the top bits so the
> subsequent 64-bit value in x8 has lost its signedness. 
> 
> A second example is the c code:
> 
>  signed char a = -99;
>  unsigned long b = a;
>  unsigned long c = ULONG_MAX - 98;
>  if (b != c) {
>    printf("Conversion Fails\n");
>  }
> 
> The generated assembly sequences are:
> ldurb	w9, [x29, #-5]  	ldursb	w9, [x29, #-5]
> mov	 w10, w9             mov	 w10, w9
> sxtb	x10, w10       
> str	x10, [sp, #16]     str	x10, [sp, #16]
> 
> The extending load does not extend up to 64-bits in w9, so the subsequent
> store of x9 is a positive value.
> 
> I guess that your patch needs to also take into account that the sign-extend
> instruction could convert the value from a 32-bit one to a 64-bit one and so
> your new load instruction must also preserve this to consumers of the old
> sxt value.
> 
> Regards
> Rich<example1.c><example2.c>




More information about the llvm-commits mailing list