From a34519735694f005b45a5ec04d33fa8a20e2071c Mon Sep 17 00:00:00 2001
From: kazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Fri, 15 Apr 2005 18:42:38 +0000
Subject: [PATCH] gcc/ 	PR tree-optimization/21031 	* tree-ssa-forwprop.c
 (ssa_name_defined_by_comparison_p): New. 
 (forward_propagate_into_cond_1): Call it.  Forward propagate 
 integer-integer casts into COND_EXPRs.

testsuite/
	PR tree-optimization/21031
	* gcc.dg/tree-ssa/pr21031.c: New.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@98199 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                           |  7 +++++++
 gcc/testsuite/ChangeLog                 |  5 +++++
 gcc/testsuite/gcc.dg/tree-ssa/pr21031.c | 20 ++++++++++++++++++++
 gcc/tree-ssa-forwprop.c                 | 23 +++++++++++++++++++++++
 4 files changed, 55 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr21031.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f1757895d318..2c6aa4331ecd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2005-04-15  Kazu Hirata  <kazu@cs.umass.edu>
+
+	PR tree-optimization/21031
+	* tree-ssa-forwprop.c (ssa_name_defined_by_comparison_p): New.
+	(forward_propagate_into_cond_1): Call it.  Forward propagate
+	integer-integer casts into COND_EXPRs.
+
 2005-04-15  Dave Korn  <dave.korn@artimi.com>
 
 	* gcc.c (default_compilers): Clarify obscure error message when
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b2b8e9798e1d..41a3508a90c5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-04-15  Kazu Hirata  <kazu@cs.umass.edu>
+
+	PR tree-optimization/21031
+	* gcc.dg/tree-ssa/pr21031.c: New.
+
 2005-04-15  Uros Bizjak  <uros@kss-loka.si>
 
 	PR tree-optimization/21004
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21031.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21031.c
new file mode 100644
index 000000000000..df200d564d34
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21031.c
@@ -0,0 +1,20 @@
+/* PR tree-optimization/21031
+
+   Make sure that a != 0 is propagated into the "if" statement.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-forwprop1-details" } */
+
+int
+foo (int a)
+{
+  int b = a != 0;
+  unsigned char c = b;
+  if (c)
+    return 1;
+  else
+    return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "Replaced" 2 "forwprop1"} } */
+/* { dg-final { cleanup-tree-dump "forwprop1" } } */
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index 75fe6e17c764..a47d69ae7cc5 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -109,6 +109,23 @@ Boston, MA 02111-1307, USA.  */
 
    This will (of course) be extended as other needs arise.  */
 
+/* Given an SSA_NAME VAR, return true if and only if VAR is defined by
+   a comparison.  */
+
+static bool
+ssa_name_defined_by_comparison_p (tree var)
+{
+  tree def = SSA_NAME_DEF_STMT (var);
+
+  if (TREE_CODE (def) == MODIFY_EXPR)
+    {
+      tree rhs = TREE_OPERAND (def, 1);
+      return COMPARISON_CLASS_P (rhs);
+    }
+
+  return 0;
+}
+
 /* Forward propagate a single-use variable into COND once.  Return a
    new condition if successful.  Return NULL_TREE otherwise.  */
 
@@ -303,6 +320,12 @@ forward_propagate_into_cond_1 (tree cond, tree *test_var_p)
 	      || (TREE_CODE (inner_type) == BOOLEAN_TYPE
 		  && INTEGRAL_TYPE_P (outer_type)))
 	    ;
+	  else if (INTEGRAL_TYPE_P (outer_type)
+		   && INTEGRAL_TYPE_P (inner_type)
+		   && TREE_CODE (TREE_OPERAND (def_rhs, 0)) == SSA_NAME
+		   && ssa_name_defined_by_comparison_p (TREE_OPERAND (def_rhs,
+								      0)))
+	    ;
 	  else
 	    return NULL_TREE;
 
-- 
GitLab