aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorkelefth <konstantinos.eleftheriou@vrull.eu>2024-12-05 11:11:27 +0100
committerPhilipp Tomsich <philipp.tomsich@vrull.eu>2024-12-06 12:36:42 +0100
commitb317dca04e3ffb31144f79cb804ff6835c2a9af8 (patch)
tree2dd46256ca9622ef3fcab22d95a718a90e99d23c /gcc
parented210c69ce934b785410d7c1d7cd76d4ed46624d (diff)
downloadgcc-b317dca04e3ffb31144f79cb804ff6835c2a9af8.zip
gcc-b317dca04e3ffb31144f79cb804ff6835c2a9af8.tar.gz
gcc-b317dca04e3ffb31144f79cb804ff6835c2a9af8.tar.bz2
avoid-store-forwarding: bail when an instruction may throw [PR117816]
Avoid-store-forwarding doesn't handle the case where an instruction in the store-load sequence contains a REG_EH_REGION note, leading to the insertion of instructions after it, while it should be the last instruction in the basic block. This causes an ICE when compiling using `-O -fnon-call-exceptions -favoid-store-forwarding -fno-forward-propagate -finstrument-functions`. This patch rejects the transformation when there are instructions in the sequence that may throw an exeption. PR rtl-optimization/117816 gcc/ChangeLog: * avoid-store-forwarding.cc (store_forwarding_analyzer::avoid_store_forwarding): Reject the transformation when having instructions that may throw exceptions in the sequence. gcc/testsuite/ChangeLog: * gcc.dg/pr117816.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/avoid-store-forwarding.cc2
-rw-r--r--gcc/testsuite/gcc.dg/pr117816.c11
2 files changed, 12 insertions, 1 deletions
diff --git a/gcc/avoid-store-forwarding.cc b/gcc/avoid-store-forwarding.cc
index b1fa167..1b8c35b 100644
--- a/gcc/avoid-store-forwarding.cc
+++ b/gcc/avoid-store-forwarding.cc
@@ -429,7 +429,7 @@ store_forwarding_analyzer::avoid_store_forwarding (basic_block bb)
rtx set = single_set (insn);
- if (!set)
+ if (!set || insn_could_throw_p (insn))
{
store_exprs.truncate (0);
continue;
diff --git a/gcc/testsuite/gcc.dg/pr117816.c b/gcc/testsuite/gcc.dg/pr117816.c
new file mode 100644
index 0000000..6a9fc5f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr117816.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fnon-call-exceptions -favoid-store-forwarding -fno-forward-propagate -finstrument-functions" } */
+
+char *p;
+int y;
+long x;
+
+void foo()
+{
+ x /= *(int *)__builtin_memmove(&y, 4 + p, 3);
+}