[Ada] Avoid creating temporaries in Universal_Integer, continued
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 13 Jan 2020 20:17:48 +0000 (21:17 +0100)
committerPierre-Marie de Rodat <derodat@adacore.com>
Wed, 3 Jun 2020 10:01:42 +0000 (06:01 -0400)
2020-06-03  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

* exp_util.adb (Remove_Side_Effects): For a type conversion, do
not remove the side effects of the expression only if it is of
universal integer type.

gcc/ada/exp_util.adb

index 1f3cfcc12748c031a1acd1b594db21787b6f15cc..af7a705251175c92b8ff77190c40a5cb1b6f8636 100644 (file)
@@ -11428,12 +11428,15 @@ package body Exp_Util is
          goto Leave;
 
       --  If this is a type conversion, leave the type conversion and remove
-      --  the side effects in the expression. This is important in several
-      --  circumstances: for change of representations, and also when this is a
-      --  view conversion to a smaller object, where gigi can end up creating
-      --  its own temporary of the wrong size.
-
-      elsif Nkind (Exp) = N_Type_Conversion then
+      --  side effects in the expression, unless it is of universal integer,
+      --  which is a very large type for a temporary. This is important in
+      --  several circumstances: for change of representations and also when
+      --  this is a view conversion to a smaller object, where gigi can end
+      --  up creating its own temporary of the wrong size.
+
+      elsif Nkind (Exp) = N_Type_Conversion
+        and then Etype (Expression (Exp)) /= Universal_Integer
+      then
          Remove_Side_Effects (Expression (Exp), Name_Req, Variable_Ref);
 
          --  Generating C code the type conversion of an access to constrained