------- Comment #5 from rguenther at suse dot de 2008-08-13 21:05 ------- Subject: Re: [4.3/4.4 Regression] possible integer codegen bug
On Wed, 13 Aug 2008, jakub at gcc dot gnu dot org wrote: > ------- Comment #4 from jakub at gcc dot gnu dot org 2008-08-13 18:30 ------- > Verified the regression was introduced by PR35163 fix. > http://gcc.gnu.org/ml/gcc-patches/2008-04/msg00720.html > should have been IMNSHO applied for shorter_type bigger or equal than > arg1_unw's type, not just when they are equal. If shorter_type is bigger and > the signs are different, then the bits above shorter_type bits might be all > 1's > in one case and all 0's in the second case. Yeah, you are right. Patch is pre-approved. Richard. > Patch I'll be regtesting: > > 2008-08-13 Jakub Jelinek <[EMAIL PROTECTED]> > > PR middle-end/37103 > * fold-const.c (fold_widened_comparison): Do not allow > sign changes that change the result even if shorter type > is wider than arg1_unw's type. > > * gcc.c-torture/execute/20080813-1.c: New test. > > --- gcc/fold-const.c.jj2008-08-13 19:46:11.000000000 +0200 > +++ gcc/fold-const.c2008-08-13 20:18:21.000000000 +0200 > @@ -6733,10 +6733,8 @@ fold_widened_comparison (enum tree_code > if ((code == EQ_EXPR || code == NE_EXPR > || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type)) > && (TREE_TYPE (arg1_unw) == shorter_type > - || (TYPE_PRECISION (shorter_type) > - > TYPE_PRECISION (TREE_TYPE (arg1_unw))) > || ((TYPE_PRECISION (shorter_type) > - == TYPE_PRECISION (TREE_TYPE (arg1_unw))) > + >= TYPE_PRECISION (TREE_TYPE (arg1_unw))) > && (TYPE_UNSIGNED (shorter_type) > == TYPE_UNSIGNED (TREE_TYPE (arg1_unw)))) > || (TREE_CODE (arg1_unw) == INTEGER_CST > --- gcc/testsuite/gcc.c-torture/execute/20080813-1.c.jj2008-08-13 > 20:22:56.000000000 +0200 > +++ gcc/testsuite/gcc.c-torture/execute/20080813-1.c2008-08-13 > 20:22:10.000000000 +0200 > @@ -0,0 +1,30 @@ > +/* PR middle-end/37103 */ > + > +extern void abort (void); > + > +void > +foo (unsigned short x) > +{ > + signed char y = -1; > + if (x == y) > + abort (); > +} > + > +void > +bar (unsigned short x) > +{ > + unsigned char y = -1; > + if (x == y) > + abort (); > +} > + > +int > +main (void) > +{ > + if (sizeof (int) == sizeof (short)) > + return 0; > + foo (-1); > + if (sizeof (short) > 1) > + bar (-1); > + return 0; > +} > > > -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37103