summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2016-05-29 00:32:17 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2016-05-29 00:32:17 +0000
commit7e4a64167d4d2e7b0b680fae1706182223047af1 (patch)
tree1cc4c2dd03592662fac052ce53d10909a4615a5f /llvm/lib/Analysis/ValueTracking.cpp
parent70c2bbd29c71c0d35bd09c89f4d2f0af4991b6d3 (diff)
downloadbcm5719-llvm-7e4a64167d4d2e7b0b680fae1706182223047af1.tar.gz
bcm5719-llvm-7e4a64167d4d2e7b0b680fae1706182223047af1.zip
[SCEV] Don't always add no-wrap flags to post-inc add recs
Fixes PR27315. The post-inc version of an add recurrence needs to "follow the same rules" as a normal add or subtract expression. Otherwise we miscompile programs like ``` int main() { int a = 0; unsigned a_u = 0; volatile long last_value; do { a_u += 3; last_value = (long) ((int) a_u); if (will_add_overflow(a, 3)) { // Leave, and don't actually do the increment, so no UB. printf("last_value = %ld\n", last_value); exit(0); } a += 3; } while (a != 46); return 0; } ``` This patch changes SCEV to put no-wrap flags on post-inc add recurrences only when the poison from a potential overflow will go ahead to cause undefined behavior. To avoid regressing performance too much, I've assumed infinite loops without side effects is undefined behavior to prove poison<->UB equivalence in more cases. This isn't ideal, but is not new to LLVM as a whole, and far better than the situation I'm trying to fix. llvm-svn: 271151
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud