This is an archive of the discontinued LLVM Phabricator instance.

[SCEV] If max BTC is zero, then so is the exact BTC
ClosedPublic

Authored by reames on Aug 30 2021, 9:16 AM.

Details

Summary

The subtle bit is explaining why the two codepaths have a difference while both are correct. The test case with modifications is a good example, so let's discuss in terms of it.

  • The previous exact bounds for this example of (-126 + (126 smax %n))<nsw> can evaluate to either 0 or 1. Both are "correct" results, but only one of them results in a well defined loop. If %n were 127 (the only possible value producing a trip count of 1), then the loop must execute undefined behavior. As a result, we can ignore the TC computed when %n is 127. All other values produce 0.
  • The max taken count computation uses the limit (i.e. the maximum value END can be without resulting in UB) to restrict the bound computation. As a result, it returns 0 which is also correct.
WARNING: The logic above only holds for a single exit loop. The current logic for max trip count would be incorrect for multiple exit loops, except that we never call computeMaxBECountForLT except when we can prove either a) no overflow occurs in this IV before exit, or b) this is the sole exit.

An alternate approach here would be to add the limit logic to the symbolic path. I haven't played with this extensively, but I'm hesitant because a) the term is optional and b) I'm not sure it'll reliably simplify away. As such, the resulting code quality from expansion might actually get worse.

This was noticed while trying to figure out why D108848 wasn't NFC, but is otherwise standalone.

Diff Detail

Event Timeline

reames created this revision.Aug 30 2021, 9:16 AM
reames requested review of this revision.Aug 30 2021, 9:16 AM
Herald added a project: Restricted Project. · View Herald TranscriptAug 30 2021, 9:16 AM
reames edited the summary of this revision. (Show Details)Aug 30 2021, 9:32 AM

FYI, fixed the description. The current max trip code is correct, but only due to a subtle invariant I keep forgetting. I've now made exactly this same mistake at least 3 times...

FYI, fixed the description. The current max trip code is correct, but only due to a subtle invariant I keep forgetting. I've now made exactly this same mistake at least 3 times...

So that there isn't a fourth time, I added a clarifying comment and test in 301fbf9b.

This revision is now accepted and ready to land.Aug 30 2021, 2:20 PM