aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Dewar <dewar@adacore.com>2009-07-23 09:44:59 +0000
committerArnaud Charlet <charlet@gcc.gnu.org>2009-07-23 11:44:59 +0200
commit27f55f3c3274e8312712ebfdada668352881aeae (patch)
tree80a9936e46ae94b8ae88d45dc7df0447407fd733
parent1c5c721a87c80e845d533d1165b72a763fb7e82e (diff)
downloadgcc-27f55f3c3274e8312712ebfdada668352881aeae.zip
gcc-27f55f3c3274e8312712ebfdada668352881aeae.tar.gz
gcc-27f55f3c3274e8312712ebfdada668352881aeae.tar.bz2
exp_ch4.adb (Expand_N_Type_Conversion): Don't promote integer division operands to 64-bit inside a conversion if...
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
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/exp_ch4.adb22
2 files changed, 22 insertions, 6 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 1432873..8ff8a46 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -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.
diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index c55cfa5..b982ca6 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -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),