From: Richard Biener Date: Fri, 14 Feb 2020 08:14:42 +0000 (+0100) Subject: tree-optimization/92704 fix ifcvt ICE with loops without stores X-Git-Tag: releases/gcc-9.3.0~130 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4230afc0f4f498cc3967bde173c84dde66519711;p=thirdparty%2Fgcc.git tree-optimization/92704 fix ifcvt ICE with loops without stores 2020-02-14 Richard Biener Backport from mainline 2019-11-29 Richard Biener 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. --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e79258bfe8c..bfed93eac871 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2020-02-14 Richard Biener + + Backport from mainline + 2019-11-29 Richard Biener + + PR tree-optimization/92704 + * tree-if-conv.c (combine_blocks): Deal with virtual PHIs + in loops performing only loads. + 2020-02-14 Richard Biener Backport from mainline diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 24e5e88d7632..22660ff856e4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-02-14 Richard Biener + + Backport from mainline + 2019-11-29 Richard Biener + + PR tree-optimization/92704 + * gcc.dg/torture/pr92704.c: New testcase. + 2020-02-13 Jakub Jelinek PR c/93576 diff --git a/gcc/testsuite/gcc.dg/torture/pr92704.c b/gcc/testsuite/gcc.dg/torture/pr92704.c new file mode 100644 index 000000000000..79994a39b54b --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr92704.c @@ -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; + } +} diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 98566e3fd194..2780a4b243fc 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -2626,6 +2626,11 @@ combine_blocks (struct 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; @@ -2657,6 +2662,10 @@ combine_blocks (struct 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;