+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
-- 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
return GT;
end if;
end if;
- end;
- end if;
+ end if;
+ end;
-- Next, try range analysis and see if operand ranges are disjoint