sem_eval.adb (Compile_Time_Compare): Reinstate the expr+literal (etc) optimizations when...

* sem_eval.adb (Compile_Time_Compare): Reinstate the expr+literal (etc)
	optimizations when the type is modular and the offsets are equal.

From-SVN: r244745
This commit is contained in:
Eric Botcazou 2017-01-21 11:10:00 +00:00 committed by Eric Botcazou
parent 51f03c6b11
commit 22564ca916
2 changed files with 27 additions and 19 deletions

View file

@ -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

View file

@ -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