From: Bill Schmidt Date: Wed, 6 Sep 2017 18:48:50 +0000 (+0000) Subject: backport: re PR tree-optimization/81987 (ICE in verify_ssa with -O3 -march=skylake... X-Git-Tag: releases/gcc-5.5.0~76 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=495c4e6ea86f52457c9bc43090ada19005ef1ae6;p=thirdparty%2Fgcc.git backport: re PR tree-optimization/81987 (ICE in verify_ssa with -O3 -march=skylake-avx512) [gcc] 2017-09-06 Bill Schmidt Backport from mainline: 2017-08-30 Bill Schmidt 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 Backport from mainline: 2017-08-30 Bill Schmidt PR tree-optimization/81987 * g++.dg/torture/pr81987.C: New file. From-SVN: r251817 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 06aeb5bb3d5f..0dd67c14a4da 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2017-09-06 Bill Schmidt + + Backport from mainline: + 2017-08-30 Bill Schmidt + + 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 Backport from mainline diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c index 63f1e6b1fd77..78eed1cf87cd 100644 --- a/gcc/gimple-ssa-strength-reduction.c +++ b/gcc/gimple-ssa-strength-reduction.c @@ -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"); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b3ce0469ee5e..8556eabccbcb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2017-09-06 Bill Schmidt + + Backport from mainline: + 2017-08-30 Bill Schmidt + + PR tree-optimization/81987 + * g++.dg/torture/pr81987.C: New file. + 2017-09-05 Bill Schmidt 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 index 000000000000..4579332ad716 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr81987.C @@ -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; + } + } +}