aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Trojanek <trojanek@adacore.com>2022-03-16 13:36:40 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2022-05-16 08:42:06 +0000
commit7e0c853c6f6a2987ac7616cbfdd52bb41d598bd5 (patch)
treec6d072ad511e8dde4d91ec3ef7f6f0bd0e016f72
parent20652c7f22b86d3cd646ecc2227a670f81302509 (diff)
downloadgcc-7e0c853c6f6a2987ac7616cbfdd52bb41d598bd5.zip
gcc-7e0c853c6f6a2987ac7616cbfdd52bb41d598bd5.tar.gz
gcc-7e0c853c6f6a2987ac7616cbfdd52bb41d598bd5.tar.bz2
[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.
-rw-r--r--gcc/ada/exp_attr.adb28
1 files changed, 18 insertions, 10 deletions
diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb
index e6d3e74..daab82f 100644
--- a/gcc/ada/exp_attr.adb
+++ b/gcc/ada/exp_attr.adb
@@ -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);
-
- -- 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.
+ declare
+ Save_Debug_Flag_MM : constant Boolean := Debug_Flag_MM;
+ begin
+ Debug_Flag_MM := True;
- 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));