Here's a potential approach to fixing PR92539, a P2 -Warray-bounds false positive triggered by loop unrolling.

As I speculated a couple years ago, we could eliminate the comparisons against bogus pointers. Consider:

  <bb 8> [local count: 30530247]:
  if (last_12 != &MEM <const char> [(void *)"aa" + 3B])
    goto <bb 9>; [54.59%]
  else
    goto <bb 12>; [45.41%]


That's a valid comparison as ISO allows us to generate, but not dereference, a pointer one element past the end of the object.

But +4B is a bogus pointer. So given an EQ comparison against that pointer we could always return false and for NE always return true.

VRP and DOM seem to be the most natural choices for this kind of optimization on the surface. However DOM is actually not viable because the out-of-bounds pointer warning pass is run at the end of VRP. So we've got to take care of this prior to the end of VRP.



I haven't done a bootstrap or regression test with this. But if it looks reasonable I can certainly push on it further. I have confirmed it does eliminate the tests and shuts up the bogus warning.

The downside is this would also shut up valid warnings if user code did this kind of test.

Comments/Suggestions?

Jeff

Reply via email to