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.
This commit is contained in:
parent
ed210c69ce
commit
b317dca04e
2 changed files with 12 additions and 1 deletions
|
@ -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;
|
||||
|
|
11
gcc/testsuite/gcc.dg/pr117816.c
Normal file
11
gcc/testsuite/gcc.dg/pr117816.c
Normal file
|
@ -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);
|
||||
}
|
Loading…
Add table
Reference in a new issue