diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-05-29 00:32:17 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-05-29 00:32:17 +0000 |
commit | 7e4a64167d4d2e7b0b680fae1706182223047af1 (patch) | |
tree | 1cc4c2dd03592662fac052ce53d10909a4615a5f /llvm/lib/Analysis/ValueTracking.cpp | |
parent | 70c2bbd29c71c0d35bd09c89f4d2f0af4991b6d3 (diff) | |
download | bcm5719-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