Im looking at the testcase gcc.dg/torture/ftrapv-2.c
int i = 0x7fffffff;
int main(void)
{
pid_t child = fork ();
int status = 0;
if (child == 0)
{
volatile int x = i + 1 < i;
exit (0);
}
THis is failing with the new relational work... and I'm looking to
understand whether I should be doing something different, or whether its
the testcase that is flawed.
The IL produced is
i.0_1 = i;
_2 = i.0_1 + 1;
_4 = i.0_1 > _2;
_5 = (int) _4;
x ={v} _5;
exit (0);
What happens is that since _2 and i.0_1 are signed, and an overflow
would therefore trap, we determines that _2 = i.0_1 + 1; which
implies that _2 > i.0_1
EVRP then visits the next statement,
_4 = i.0_1 > _2;
and promptly determines that _4 can never be true, and replaces it with
0. Which then makes the rest of the block dead, and it gets optimized to
x ={v} 0;
exit (0);
And then the test case fails because it uses -ftrapv and expects there
to be a trap and it was removed....
IT can all be disabled by not registering that relationship when
flag_trapv is set... my question is whether that is the correct solution
tho...
It seems to me it might just be the testcase is assuming that the
addition can not be removed and now that it can be, perhaps a
modification to the test case is more appropriate? something like
simply incrementing i?
diff --git a/gcc/testsuite/gcc.dg/torture/ftrapv-2.c
b/gcc/testsuite/gcc.dg/torture/ftrapv-2.c
index 75e464fe557..5824c2fdbb7 100644
--- a/gcc/testsuite/gcc.dg/torture/ftrapv-2.c
+++ b/gcc/testsuite/gcc.dg/torture/ftrapv-2.c
@@ -20,7 +20,7 @@ int main(void)
int status = 0;
if (child == 0)
{
- volatile int x = i + 1 < i;
+ i = i + 1;
exit (0);
}
else if (child == -1)
Is that the right thing to do?
THanks
Andrew