On 01/19/2017 05:17 AM, Aldy Hernandez wrote:
In the attached testcase, we have a clearly bounded case of alloca which
is being incorrectly reported:
void g (int *p, int *q)
{
size_t n = (size_t)(p - q);
if (n < 10)
f (__builtin_alloca (n));
}
The problem is that VRP gives us an anti-range for `n' which may be out
of range:
# RANGE ~[2305843009213693952, 16140901064495857663]
n_9 = (long unsigned int) _4;
We do a less than stellar job with casts and VR_ANTI_RANGE's, mostly
because we're trying various heuristics to make up for the fact that we
have crappy range info from VRP. More specifically, we're basically
punting on an VR_ANTI_RANGE and ignoring that the casted result (n_9)
has a bound later on.
Luckily, we already have code to check simple ranges coming into the
alloca by looking into all the basic blocks feeding it. The attached
patch delays the final decision on anti ranges until we have examined
the basic blocks and determined for that we are definitely out of range.
I expect all this to disappear with Andrew's upcoming range info overhaul.
OK for trunk?
Oh, and this is fine for the trunk.
jeff