Regression caused by r218653 - [FastISel][AArch64] Fold sign-/zero-extends into the load instruction.
Richard Barton
richard.barton at arm.com
Thu Oct 9 01:59:59 PDT 2014
Hi Juergen
That appears to have fixed the regressions we are seeing.
Thanks for the quick fix!
Regards,
Rich
> -----Original Message-----
> From: Juergen Ributzka [mailto:juergen at apple.com]
> Sent: 07 October 2014 04:57
> To: Richard Barton
> Cc: LLVM Commits
> Subject: Re: Regression caused by r218653 - [FastISel][AArch64] Fold
sign-/zero-
> extends into the load instruction.
>
> 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