aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorAlexandre Oliva <oliva@adacore.com>2021-12-08 23:37:14 -0300
committerAlexandre Oliva <oliva@gnu.org>2021-12-08 23:37:14 -0300
commit50e8b0c9bca6cdc57804f860ec5311b641753fbb (patch)
tree611ff19bef2b5e3ea11233f2c16b58f324e11503 /gcc/expr.c
parent2bff91f3b4e6f697823a261222186f4b5b052e86 (diff)
downloadgcc-50e8b0c9bca6cdc57804f860ec5311b641753fbb.zip
gcc-50e8b0c9bca6cdc57804f860ec5311b641753fbb.tar.gz
gcc-50e8b0c9bca6cdc57804f860ec5311b641753fbb.tar.bz2
[PR103302] skip multi-word pre-move clobber during lra
If we emit clobbers before multi-word moves during lra, we get confused if a copy ends up with input or output replaced with each other: the clobber then kills the previous set, and it gets deleted. This patch avoids emitting such clobbers when lra_in_progress. for gcc/ChangeLog PR target/103302 * expr.c (emit_move_multi_word): Skip clobber during lra. for gcc/testsuite/ChangeLog PR target/103302 * gcc.target/riscv/pr103302.c: New.
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index b281525..0365625 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -3929,7 +3929,7 @@ emit_move_multi_word (machine_mode mode, rtx x, rtx y)
hard regs shouldn't appear here except as return values.
We never want to emit such a clobber after reload. */
if (x != y
- && ! (reload_in_progress || reload_completed)
+ && ! (lra_in_progress || reload_in_progress || reload_completed)
&& need_clobber != 0)
emit_clobber (x);