diff options
author | Roger Sayle <sayle@gcc.gnu.org> | 2004-03-23 14:26:43 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2004-03-23 14:26:43 +0000 |
commit | bb3a37acf0479f9d12c64852163b02cb63fef69e (patch) | |
tree | 5d31569a0dac072a9ef9e7c480f9f8ab8d3fe778 /gcc | |
parent | f2c79f80f2c92c9fca4632598e019c09903075ca (diff) | |
download | gcc-bb3a37acf0479f9d12c64852163b02cb63fef69e.zip gcc-bb3a37acf0479f9d12c64852163b02cb63fef69e.tar.gz gcc-bb3a37acf0479f9d12c64852163b02cb63fef69e.tar.bz2 |
re PR rtl-optimization/14669 (Wrong code with -O for enum values expression E4 <= t && t <= E6)
2004-03-23 Kazu Hirata <kazu@cs.umass.edu>
PR optimization/14669
* fold-const.c (fold): Only unwiden integer comparisons for equality
or inequality operators, or when the signedness is the same.
* g++.dg/opt/fold2.C: New test case.
From-SVN: r79859
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/fold2.C | 19 |
4 files changed, 33 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index deb8826..5343f2c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-03-23 Kazu Hirata <kazu@cs.umass.edu> + + PR optimization/14669 + * fold-const.c (fold): Only unwiden integer comparisons for equality + and inequality operators, or when the signedness doesn't change. + 2004-03-23 Jakub Jelinek <jakub@redhat.com> * config.gcc (sparc-*-linux*): Add sparc/t-linux to tmake_file. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 84c6055..ab43be8 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -7535,6 +7535,9 @@ fold (tree expr) else if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE && TREE_CODE (arg0) == NOP_EXPR && (tem = get_unwidened (arg0, NULL_TREE)) != arg0 + && (code == EQ_EXPR || code == NE_EXPR + || TREE_UNSIGNED (TREE_TYPE (arg0)) + == TREE_UNSIGNED (TREE_TYPE (tem))) && (t1 = get_unwidened (arg1, TREE_TYPE (tem))) != 0 && (TREE_TYPE (t1) == TREE_TYPE (tem) || (TREE_CODE (t1) == INTEGER_CST diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 359124c..c111369 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-03-23 Roger Sayle <roger@eyesopen.com> + + PR optimization/14669 + * g++.dg/opt/fold2.C: New test case. + 2004-03-22 Jakub Jelinek <jakub@redhat.com> PR c/14069 diff --git a/gcc/testsuite/g++.dg/opt/fold2.C b/gcc/testsuite/g++.dg/opt/fold2.C new file mode 100644 index 0000000..95063d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/fold2.C @@ -0,0 +1,19 @@ +// PR optimization/14669 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (void); +extern "C" void exit (int); + +enum ActionType { EE=-1, E0=0, E1, E2 }; + +int main(void) +{ + ActionType t = E0; + + if (E1 <= t && t <= E2) + abort (); + + exit (0); +} + |