Message ID | 874n104sod.fsf@talisman.default |
---|---|
State | New |
Headers | show |
On Thu, May 8, 2014 at 9:48 AM, Richard Sandiford <rdsandiford@googlemail.com> wrote: > Richard Sandiford <rdsandiford@googlemail.com> writes: >> This PR was due to code in which -(int) foo was suposed to be sign-extended, >> but was being ORed with an unsigned int and so ended up being zero-extended. >> Fixed by using the proper-width type. > > As Kostya rightly said in the PR, this should have had a testcase too. > > Tested on x86_64-linux-gnu. It failed before the patch on x86_64, > passes after it, and is skipped for -m32. OK to install? Ok. Thanks, Richard. > Thanks, > Richard > > > gcc/testsuite/ > PR tree-optimization/61095 > * gcc.dg/torture/pr61095.c: New test. > > Index: gcc/testsuite/gcc.dg/torture/pr61095.c > =================================================================== > --- /dev/null 2014-05-03 11:58:38.033951363 +0100 > +++ gcc/testsuite/gcc.dg/torture/pr61095.c 2014-05-08 08:46:01.203827892 +0100 > @@ -0,0 +1,23 @@ > +/* { dg-do run } */ > +/* { dg-require-effective-target lp64 } */ > + > +extern void __attribute__ ((noreturn)) abort (void); > + > +int __attribute__ ((noinline, noclone)) > +foo (unsigned long addr) { > + unsigned long *p = (unsigned long*)((addr & 0xffff83fffffffff8UL) * 4); > + unsigned long xxx = (unsigned long)(p + 1); > + return xxx >= 0x3c000000000UL; > +} > + > +int > +main (void) > +{ > + if (foo (0)) > + abort (); > + if (foo (0x7c0000000000UL)) > + abort (); > + if (!foo (0xfc0000000000UL)) > + abort (); > + return 0; > +}
Index: gcc/testsuite/gcc.dg/torture/pr61095.c =================================================================== --- /dev/null 2014-05-03 11:58:38.033951363 +0100 +++ gcc/testsuite/gcc.dg/torture/pr61095.c 2014-05-08 08:46:01.203827892 +0100 @@ -0,0 +1,23 @@ +/* { dg-do run } */ +/* { dg-require-effective-target lp64 } */ + +extern void __attribute__ ((noreturn)) abort (void); + +int __attribute__ ((noinline, noclone)) +foo (unsigned long addr) { + unsigned long *p = (unsigned long*)((addr & 0xffff83fffffffff8UL) * 4); + unsigned long xxx = (unsigned long)(p + 1); + return xxx >= 0x3c000000000UL; +} + +int +main (void) +{ + if (foo (0)) + abort (); + if (foo (0x7c0000000000UL)) + abort (); + if (!foo (0xfc0000000000UL)) + abort (); + return 0; +}