Here's the next segment in the ongoing saga of VRP vs Ada...
Not surprisingly we have another case where an object gets a
value outside of its TYPE_MIN_VALUE/TYPE_MAX_VALUE defined range.
Investigating the c460008 testsuite failure we have the following
code for Fixed_To_Short before VRP runs:
# BLOCK 4
# PRED: 3 (fallthru,exec)
D.1294_13 = D.1294_12;
D.1309_32 = for_the_value_31 /[rd] 1000000000;
D.1310_33 = (UNSIGNED_64) D.1309_32;
if (D.1310_33 > 255) goto <L0>; else goto <L1>;
# SUCC: 5 (true,exec) 6 (false,exec)
# BLOCK 5
# PRED: 4 (true,exec)
<L0>:;
__gnat_rcheck_10 ("c460008.adb", 162);
# SUCC: 13 (ab,eh,exec) 18 (ab,eh,exec) 29 (ab,eh,exec)
# BLOCK 6
# PRED: 4 (false,exec)
<L1>:;
iftmp.78_63 = D.1309_32;
iftmp.78_64 = D.1309_32;
D.1316_65 = (c460008__unsigned_edge_8) D.1309_32;
if (D.1316_65 == 255) goto <L3>; else goto <L4>;
# SUCC: 7 (true,exec) 8 (false,exec)
D.1309_32's type has the range [0x8000000000000000,0x7fffffffffffffff]
with 64bit precision.
In block #6 we cast the value of D.1309_32 into a smaller type,
specifically c460008__unsigned_edge_8 and store the result into
D.1316_64 which has type c460008__unsigned_edge_8.
c460008__unsigned_edge_8's range is [ ,254] with 8 bit precision.
Note carefully that with the range [ ,254] (according to
TYPE_MIN_VALUE/TYPE_MAX_VALUE) that the test
if (D.1316_65 == 255)
Must always be false. So VRP, as expected, wipes out test
completely.
The problem (of course) is D.1316_65 can and does actually hold
values outside the range [ ,254] at runtime. For example, it could
hold the value 255 if D.1309_32 had the value 255, which would occur
if for_the_value_31 held the value 255000000000.
Someone with a better knowledge of Ada is going to need to step
in here, but based on the type information provided by the Ada
front-end, VRP is doing the right thing here.
Jeff