From 66787d4fb278e88a3ed279cc4f6fe95751f4286b Mon Sep 17 00:00:00 2001
From: pinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Wed, 4 May 2005 01:52:06 +0000
Subject: [PATCH] 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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@99207 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                          |  8 ++++++++
 gcc/fold-const.c                       | 15 +++++++++++++--
 gcc/testsuite/ChangeLog                |  5 +++++
 gcc/testsuite/gcc.dg/tree-ssa/bool-1.c | 19 +++++++++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/bool-2.c | 22 ++++++++++++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/bool-3.c | 18 ++++++++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/bool-4.c | 17 +++++++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/bool-5.c | 19 +++++++++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/bool-6.c | 22 ++++++++++++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/bool-7.c | 18 ++++++++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/bool-8.c | 17 +++++++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/bool-9.c | 17 +++++++++++++++++
 12 files changed, 195 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/bool-1.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/bool-2.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/bool-3.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/bool-4.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/bool-5.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/bool-6.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/bool-7.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/bool-8.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/bool-9.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0ed638774710..d2177e0f64be 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 9e9243cdaae4..140f940af27a 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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.  */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8638f9852816..dca689649035 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 000000000000..90cdef90c4ef
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-1.c
@@ -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
index 000000000000..e46189ad9f2f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-2.c
@@ -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
index 000000000000..f2ee9b864dd8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-3.c
@@ -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
index 000000000000..389124f0ede9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-4.c
@@ -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
index 000000000000..1cb9de2cedab
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-5.c
@@ -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
index 000000000000..85f0333b8262
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-6.c
@@ -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
index 000000000000..b09b97202c5d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-7.c
@@ -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
index 000000000000..5a133097c388
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-8.c
@@ -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
index 000000000000..09df2e489830
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-9.c
@@ -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" } } */
-- 
GitLab