aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Sayle <sayle@gcc.gnu.org>2004-03-23 14:26:43 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2004-03-23 14:26:43 +0000
commitbb3a37acf0479f9d12c64852163b02cb63fef69e (patch)
tree5d31569a0dac072a9ef9e7c480f9f8ab8d3fe778
parentf2c79f80f2c92c9fca4632598e019c09903075ca (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/fold2.C19
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);
+}
+