diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2021-07-15 11:18:02 +0200 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-09-22 15:01:42 +0000 |
commit | 26ece6eca7c02675fcae29a1fa5285b740241d60 (patch) | |
tree | c4e864f4bc010dc063ecf5b7a05a5fe238b27674 /gcc | |
parent | ec813d06f788fed7e0d9f47f77182877f1d8cf47 (diff) | |
download | gcc-26ece6eca7c02675fcae29a1fa5285b740241d60.zip gcc-26ece6eca7c02675fcae29a1fa5285b740241d60.tar.gz gcc-26ece6eca7c02675fcae29a1fa5285b740241d60.tar.bz2 |
[Ada] Generate temporary for if-expression with -fpreserve-control-flow
gcc/ada/
* exp_ch4.adb (Expand_N_If_Expression): Generate an intermediate
temporary when the expression is a condition in an outer decision
and control-flow optimizations are suppressed.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/exp_ch4.adb | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 497a52b..d7037bf 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -6253,6 +6253,46 @@ package body Exp_Ch4 is return; end if; + -- For the sake of GNATcoverage, generate an intermediate temporary in + -- the case where the if-expression is a condition in an outer decision, + -- in order to make sure that no branch is shared between the decisions. + + elsif Opt.Suppress_Control_Flow_Optimizations + and then Nkind (Original_Node (Parent (N))) in N_Case_Expression + | N_Case_Statement + | N_If_Expression + | N_If_Statement + | N_Goto_When_Statement + | N_Loop_Statement + | N_Return_When_Statement + | N_Short_Circuit + then + declare + Cnn : constant Entity_Id := Make_Temporary (Loc, 'C'); + Acts : List_Id; + + begin + -- Generate: + -- do + -- Cnn : constant Typ := N; + -- in Cnn end + + Acts := New_List ( + Make_Object_Declaration (Loc, + Defining_Identifier => Cnn, + Constant_Present => True, + Object_Definition => New_Occurrence_Of (Typ, Loc), + Expression => Relocate_Node (N))); + + Rewrite (N, + Make_Expression_With_Actions (Loc, + Expression => New_Occurrence_Of (Cnn, Loc), + Actions => Acts)); + + Analyze_And_Resolve (N, Typ); + return; + end; + -- If no actions then no expansion needed, gigi will handle it using the -- same approach as a C conditional expression. |