[multiple changes]
authorAndrew Pinski <pinskia@physics.uc.edu>
Wed, 4 May 2005 01:52:06 +0000 (01:52 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Wed, 4 May 2005 01:52:06 +0000 (18:52 -0700)
2004-05-03  Andrew Pinski  <pinskia@physics.uc.edu>

        PR middle-end/15618
        * fold-const.c (fold_widened_comparison): Treat BOOLEAN_TYPE
        the same as INTEGER_TYPE.
        (fold_binary): Fold "bool_var != 0" to bool_var.
        Fold "bool_var == 1" to bool_var.
2005-05-03  Andrew Pinski  <pinskia@physics.uc.edu>

        PR middle-end/15618
        * gcc.dg/tree-ssa/bool-[1-9].c: New tests.

From-SVN: r99207

12 files changed:
gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/bool-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/bool-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/bool-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/bool-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/bool-5.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/bool-6.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/bool-7.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/bool-8.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/bool-9.c [new file with mode: 0644]

index 0ed6387..d2177e0 100644 (file)
@@ -1,3 +1,11 @@
+2004-05-03  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR middle-end/15618
+       * fold-const.c (fold_widened_comparison): Treat BOOLEAN_TYPE
+       the same as INTEGER_TYPE.
+       (fold_binary): Fold "bool_var != 0" to bool_var.
+       Fold "bool_var == 1" to bool_var.
+
 2004-05-03  Richard Henderson  <rth@redhat.com>
 
        PR middle-end/21318
index 9e9243c..140f940 100644 (file)
@@ -6149,7 +6149,8 @@ fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
       && (TREE_TYPE (arg1_unw) == shorter_type
          || (TREE_CODE (arg1_unw) == INTEGER_CST
-             && TREE_CODE (shorter_type) == INTEGER_TYPE
+             && (TREE_CODE (shorter_type) == INTEGER_TYPE
+                 || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
              && int_fits_type_p (arg1_unw, shorter_type))))
     return fold_build2 (code, type, arg0_unw,
                       fold_convert (shorter_type, arg1_unw));
@@ -8856,10 +8857,20 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
     case LT_EXPR:
     case GT_EXPR:
     case LE_EXPR:
-    case GE_EXPR:
+    case GE_EXPR:      
       /* If one arg is a real or integer constant, put it last.  */
       if (tree_swap_operands_p (arg0, arg1, true))
        return fold_build2 (swap_tree_comparison (code), type, op1, op0);
+       
+      /* bool_var != 0 becomes bool_var. */
+      if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
+          && code == NE_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 == EQ_EXPR)
+        return non_lvalue (fold_convert (type, arg0));
 
       /* If this is an equality comparison of the address of a non-weak
         object against zero, then we know the result.  */
index 8638f98..dca6896 100644 (file)
@@ -1,3 +1,8 @@
+2005-05-03  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR middle-end/15618
+       * gcc.dg/tree-ssa/bool-[1-9].c: New tests.
+
 2005-05-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/21265
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-1.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-1.c
new file mode 100644 (file)
index 0000000..90cdef9
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int f(_Bool x)
+{
+  if (x != 0)
+   return 1;
+  return 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"} } */
+
+/* There should be no adde for powerpc. Checking if we actually optimizated
+   away the comparision.  */
+/* { dg-final { scan-assembler-times "adde" 0 { target powerpc-*-* } } } */
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-2.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-2.c
new file mode 100644 (file)
index 0000000..e46189a
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int f(_Bool x)
+{
+  int y;
+  if (x)
+    y = 1;
+  else
+    y = 0;
+  return y;
+}
+
+/* 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"} } */
+
+/* There should be no adde for powerpc. Checking if we actually optimizated
+   away the comparision.  */
+/* { dg-final { scan-assembler-times "adde" 0 { target powerpc-*-* } } } */
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-3.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-3.c
new file mode 100644 (file)
index 0000000..f2ee9b8
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int f(_Bool x)
+{
+  int y;
+  if (!x)
+    y = 0;
+  else
+    y = 1;
+  return y;
+}
+
+/* There should be no == 0. Though PHI-OPT or invert_truth does not
+   fold its tree.  */
+/* { dg-final { scan-tree-dump-times "== 0" 0 "optimized" { xfail *-*-* } } } */
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-4.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-4.c
new file mode 100644 (file)
index 0000000..389124f
--- /dev/null
@@ -0,0 +1,17 @@
+/* { 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"} } */
+
+/* There should be no adde for powerpc. Checking if we actually optimizated
+   away the comparision.  */
+/* { dg-final { scan-assembler-times "adde" 0 { target powerpc-*-* } } } */
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-5.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-5.c
new file mode 100644 (file)
index 0000000..1cb9de2
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int f(_Bool x)
+{
+  if (x == 1)
+   return 1;
+  return 0;
+}
+
+/* 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"} } */
+
+/* There should be no adde for powerpc. Checking if we actually optimizated
+   away the comparision.  */
+/* { dg-final { scan-assembler-times "adde" 0 { target powerpc-*-* } } } */
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-6.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-6.c
new file mode 100644 (file)
index 0000000..85f0333
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int f(_Bool x)
+{
+  int y;
+  if (x)
+    y = 1;
+  else
+    y = 0;
+  return y;
+}
+
+/* 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"} } */
+
+/* There should be no adde for powerpc. Checking if we actually optimizated
+   away the comparision.  */
+/* { dg-final { scan-assembler-times "adde" 0 { target powerpc-*-* } } } */
+
+/* { 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
new file mode 100644 (file)
index 0000000..b09b972
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int f(_Bool x)
+{
+  int y;
+  if (x != 1)
+    y = 0;
+  else
+    y = 1;
+  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 *-*-* } }  }*/
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-8.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-8.c
new file mode 100644 (file)
index 0000000..5a13309
--- /dev/null
@@ -0,0 +1,17 @@
+/* { 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"} } */
+
+/* There should be no adde for powerpc. Checking if we actually optimizated
+   away the comparision.  */
+/* { dg-final { scan-assembler-times "adde" 0 { target powerpc-*-* } } } */
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-9.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-9.c
new file mode 100644 (file)
index 0000000..09df2e4
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+_Bool f1(_Bool x)
+{
+  return !!x;
+}
+
+/* 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"} } */
+
+/* There should be no subfe for powerpc. Checking if we actually optimizated
+   away the comparision.  */
+/* { dg-final { scan-assembler-times "subfe" 0 { target powerpc-*-* } } } */
+
+/* { dg-final { cleanup-tree-dump "optimized" } } */