middle-end/101824 - properly handle volatiles in nested fn lowering

When we build the COMPONENT_REF of a formerly volatile local off
the FRAME decl we have to make sure to mark the COMPONENT_REF
as TREE_THIS_VOLATILE.  While the GIMPLE operand scanner looks
at the FIELD_DECL this is not how volatile GENERIC refs work.

2021-08-09  Richard Biener  <rguenther@suse.de>

	PR middle-end/101824
	* tree-nested.c (get_frame_field): Mark the COMPONENT_REF as
	volatile in case the variable was.

	* gcc.dg/tree-ssa/pr101824.c: New testcase.
This commit is contained in:
Richard Biener 2021-08-09 10:19:10 +02:00
parent 0631faf87a
commit bb169406cd
2 changed files with 20 additions and 0 deletions

View File

@ -0,0 +1,19 @@
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-pcom-details -fdump-tree-optimized" } */
int main()
{
volatile int y;
void bar()
{
__builtin_printf ("%d", y);
}
while (y)
;
return 0;
}
/* Make sure the load from y is correctly interpreted as volatile, even
when going through FRAME. */
/* { dg-final { scan-tree-dump-not "Executing predictive commoning" "pcom" } } */
/* { dg-final { scan-tree-dump " ={v} FRAME" "optimized" } } */

View File

@ -1033,6 +1033,7 @@ get_frame_field (struct nesting_info *info, tree target_context,
}
x = build3 (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE);
TREE_THIS_VOLATILE (x) = TREE_THIS_VOLATILE (field);
return x;
}