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.
rtx set = single_set (insn);
- if (!set)
+ if (!set || insn_could_throw_p (insn))
{
store_exprs.truncate (0);
continue;
--- /dev/null
+/* { 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);
+}