[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:
parent
20652c7f22
commit
7e0c853c6f
1 changed files with 18 additions and 10 deletions
|
@ -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));
|
||||
|
|
Loading…
Add table
Reference in a new issue