aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-03-16 11:04:16 +0100
committerJakub Jelinek <jakub@redhat.com>2022-03-16 11:04:16 +0100
commit952155629ca1a4dfe7c7b26e53d118a9b853ed4a (patch)
tree3d59c4d677475bf53a6b6e2259bbf0b6ea0b1b78
parent6aef670e486e60e9f492752ff25ff3ed6058bc3b (diff)
downloadgcc-952155629ca1a4dfe7c7b26e53d118a9b853ed4a.zip
gcc-952155629ca1a4dfe7c7b26e53d118a9b853ed4a.tar.gz
gcc-952155629ca1a4dfe7c7b26e53d118a9b853ed4a.tar.bz2
aarch64: Fix up RTL sharing bug in aarch64_load_symref_appropriately [PR104910]
We unshare all RTL created during expansion, but when aarch64_load_symref_appropriately is called after expansion like in the following testcases, we use imm in both HIGH and LO_SUM operands. If imm is some RTL that shouldn't be shared like a non-sharable CONST, we get at least with --enable-checking=rtl a checking ICE, otherwise might just get silently wrong code. The following patch fixes that by copying it if it can't be shared. 2022-03-16 Jakub Jelinek <jakub@redhat.com> PR target/104910 * config/aarch64/aarch64.cc (aarch64_load_symref_appropriately): Copy imm rtx. * gcc.dg/pr104910.c: New test.
-rw-r--r--gcc/config/aarch64/aarch64.cc2
-rw-r--r--gcc/testsuite/gcc.dg/pr104910.c14
2 files changed, 15 insertions, 1 deletions
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index dbeaaf4..7a03375 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -3971,7 +3971,7 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm,
if (can_create_pseudo_p ())
tmp_reg = gen_reg_rtx (mode);
- emit_move_insn (tmp_reg, gen_rtx_HIGH (mode, imm));
+ emit_move_insn (tmp_reg, gen_rtx_HIGH (mode, copy_rtx (imm)));
emit_insn (gen_add_losym (dest, tmp_reg, imm));
return;
}
diff --git a/gcc/testsuite/gcc.dg/pr104910.c b/gcc/testsuite/gcc.dg/pr104910.c
new file mode 100644
index 0000000..10fed81
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr104910.c
@@ -0,0 +1,14 @@
+/* PR target/104910 */
+/* { dg-do compile } */
+/* { dg-options "-Os -fno-forward-propagate" } */
+/* { dg-additional-options "-fstack-protector-all" { target fstack_protector } } */
+
+void
+bar (void);
+
+void
+foo (int x)
+{
+ if (x)
+ bar ();
+}