summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2017-01-21 11:10:00 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2017-01-21 11:10:00 +0000
commitb2557118139c2da422a7709a0e515340db2258da (patch)
treee7cfdc9eb13bfe8b6dcd07c62aa6303563ed703d
parentdc326dc04b88cc0e2febb5f82cd5f7f9f249e567 (diff)
downloadgcc-b2557118139c2da422a7709a0e515340db2258da.tar.gz
* sem_eval.adb (Compile_Time_Compare): Reinstate the expr+literal (etc)
optimizations when the type is modular and the offsets are equal. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@244745 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/sem_eval.adb41
2 files changed, 27 insertions, 19 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index d2647b1b591..71927a618bd 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,8 @@
+2017-01-21 Eric Botcazou <ebotcazou@adacore.com>
+
+ * sem_eval.adb (Compile_Time_Compare): Reinstate the expr+literal (etc)
+ optimizations when the type is modular and the offsets are equal.
+
2017-01-20 Thomas Quinot <quinot@adacore.com>
* sem_warn.adb (Warn_On_Useless_Assignment): Adjust wording of warning
diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb
index b4219263ff7..0d135cf3d60 100644
--- a/gcc/ada/sem_eval.adb
+++ b/gcc/ada/sem_eval.adb
@@ -1329,26 +1329,29 @@ package body Sem_Eval is
-- J .. J + 1. This code can conclude LT with a difference of 1,
-- even if the range of J is not known.
- -- This would be wrong for modular types (e.g. X < X + 1 is False if
- -- X is the largest number).
+ declare
+ Lnode : Node_Id;
+ Loffs : Uint;
+ Rnode : Node_Id;
+ Roffs : Uint;
- if not Is_Modular_Integer_Type (Ltyp)
- and then not Is_Modular_Integer_Type (Rtyp)
- then
- declare
- Lnode : Node_Id;
- Loffs : Uint;
- Rnode : Node_Id;
- Roffs : Uint;
+ begin
+ Compare_Decompose (L, Lnode, Loffs);
+ Compare_Decompose (R, Rnode, Roffs);
- begin
- Compare_Decompose (L, Lnode, Loffs);
- Compare_Decompose (R, Rnode, Roffs);
+ if Is_Same_Value (Lnode, Rnode) then
+ if Loffs = Roffs then
+ return EQ;
+ end if;
- if Is_Same_Value (Lnode, Rnode) then
- if Loffs = Roffs then
- return EQ;
- elsif Loffs < Roffs then
+ -- When the offsets are not equal, we can go farther only if
+ -- the types are not modular (e.g. X < X + 1 is False if X is
+ -- the largest number).
+
+ if not Is_Modular_Integer_Type (Ltyp)
+ and then not Is_Modular_Integer_Type (Rtyp)
+ then
+ if Loffs < Roffs then
Diff.all := Roffs - Loffs;
return LT;
else
@@ -1356,8 +1359,8 @@ package body Sem_Eval is
return GT;
end if;
end if;
- end;
- end if;
+ end if;
+ end;
-- Next, try range analysis and see if operand ranges are disjoint