aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2005-11-25 05:05:26 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2005-11-24 21:05:26 -0800
commit7934558dd1bb546c99903507337c94ba37dc68f3 (patch)
treea26d28237f7aa6f8e33d146afbd456082c1dbc81
parent210dfe6eccfaba41bf3860963b023a30c276dcbc (diff)
downloadgcc-7934558dd1bb546c99903507337c94ba37dc68f3.zip
gcc-7934558dd1bb546c99903507337c94ba37dc68f3.tar.gz
gcc-7934558dd1bb546c99903507337c94ba37dc68f3.tar.bz2
[multiple changes]
2005-11-25 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/24989 * fold-const.c (fold_build): Convert bool_var != 1 and bool_var == 0 to !bool_var. 2005-11-24 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/24989 * gcc.dg/tree-ssa/bool-10.c: New test. * gcc.dg/tree-ssa/bool-11.c: New test. * gcc.dg/tree-ssa/bool-7.c: Un-xfail. From-SVN: r107488
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c10
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/bool-10.c14
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/bool-11.c14
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/bool-7.c5
6 files changed, 53 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aeb45fd..bb928cf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2005-11-25 Andrew Pinski <pinskia@physics.uc.edu>
+ PR middle-end/24989
+ * fold-const.c (fold_build): Convert bool_var != 1 and
+ bool_var == 0 to !bool_var.
+
+2005-11-25 Andrew Pinski <pinskia@physics.uc.edu>
+
PR middle-end/24990
* fold-const.c (fold_binary): Fold (~a) == C to a == ~C
for C being INTEGER_CST. Likewise for !=.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 962ebd3..9a6ac70 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -8857,6 +8857,16 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
&& code == EQ_EXPR)
return non_lvalue (fold_convert (type, arg0));
+ /* bool_var != 1 becomes !bool_var. */
+ if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
+ && code == NE_EXPR)
+ return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
+
+ /* bool_var == 0 becomes !bool_var. */
+ if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
+ && code == EQ_EXPR)
+ return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
+
/* If this is an equality comparison of the address of a non-weak
object against zero, then we know the result. */
if ((code == EQ_EXPR || code == NE_EXPR)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cb611dc..226dc07 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,12 @@
2005-11-24 Andrew Pinski <pinskia@physics.uc.edu>
+ PR middle-end/24989
+ * gcc.dg/tree-ssa/bool-10.c: New test.
+ * gcc.dg/tree-ssa/bool-11.c: New test.
+ * gcc.dg/tree-ssa/bool-7.c: Un-xfail.
+
+2005-11-24 Andrew Pinski <pinskia@physics.uc.edu>
+
PR middle-end/24990
* tree-ssa/pr24990-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-10.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-10.c
new file mode 100644
index 0000000..d7bf20d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-10.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int f(_Bool x)
+{
+ return (x != 1);
+}
+
+/* There should be no != 1 which is produced by the front-end as
+ bool_var != 1 is the same as !bool_var. */
+/* { dg-final { scan-tree-dump-times "!= 1" 0 "optimized"} } */
+/* { dg-final { scan-tree-dump-times "!x" 1 "optimized"} } */
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-11.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-11.c
new file mode 100644
index 0000000..8d88b7e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-11.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int f(_Bool x)
+{
+ return (x == 0);
+}
+
+/* There should be no == 0 which is produced by the front-end as
+ bool_var == 0 is the same as !bool_var. */
+/* { dg-final { scan-tree-dump-times "== 0" 0 "optimized"} } */
+/* { dg-final { scan-tree-dump-times "!x" 1 "optimized"} } */
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-7.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-7.c
index b09b972..b798710 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/bool-7.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-7.c
@@ -11,8 +11,7 @@ int f(_Bool x)
return y;
}
-/* There should be no != 1. Though PHI-OPT or invert_truth does not
- fold its tree. */
-/* { dg-final { scan-tree-dump-times "!= 1" 0 "optimized" { xfail *-*-* } } }*/
+/* There should be no != 1. Fold changes x != 1 to ! x. */
+/* { dg-final { scan-tree-dump-times "!= 1" 0 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */