re PR tree-optimization/71077 (gcc -lto raises ICE)
authorPatrick Palka <ppalka@gcc.gnu.org>
Wed, 1 Jun 2016 02:36:27 +0000 (02:36 +0000)
committerPatrick Palka <ppalka@gcc.gnu.org>
Wed, 1 Jun 2016 02:36:27 +0000 (02:36 +0000)
Fix PR tree-optimization/71077

gcc/ChangeLog:

PR tree-optimization/71077
* tree-ssa-threadedge.c (simplify_control_stmt_condition_1): In
the combining step, use boolean_false_node and boolean_true_node
as the designated false/true return values.

gcc/testsuite/ChangeLog:

PR tree-optimization/71077
* gcc.dg/tree-ssa/pr71077.c: New test.

From-SVN: r236973

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

index 45f31d4882c5f05d67e6536c30198086b369e219..a27cc911359bb6e5fba21e26125072c07fa41830 100644 (file)
@@ -1,3 +1,10 @@
+2016-06-01  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR tree-optimization/71077
+       * tree-ssa-threadedge.c (simplify_control_stmt_condition_1): In
+       the combining step, use boolean_false_node and boolean_true_node
+       as the designated false/true return values.
+
 2016-05-31  Jan Hubicka  <hubicka@ucw.cz>
 
        * predict.def (PRED_LOOP_EXTRA_EXIT): Define.
index df648204b599bddba508a6bb81bf844ece975d1c..17cf2fa6795d6f9fd70e200cd81eb150df5d3811 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-01  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR tree-optimization/71077
+       * gcc.dg/tree-ssa/pr71077.c: New test.
+
 2016-05-31  Jan Hubicka  <hubicka@ucw.cz>
 
        * g++.d/predict-lop-exit-1.C: Update template for new predictor name.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr71077.c b/gcc/testsuite/gcc.dg/tree-ssa/pr71077.c
new file mode 100644 (file)
index 0000000..4753740
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR c++/71077  */
+/* { dg-do link { target { i?86-*-* x86_64-*-* } } }  */
+/* { dg-options "-O3 -flto -march=core-avx2" }  */
+
+int *a;
+int b, c, d, e;
+int sched_analyze(void) {
+ for (; b; b++) {
+   c = 0;
+   for (; c < 32; c++)
+     if (b & 1 << c)
+       a[b + c] = d;
+ }
+ return 0;
+}
+
+void schedule_insns(void) { e = sched_analyze(); }
+int main(void) { schedule_insns(); }
index 5fd5b98afe8d256797df0931da2f3ac8625e7d27..de671b9463773e8a5d22807a8824670e4dc3f705 100644 (file)
@@ -572,8 +572,6 @@ simplify_control_stmt_condition_1 (edge e,
          enum tree_code rhs_code = gimple_assign_rhs_code (def_stmt);
          const tree rhs1 = gimple_assign_rhs1 (def_stmt);
          const tree rhs2 = gimple_assign_rhs2 (def_stmt);
-         const tree zero_cst = build_zero_cst (TREE_TYPE (op0));
-         const tree one_cst = build_one_cst (TREE_TYPE (op0));
 
          /* Is A != 0 ?  */
          const tree res1
@@ -588,19 +586,19 @@ simplify_control_stmt_condition_1 (edge e,
            {
              /* If A == 0 then (A & B) != 0 is always false.  */
              if (cond_code == NE_EXPR)
-               return zero_cst;
+               return boolean_false_node;
              /* If A == 0 then (A & B) == 0 is always true.  */
              if (cond_code == EQ_EXPR)
-               return one_cst;
+               return boolean_true_node;
            }
          else if (rhs_code == BIT_IOR_EXPR && integer_nonzerop (res1))
            {
              /* If A != 0 then (A | B) != 0 is always true.  */
              if (cond_code == NE_EXPR)
-               return one_cst;
+               return boolean_true_node;
              /* If A != 0 then (A | B) == 0 is always false.  */
              if (cond_code == EQ_EXPR)
-               return zero_cst;
+               return boolean_false_node;
            }
 
          /* Is B != 0 ?  */
@@ -616,19 +614,19 @@ simplify_control_stmt_condition_1 (edge e,
            {
              /* If B == 0 then (A & B) != 0 is always false.  */
              if (cond_code == NE_EXPR)
-               return zero_cst;
+               return boolean_false_node;
              /* If B == 0 then (A & B) == 0 is always true.  */
              if (cond_code == EQ_EXPR)
-               return one_cst;
+               return boolean_true_node;
            }
          else if (rhs_code == BIT_IOR_EXPR && integer_nonzerop (res2))
            {
              /* If B != 0 then (A | B) != 0 is always true.  */
              if (cond_code == NE_EXPR)
-               return one_cst;
+               return boolean_true_node;
              /* If B != 0 then (A | B) == 0 is always false.  */
              if (cond_code == EQ_EXPR)
-               return zero_cst;
+               return boolean_false_node;
            }
 
          if (res1 != NULL_TREE && res2 != NULL_TREE)
@@ -640,10 +638,10 @@ simplify_control_stmt_condition_1 (edge e,
                {
                  /* If A != 0 and B != 0 then (bool)(A & B) != 0 is true.  */
                  if (cond_code == NE_EXPR)
-                   return one_cst;
+                   return boolean_true_node;
                  /* If A != 0 and B != 0 then (bool)(A & B) == 0 is false.  */
                  if (cond_code == EQ_EXPR)
-                   return zero_cst;
+                   return boolean_false_node;
                }
 
              if (rhs_code == BIT_IOR_EXPR
@@ -652,10 +650,10 @@ simplify_control_stmt_condition_1 (edge e,
                {
                  /* If A == 0 and B == 0 then (A | B) != 0 is false.  */
                  if (cond_code == NE_EXPR)
-                   return zero_cst;
+                   return boolean_false_node;
                  /* If A == 0 and B == 0 then (A | B) == 0 is true.  */
                  if (cond_code == EQ_EXPR)
-                   return one_cst;
+                   return boolean_true_node;
                }
            }
        }