re PR tree-optimization/92704 (ICE: Segmentation fault (in process_bb))
authorRichard Biener <rguenther@suse.de>
Fri, 29 Nov 2019 08:05:03 +0000 (08:05 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 29 Nov 2019 08:05:03 +0000 (08:05 +0000)
2019-11-29  Richard Biener  <rguenther@suse.de>

PR tree-optimization/92704
* tree-if-conv.c (combine_blocks): Deal with virtual PHIs
in loops performing only loads.

* gcc.dg/torture/pr92704.c: New testcase.

From-SVN: r278828

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr92704.c [new file with mode: 0644]
gcc/tree-if-conv.c

index b89f404a8b82ddd8d797f095f5bbc3cf3f006fc4..1ef3bc2de74c7d663f72e210c2711922fe9d6129 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-29  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92704
+       * tree-if-conv.c (combine_blocks): Deal with virtual PHIs
+       in loops performing only loads.
+
 2019-11-29  Julian Brown  <julian@codesourcery.com>
 
        * builtin-types.def (BT_DFLOAT32_PTR, BT_DFLOAT64_PTR,
index f5bb0d2113e4f2dfdbe02426acc5fb5ec525323f..b787896dd572025a3db7bd8251b1a5af9a0f7cd5 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-29  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/92704
+       * gcc.dg/torture/pr92704.c: New testcase.
+
 2019-11-29  Joseph Myers  <joseph@codesourcery.com>
 
        * objc.dg/attributes/gnu2x-attr-syntax-1.m: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr92704.c b/gcc/testsuite/gcc.dg/torture/pr92704.c
new file mode 100644 (file)
index 0000000..79994a3
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fexceptions -fnon-call-exceptions -fno-tree-dce -ftree-loop-if-convert" } */
+int zr, yx;
+
+void __attribute__ ((simd))
+oj (int rd, int q7)
+{
+  int wo = (__UINTPTR_TYPE__)&rd;
+
+  while (q7 < 1)
+    {
+      int kv;
+      short int v3;
+
+      for (v3 = 0; v3 < 82; v3 += 3)
+        {
+        }
+
+      kv = zr ? 0 : v3;
+      yx = kv < rd;
+      zr = zr && yx;
+      ++q7;
+    }
+}
index 33d6cddb4603714d85290939b4cfdaad48503e29..d2e40d43373951535958646af45d6633e20920c6 100644 (file)
@@ -2624,6 +2624,11 @@ combine_blocks (class loop *loop)
       vphi = get_virtual_phi (bb);
       if (vphi)
        {
+         /* When there's just loads inside the loop a stray virtual
+            PHI merging the uses can appear, update last_vdef from
+            it.  */
+         if (!last_vdef)
+           last_vdef = gimple_phi_arg_def (vphi, 0);
          imm_use_iterator iter;
          use_operand_p use_p;
          gimple *use_stmt;
@@ -2655,6 +2660,10 @@ combine_blocks (class loop *loop)
              if (gimple_vdef (stmt))
                last_vdef = gimple_vdef (stmt);
            }
+         else
+           /* If this is the first load we arrive at update last_vdef
+              so we handle stray PHIs correctly.  */
+           last_vdef = gimple_vuse (stmt);
          if (predicated[i])
            {
              ssa_op_iter i;