[Ada] Fix expansion of attribute Loop_Entry wrt value propagation

When expanding attribute Loop_Entry we create constant object
declarations and put them just before the loop. The current values of
variables at the point of Loop_Entry attribute must not be used when
analysing the initialization expressions of these constants, because
they might be different from the values at the loop entry itself.

gcc/ada/

	* exp_attr.adb (Expand_Loop_Entry_Attribute): Disable value
	propagation when analysing the constant that holds the
	Loop_Entry prefix value.
This commit is contained in:
Piotr Trojanek 2022-03-16 13:36:40 +01:00 committed by Pierre-Marie de Rodat
parent 20652c7f22
commit 7e0c853c6f

View file

@ -26,6 +26,7 @@
with Aspects; use Aspects;
with Atree; use Atree;
with Checks; use Checks;
with Debug; use Debug;
with Einfo; use Einfo;
with Einfo.Entities; use Einfo.Entities;
with Einfo.Utils; use Einfo.Utils;
@ -1792,23 +1793,30 @@ package body Exp_Attr is
Push_Scope (Scope (Loop_Id));
end if;
-- The analysis of the conditional block takes care of the constant
-- declaration.
-- Analyze constant declaration with simple value propagation disabled,
-- because the values at the loop entry might be different than the
-- values at the occurrence of Loop_Entry attribute.
if Present (Result) then
Rewrite (Loop_Stmt, Result);
Analyze (Loop_Stmt);
declare
Save_Debug_Flag_MM : constant Boolean := Debug_Flag_MM;
begin
Debug_Flag_MM := True;
-- The conditional block was analyzed when a previous 'Loop_Entry was
-- expanded. There is no point in reanalyzing the block, simply analyze
-- the declaration of the constant.
else
if Present (Aux_Decl) then
Analyze (Aux_Decl);
end if;
Analyze (Temp_Decl);
Debug_Flag_MM := Save_Debug_Flag_MM;
end;
-- If the conditional block has just been created, then analyze it;
-- otherwise it was analyzed when a previous 'Loop_Entry was expanded.
if Present (Result) then
Rewrite (Loop_Stmt, Result);
Analyze (Loop_Stmt);
end if;
Rewrite (N, New_Occurrence_Of (Temp_Id, Loc));