exp_ch4.adb (Expand_N_Type_Conversion): Don't promote integer division operands to...
authorRobert Dewar <dewar@adacore.com>
Thu, 23 Jul 2009 09:44:59 +0000 (09:44 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 23 Jul 2009 09:44:59 +0000 (11:44 +0200)
2009-07-23  Robert Dewar  <dewar@adacore.com>

* exp_ch4.adb (Expand_N_Type_Conversion): Don't promote integer
division operands to 64-bit inside a conversion if 64-bit division not
available.

From-SVN: r149985

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

index 1432873f6f64eaf943e3ad37d057fc7f387c8374..8ff8a468af54380413315ef21f626c8088dda047 100644 (file)
@@ -1,3 +1,9 @@
+2009-07-23  Robert Dewar  <dewar@adacore.com>
+
+       * exp_ch4.adb (Expand_N_Type_Conversion): Don't promote integer
+       division operands to 64-bit inside a conversion if 64-bit division not
+       available.
+
 2009-07-23  Sergey Rybin  <rybin@adacore.com>
 
        * gnat_ugn.texi: Update doc on Misnamed_Identifiers rule.
index c55cfa54050ade559396938c7723e68d4fc5e382..b982ca6cca623a79aaa93ef9a18a171da852db1a 100644 (file)
@@ -7991,12 +7991,22 @@ package body Exp_Ch4 is
 
          if Present (Inner_Type) then
 
-            --  Test for binary operation. Note that this includes junk like
-            --  XOR and concatenation, but none of those will yield a signed
-            --  integer result, so we won't get here except in the interesting
-            --  cases of simple arithmetic operators like addition.
-
-            if Nkind (Operand) in N_Binary_Op then
+            --  Test for interesting binary operation, which includes addition,
+            --  exponentiation, multiplication, and subtraction. We do not
+            --  include division in the 64-bit case. It is a very marginal
+            --  situation to get overflow from division in any case (largest
+            --  negative number divided by minus one), and doing the promotion
+            --  may result in less efficient code. Worse still we may end up
+            --  promoting to 64-bit divide on a target that does not support
+            --  this operation, causing a fatal error.
+
+            if Nkind_In (Operand, N_Op_Add,
+                                  N_Op_Expon,
+                                  N_Op_Multiply,
+                                  N_Op_Subtract)
+              or else (Nkind (Operand) = N_Op_Divide
+                        and then Inner_Type /= Standard_Long_Long_Integer)
+            then
                Rewrite (Left_Opnd (Operand),
                  Make_Type_Conversion (Loc,
                    Subtype_Mark => New_Reference_To (Inner_Type, Loc),