diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-04-12 10:39:50 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-04-12 10:39:50 +0200 |
commit | 868865f40f37e970ab1993d549e0bd9eb254ccc7 (patch) | |
tree | bd571d09488172f90ec661da283268ff3cae3fda /gcc/regcprop.c | |
parent | bf3989207ee7c50926aa7ca28cf1e13983e809b5 (diff) | |
download | gcc-868865f40f37e970ab1993d549e0bd9eb254ccc7.zip gcc-868865f40f37e970ab1993d549e0bd9eb254ccc7.tar.gz gcc-868865f40f37e970ab1993d549e0bd9eb254ccc7.tar.bz2 |
re PR rtl-optimization/85342 (ICE: SIGSEGV in copyprop_hardreg_forward_1 (regcprop.c:995) with -O2 -mavx512vl)
PR rtl-optimization/85342
* regcprop.c (copyprop_hardreg_forward_1): Remove replaced array, use
a bool scalar var inside of the loop instead. Don't try to update
recog_data.operand after failed apply_change_group.
* gcc.target/i386/pr85342.c: New test.
From-SVN: r259338
Diffstat (limited to 'gcc/regcprop.c')
-rw-r--r-- | gcc/regcprop.c | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/gcc/regcprop.c b/gcc/regcprop.c index e2a78a2..a664f76 100644 --- a/gcc/regcprop.c +++ b/gcc/regcprop.c @@ -751,7 +751,6 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd) bool is_asm, any_replacements; rtx set; rtx link; - bool replaced[MAX_RECOG_OPERANDS]; bool changed = false; struct kill_set_value_data ksvd; @@ -934,7 +933,7 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd) eldest live copy that's in an appropriate register class. */ for (i = 0; i < n_ops; i++) { - replaced[i] = false; + bool replaced = false; /* Don't scan match_operand here, since we've no reg class information to pass down. Any operands that we could @@ -951,26 +950,26 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd) if (recog_data.operand_type[i] == OP_IN) { if (op_alt[i].is_address) - replaced[i] + replaced = replace_oldest_value_addr (recog_data.operand_loc[i], alternative_class (op_alt, i), VOIDmode, ADDR_SPACE_GENERIC, insn, vd); else if (REG_P (recog_data.operand[i])) - replaced[i] + replaced = replace_oldest_value_reg (recog_data.operand_loc[i], alternative_class (op_alt, i), insn, vd); else if (MEM_P (recog_data.operand[i])) - replaced[i] = replace_oldest_value_mem (recog_data.operand[i], - insn, vd); + replaced = replace_oldest_value_mem (recog_data.operand[i], + insn, vd); } else if (MEM_P (recog_data.operand[i])) - replaced[i] = replace_oldest_value_mem (recog_data.operand[i], - insn, vd); + replaced = replace_oldest_value_mem (recog_data.operand[i], + insn, vd); /* If we performed any replacement, update match_dups. */ - if (replaced[i]) + if (replaced) { int j; rtx new_rtx; @@ -989,13 +988,6 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd) { if (! apply_change_group ()) { - for (i = 0; i < n_ops; i++) - if (replaced[i]) - { - rtx old = *recog_data.operand_loc[i]; - recog_data.operand[i] = old; - } - if (dump_file) fprintf (dump_file, "insn %u: reg replacements not verified\n", |