Hi!

The rhs1 of CONVERT_EXPR_CODE_P doesn't have to be a SSA_NAME, can be e.g.
invariant like ADDR_EXPR of a var, but ifcombine didn't think about that
possibility.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk/4.9/4.8?

2014-07-03  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/61684
        * tree-ssa-ifcombine.c (recognize_single_bit_test): Make sure
        rhs1 of conversion is a SSA_NAME before using SSA_NAME_DEF_STMT on it.

        * gcc.c-torture/compile/pr61684.c: New test.

--- gcc/tree-ssa-ifcombine.c.jj 2014-06-06 09:19:22.000000000 +0200
+++ gcc/tree-ssa-ifcombine.c    2014-07-03 11:46:25.868335148 +0200
@@ -233,7 +233,8 @@ recognize_single_bit_test (gimple cond,
       while (is_gimple_assign (stmt)
             && ((CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt))
                  && (TYPE_PRECISION (TREE_TYPE (gimple_assign_lhs (stmt)))
-                     <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 
(stmt)))))
+                     <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (stmt))))
+                 && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME)
                 || gimple_assign_ssa_name_copy_p (stmt)))
        stmt = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt));
 
--- gcc/testsuite/gcc.c-torture/compile/pr61684.c.jj    2014-07-03 
12:06:46.654858358 +0200
+++ gcc/testsuite/gcc.c-torture/compile/pr61684.c       2014-07-03 
12:09:05.016123771 +0200
@@ -0,0 +1,15 @@
+/* PR tree-optimization/61684 */
+
+int a, c;
+static int *b = 0;
+short d;
+static short **e = 0;
+
+void
+foo ()
+{
+  for (; c < 1; c++)
+    ;
+  *e = &d;
+  a = d && (c && 1) & *b;
+}

        Jakub

Reply via email to