This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PR middle-end/79123] cast false positive in -Walloca-larger-than=


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?

Attachment: curr
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]