From: Richard Earnshaw Date: Mon, 19 Aug 2019 16:11:30 +0000 (+0000) Subject: [aarch64] PR target/91386 Use copy_rtx to avoid modifying original insns in peep2... X-Git-Tag: releases/gcc-9.3.0~705 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88cf851d26ff0edcd7da031f0be28d4bd2866136;p=thirdparty%2Fgcc.git [aarch64] PR target/91386 Use copy_rtx to avoid modifying original insns in peep2 pattern PR target/91386 is a situation where a peephole2 pattern substitution is discarded late because the selected instructions contain frame-related notes that we cannot redistribute (because the pattern has more than one insn in the output). Unfortunately, the original insns were being modified during the generation, so after the undo we are left with corrupt RTL. We avoid this by ensuring that the modifications are always made on a copy, so that the original insns are never changed. Backport from mainline 2019-09-09 Richard Earnshaw PR target/91386 * config/aarch64/aarch64.c (aarch64_gen_adjusted_ldpstp): Use copy_rtx to preserve the contents of the original insns. From-SVN: r274675 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2d2fa9425030..a8c9938c5d63 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2019-08-19 Richard Earnshaw + + Backport from mainline + 2019-09-09 Richard Earnshaw + + PR target/91386 + * config/aarch64/aarch64.c (aarch64_gen_adjusted_ldpstp): Use copy_rtx + to preserve the contents of the original insns. + 2019-08-16 Bernd Edlinger Backport from mainline diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 6b25d9cbfaec..82e9b1fbfd85 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -18162,19 +18162,21 @@ aarch64_gen_adjusted_ldpstp (rtx *operands, bool load, /* Sort the operands. */ qsort (temp_operands, 4, 2 * sizeof (rtx *), aarch64_ldrstr_offset_compare); + /* Copy the memory operands so that if we have to bail for some + reason the original addresses are unchanged. */ if (load) { - mem_1 = temp_operands[1]; - mem_2 = temp_operands[3]; - mem_3 = temp_operands[5]; - mem_4 = temp_operands[7]; + mem_1 = copy_rtx (temp_operands[1]); + mem_2 = copy_rtx (temp_operands[3]); + mem_3 = copy_rtx (temp_operands[5]); + mem_4 = copy_rtx (temp_operands[7]); } else { - mem_1 = temp_operands[0]; - mem_2 = temp_operands[2]; - mem_3 = temp_operands[4]; - mem_4 = temp_operands[6]; + mem_1 = copy_rtx (temp_operands[0]); + mem_2 = copy_rtx (temp_operands[2]); + mem_3 = copy_rtx (temp_operands[4]); + mem_4 = copy_rtx (temp_operands[6]); gcc_assert (code == UNKNOWN); }