diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2024-03-25 11:44:21 +0100 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2024-05-20 09:47:04 +0200 |
commit | 103e7f3a94b85c18a134a0fd8893b85e548882cb (patch) | |
tree | 41625284c9adb9d7b106d1897e3e4bf6ee8c0c03 /gcc/ada/exp_aggr.ads | |
parent | 888a12b48a3ef50d467c04ccbe4cc9c937a8450e (diff) | |
download | gcc-103e7f3a94b85c18a134a0fd8893b85e548882cb.zip gcc-103e7f3a94b85c18a134a0fd8893b85e548882cb.tar.gz gcc-103e7f3a94b85c18a134a0fd8893b85e548882cb.tar.bz2 |
ada: Extend expansion delaying mechanism to conditional expressions
When an aggregate that needs to be converted into a series of assignments is
present in an expression of a parent aggregate, or in the expression of an
allocator, an object declaration, or an assignment in very specific cases,
its expansion is delayed until its parent itself is expanded. This makes
it possible to avoid creating a superfluous temporary for the aggregate.
This change extends the delaying mechanism in the case of record aggregates
to intermediate conditional expressions, that is to say, to the conditional
expressions that are present between the parent and the aggregate, provided
that the aggregate be a dependent expression, directly or recursively. This
again makes it possible to avoid creating a temporary for the aggregate.
gcc/ada/
* exp_aggr.ads (Is_Delayed_Conditional_Expression): New predicate.
* exp_aggr.adb (Convert_To_Assignments.Known_Size): Likewise.
(Convert_To_Assignments): Climb the parent chain, looking through
qualified expressions and dependent expressions of conditional
expressions, to find out whether the expansion may be delayed.
Call Known_Size for this in the case of an object declaration.
If so, set Expansion_Delayed on the aggregate as well as all the
intermediate conditional expressions.
(Initialize_Component): Reset the Analyzed flag on an initialization
expression that is a conditional expression whose expansion has been
delayed.
(Is_Delayed_Conditional_Expression): New predicate.
* exp_ch3.adb (Expand_N_Object_Declaration): Handle initialization
expressions that are conditional expressions whose expansion has
been delayed.
* exp_ch4.adb (Build_Explicit_Assignment): New procedure.
(Expand_Allocator_Expression): Handle initialization expressions
that are conditional expressions whose expansion has been delayed.
(Expand_N_Case_Expression): Deal with expressions whose expansion
has been delayed by waiting for the rewriting of their parent as
an assignment statement and then optimizing the assignment.
(Expand_N_If_Expression): Likewise.
(Expand_N_Qualified_Expression): Do not apply a predicate check to
an operand that is a delayed aggregate or conditional expression.
* gen_il-gen-gen_nodes.adb (N_If_Expression): Add Expansion_Delayed
semantic flag.
(N_Case_Expression): Likewise.
* sinfo.ads (Expansion_Delayed): Document extended usage.
Diffstat (limited to 'gcc/ada/exp_aggr.ads')
-rw-r--r-- | gcc/ada/exp_aggr.ads | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/ada/exp_aggr.ads b/gcc/ada/exp_aggr.ads index a9eb051..17fa38b 100644 --- a/gcc/ada/exp_aggr.ads +++ b/gcc/ada/exp_aggr.ads @@ -54,6 +54,10 @@ package Exp_Aggr is -- Returns True if N is an aggregate of some kind whose Expansion_Delayed -- flag is set (see sinfo for meaning of flag). + function Is_Delayed_Conditional_Expression (N : Node_Id) return Boolean; + -- Returns True if N is a conditional expression whose Expansion_Delayed + -- flag is set (see sinfo for meaning of flag). + function Static_Array_Aggregate (N : Node_Id) return Boolean; -- N is an array aggregate that may have a component association with -- an others clause and a range. If bounds are static and the expressions |