gcc/
authorkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Apr 2005 18:42:38 +0000 (18:42 +0000)
committerkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Apr 2005 18:42:38 +0000 (18:42 +0000)
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
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr21031.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index f175789..2c6aa43 100644 (file)
@@ -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
index b2b8e97..41a3508 100644 (file)
@@ -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 (file)
index 0000000..df200d5
--- /dev/null
@@ -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" } } */
index 75fe6e1..a47d69a 100644 (file)
@@ -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;