Fix ipa-cp wrt volatile loads
Check for volatile flag to ipa_load_from_parm_agg. gcc/ChangeLog: 2022-06-10 Jan Hubicka <hubicka@ucw.cz> PR ipa/105739 * ipa-prop.cc (ipa_load_from_parm_agg): Punt on volatile loads. gcc/testsuite/ChangeLog: 2022-06-10 Jan Hubicka <hubicka@ucw.cz> * gcc.dg/ipa/pr105739.c: New test.
This commit is contained in:
parent
0247ad3e0f
commit
8f6c317b3a
2 changed files with 34 additions and 0 deletions
|
@ -1112,6 +1112,10 @@ ipa_load_from_parm_agg (struct ipa_func_body_info *fbi,
|
|||
if (!base)
|
||||
return false;
|
||||
|
||||
/* We can not propagate across volatile loads. */
|
||||
if (TREE_THIS_VOLATILE (op))
|
||||
return false;
|
||||
|
||||
if (DECL_P (base))
|
||||
{
|
||||
int index = ipa_get_param_decl_index_1 (descriptors, base);
|
||||
|
|
30
gcc/testsuite/gcc.dg/ipa/pr105739.c
Normal file
30
gcc/testsuite/gcc.dg/ipa/pr105739.c
Normal file
|
@ -0,0 +1,30 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-optimized" } */
|
||||
|
||||
|
||||
__attribute__((noinline))
|
||||
static int
|
||||
test2(int a)
|
||||
{
|
||||
if (__builtin_constant_p (a))
|
||||
__builtin_abort ();
|
||||
return a;
|
||||
}
|
||||
static int
|
||||
test(int *a)
|
||||
{
|
||||
int val = *(volatile int *)a;
|
||||
if (__builtin_constant_p (val))
|
||||
__builtin_abort ();
|
||||
if (val)
|
||||
return test2(val);
|
||||
return 0;
|
||||
}
|
||||
int a;
|
||||
int
|
||||
main()
|
||||
{
|
||||
a = 0;
|
||||
return test (&a);
|
||||
}
|
||||
/* { dg-final { scan-tree-dump "test2" "optimized" } } */
|
Loading…
Add table
Reference in a new issue