]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR tree-optimization/81987 (ICE in verify_ssa with -O3 -march=skylake...
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Wed, 6 Sep 2017 18:48:50 +0000 (18:48 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Wed, 6 Sep 2017 18:48:50 +0000 (18:48 +0000)
[gcc]

2017-09-06  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

Backport from mainline:
2017-08-30  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

PR tree-optimization/81987
* gimple-ssa-strength-reduction.c (insert_initializers): Don't
insert an initializer in a location not dominated by the stride
definition.

[gcc/testsuite]

2017-09-06  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

Backport from mainline:
2017-08-30  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

PR tree-optimization/81987
* g++.dg/torture/pr81987.C: New file.

From-SVN: r251817

gcc/ChangeLog
gcc/gimple-ssa-strength-reduction.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr81987.C [new file with mode: 0644]

index 06aeb5bb3d5fa5ef7808423e86369a60500742ff..0dd67c14a4da11022c098e9d8979709ce5ff6d06 100644 (file)
@@ -1,3 +1,13 @@
+2017-09-06  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       Backport from mainline:
+       2017-08-30  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       PR tree-optimization/81987
+       * gimple-ssa-strength-reduction.c (insert_initializers): Don't
+       insert an initializer in a location not dominated by the stride
+       definition.
+
 2017-09-05  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        Backport from mainline
index 63f1e6b1fd7730d8490389695928fb659461156d..78eed1cf87cdcec202787ae3ea4b7930e453ed60 100644 (file)
@@ -3165,6 +3165,23 @@ insert_initializers (slsr_cand_t c)
         that block, the earliest one will be returned in WHERE.  */
       bb = nearest_common_dominator_for_cands (c, incr, &where);
 
+      /* If the NCD is not dominated by the block containing the
+        definition of the stride, we can't legally insert a
+        single initializer.  Mark the increment as unprofitable
+        so we don't make any replacements.  FIXME: Multiple
+        initializers could be placed with more analysis.  */
+      gimple stride_def = SSA_NAME_DEF_STMT (c->stride);
+      basic_block stride_bb = gimple_bb (stride_def);
+
+      if (stride_bb && !dominated_by_p (CDI_DOMINATORS, bb, stride_bb))
+       {
+         if (dump_file && (dump_flags & TDF_DETAILS))
+           fprintf (dump_file,
+                    "Initializer #%d cannot be legally placed\n", i);
+         incr_vec[i].cost = COST_INFINITE;
+         continue;
+       }
+
       /* Create a new SSA name to hold the initializer's value.  */
       stride_type = TREE_TYPE (c->stride);
       new_name = make_temp_ssa_name (stride_type, NULL, "slsr");
index b3ce0469ee5e29e0d747fc4d0cc1ab8ab4249c84..8556eabccbcbb76e65495b05292305ac37b26a00 100644 (file)
@@ -1,3 +1,11 @@
+2017-09-06  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       Backport from mainline:
+       2017-08-30  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       PR tree-optimization/81987
+       * g++.dg/torture/pr81987.C: New file.
+
 2017-09-05  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        Backport from mainline
diff --git a/gcc/testsuite/g++.dg/torture/pr81987.C b/gcc/testsuite/g++.dg/torture/pr81987.C
new file mode 100644 (file)
index 0000000..4579332
--- /dev/null
@@ -0,0 +1,61 @@
+extern short var_1;
+extern const short var_3;
+extern unsigned long int var_9;
+extern short var_13;
+extern const unsigned long int var_15;
+extern const unsigned long int var_37;
+extern unsigned long int var_40;
+extern long long int var_47;
+extern short var_48;
+extern const short var_54;
+extern long long int var_79;
+extern long long int var_81;
+extern long long int var_94;
+extern long long int var_95;
+extern long long int var_701;
+extern unsigned long int var_786;
+extern short var_788;
+extern long long int var_844;
+
+struct struct_1 {
+  short member_1_2 : 15;
+  static long long int member_1_3;
+};
+
+extern struct_1 struct_obj_6;
+extern struct_1 struct_obj_8;
+
+void foo() {
+  int a = var_3 <= 602154393864UL;
+  if (var_81 ? 0 : var_3 && var_9)
+    ;
+  else {
+    var_94 = 0;
+    if (var_3 && var_48 || var_13) {
+      if (var_48)
+       var_95 = 0;
+      short b((2364461588881776511UL + var_3) * (2 ? var_13 : 0) || var_1);
+      struct_obj_8.member_1_2 = b;
+      if (var_15) {
+       if (var_81)
+         if (var_47)
+           ;
+         else if (var_40)
+           var_701 = 0;
+      } else {
+       if (var_40)
+         var_79 = 0;
+       if (var_54) {
+         if (var_37)
+           var_786 = 0;
+         else
+           var_788 = 0;
+                   struct_obj_6.member_1_3 =
+                     (2364461588881776511UL + var_3) * (2 ? var_13 : 0);
+       }
+      }
+      if ((2364461588881776511UL + var_3) * (2 ? var_13 : 0))
+       var_844 = 0;
+    }
+  }
+}