diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20030626-1.c | 18 |
4 files changed, 30 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e92b4a51933..fec3aeaadc9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-06-26 Eric Botcazou <ebotcazou@libertysurf.fr> + + PR optimization/11210 + * fold-const (decode_field_reference): Strip only NOPs that + don't affect the sign. + 2003-06-26 Dhananjay Deshpande <dhananjayd@kpitcummins.com> * gcc/config/sh/sh.md (push_fpscr): Enable for TARGET_SH2E. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index b35d733e220..b160a4ea0eb 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -2742,7 +2742,8 @@ decode_field_reference (exp, pbitsize, pbitpos, pmode, punsignedp, if (! INTEGRAL_TYPE_P (TREE_TYPE (exp))) return 0; - STRIP_NOPS (exp); + /* Signedness matters here. */ + STRIP_SIGN_NOPS (exp); if (TREE_CODE (exp) == BIT_AND_EXPR) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e5f954145af..c988401302d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-06-26 Eric Botcazou <ebotcazou@libertysurf.fr> + + * gcc.dg/20030626-1.c: New test. + 2003-06-26 Neil Booth <neil@daikokuya.co.uk> * const-str-2.m: Update. diff --git a/gcc/testsuite/gcc.dg/20030626-1.c b/gcc/testsuite/gcc.dg/20030626-1.c new file mode 100644 index 00000000000..7d356e0050b --- /dev/null +++ b/gcc/testsuite/gcc.dg/20030626-1.c @@ -0,0 +1,18 @@ +/* PR optimization/11210 */ +/* Originator: Guido Classen <guido@clagi.de> */ +/* Reduced testcase by Falk Hueffner <falk@debian.org> */ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +/* Verify that the constant expressions folder doesn't + throw away the cast operation in the comparison. */ + +struct str { + int head; + char data[8]; +}; + +int foo(struct str t) +{ + return t.data[0] || (unsigned char) t.data[2] != 130; /* { dg-bogus "comparison is always 1" } */ +} |