[Ada] CCG: restrict folding for boolean tests
authorArnaud Charlet <charlet@adacore.com>
Thu, 4 Jul 2019 08:05:23 +0000 (08:05 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 4 Jul 2019 08:05:23 +0000 (08:05 +0000)
2019-07-04  Arnaud Charlet  <charlet@adacore.com>

gcc/ada/

* exp_ch4.adb (Expand_Short_Circuit_Operator): Strip
N_Variable_Reference_Marker when checking for the presence of
actions.

From-SVN: r273047

gcc/ada/ChangeLog
gcc/ada/exp_ch4.adb

index 4de9db792a9d8320dfd970c8cb8c93003b976e23..1a86a4d439a67271e7cf6dc8e53fa91b5e316e29 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-04  Arnaud Charlet  <charlet@adacore.com>
+
+       * exp_ch4.adb (Expand_Short_Circuit_Operator): Strip
+       N_Variable_Reference_Marker when checking for the presence of
+       actions.
+
 2019-07-04  Arnaud Charlet  <charlet@adacore.com>
 
        * exp_aggr.adb (Check_Component): Take into account type
index b9aa4a5edf5b9b4e769a4ebe0c3d7587ec703ea8..7ba4283897ac073e7dffa5fa4eaa150f4dc0f96e 100644 (file)
@@ -12391,6 +12391,10 @@ package body Exp_Ch4 is
       --  For Opnd a boolean expression, return a Boolean expression equivalent
       --  to Opnd /= Shortcut_Value.
 
+      function Useful (Actions : List_Id) return Boolean;
+      --  Return True if Actions is not empty and contains useful nodes to
+      --  process.
+
       --------------------
       -- Make_Test_Expr --
       --------------------
@@ -12404,6 +12408,31 @@ package body Exp_Ch4 is
          end if;
       end Make_Test_Expr;
 
+      ------------
+      -- Useful --
+      ------------
+
+      function Useful (Actions : List_Id) return Boolean is
+         L : Node_Id;
+      begin
+         if Present (Actions) then
+            L := First (Actions);
+
+            --  For now "useful" means not N_Variable_Reference_Marker.
+            --  Consider stripping other nodes in the future.
+
+            while Present (L) loop
+               if Nkind (L) /= N_Variable_Reference_Marker then
+                  return True;
+               end if;
+
+               Next (L);
+            end loop;
+         end if;
+
+         return False;
+      end Useful;
+
       --  Local variables
 
       Op_Var : Entity_Id;
@@ -12463,7 +12492,7 @@ package body Exp_Ch4 is
       --  must only be executed if the right operand of the short circuit is
       --  executed and not otherwise.
 
-      if Present (Actions (N)) then
+      if Useful (Actions (N)) then
          Actlist := Actions (N);
 
          --  The old approach is to expand: