From b317dca04e3ffb31144f79cb804ff6835c2a9af8 Mon Sep 17 00:00:00 2001 From: kelefth Date: Thu, 5 Dec 2024 11:11:27 +0100 Subject: 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. --- gcc/avoid-store-forwarding.cc | 2 +- gcc/testsuite/gcc.dg/pr117816.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr117816.c (limited to 'gcc') 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); +} -- cgit v1.1