]> gcc.gnu.org Git - gcc.git/commitdiff
re PR tree-optimization/21031 (Another missed forward propagation opportunity)
authorKazu Hirata <kazu@cs.umass.edu>
Fri, 15 Apr 2005 18:42:38 +0000 (18:42 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Fri, 15 Apr 2005 18:42:38 +0000 (18:42 +0000)
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.

From-SVN: r98199

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr21031.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index f1757895d31830061b5b2b28b958b01f9fa1bda7..2c6aa4331ecdf9845ab172d6d4d7d505a07366fe 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 b2b8e9798e1da9a3673927330980896d6310e0b8..41a3508a90c5d60f35cfa69a26d3409190972ede 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 75fe6e17c764535f42cd3e29919d110e7df0b876..a47d69ae7cc5fad3f9001d4a4901866eee82e7c2 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;
 
This page took 0.123496 seconds and 5 git commands to generate.