https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93781
--- Comment #2 from vfdff <zhongyunde at huawei dot com> ---
I test a more simple testcase, and find the arg_5(D) already get the expected
range, but the _2 = 1 << arg_9 is unexpected.
unsigned int foo (unsigned int arg)
{
unsigned int C000003FE = 4;
if (arg + 1 < 4) // work of for if (arg < 3)
C000003FE = 0x1 << arg;
return C000003FE < 5;
}
Adding assert for arg_5(D) from arg_5(D) + 1
Visiting statement:
arg_9 = ASSERT_EXPR <arg_5(D), arg_5(D) + 1 <= 3>;
Intersecting
~[3, 4294967294] EQUIVALENCES: { arg_5(D) } (1 elements)
and
VARYING
to
~[3, 4294967294] EQUIVALENCES: { arg_5(D) } (1 elements)
Found new range for arg_9: ~[3, 4294967294]
marking stmt to be not simulated again
Visiting statement:
_2 = 1 << arg_9;
Meeting ------ should be Intersecting ?
[1, 4]
and
VARYING
to
VARYING
Found new range for _2: VARYING ---------> so, _2 excepted range [1, 4] ?