diff options
| author | Davide Italiano <davide@freebsd.org> | 2017-01-19 23:07:51 +0000 |
|---|---|---|
| committer | Davide Italiano <davide@freebsd.org> | 2017-01-19 23:07:51 +0000 |
| commit | 6c2c3e07bfaa1a021bf665971b018491a728a895 (patch) | |
| tree | 40dbd17044c80ff0fdcb0c63479680733eb7b46a /llvm/test/Transforms/SCCP/overdefined-div.ll | |
| parent | 5a52af0f63af33ceca08ac39f04738f37bd746ea (diff) | |
| download | bcm5719-llvm-6c2c3e07bfaa1a021bf665971b018491a728a895.tar.gz bcm5719-llvm-6c2c3e07bfaa1a021bf665971b018491a728a895.zip | |
[SCCP] Teach the pass how to handle `div` with overdefined operands.
This can prove that:
extern int f;
int g() {
int x = 0;
for (int i = 0; i < 365; ++i) {
x /= f;
}
return x;
}
always returns zero. Thanks to Sanjoy for confirming this
transformation actually made sense (bugs are mine).
llvm-svn: 292531
Diffstat (limited to 'llvm/test/Transforms/SCCP/overdefined-div.ll')
| -rw-r--r-- | llvm/test/Transforms/SCCP/overdefined-div.ll | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SCCP/overdefined-div.ll b/llvm/test/Transforms/SCCP/overdefined-div.ll new file mode 100644 index 00000000000..f0b16155c17 --- /dev/null +++ b/llvm/test/Transforms/SCCP/overdefined-div.ll @@ -0,0 +1,32 @@ +; RUN: opt < %s -sccp -S | FileCheck %s + +; Test that SCCP has basic knowledge of when div can nuke overdefined values. + +; 0 / X = 0 even if X is overdefined. +; CHECK-LABEL: test1 +; CHECK-NEXT: ret i32 0 +define i32 @test1(i32 %foo) { + %tinkywinky = udiv i32 0, %foo + ret i32 %tinkywinky +} + +; CHECK-LABEL: test2 +; CHECK-NEXT: ret i32 0 +define i32 @test2(i32 %foo) { + %tinkywinky = sdiv i32 0, %foo + ret i32 %tinkywinky +} + +; CHECK-LABEL: test3 +; CHECK: ret i32 %tinkywinky +define i32 @test3(i32 %foo) { + %tinkywinky = udiv i32 %foo, 0 + ret i32 %tinkywinky +} + +; CHECK-LABEL: test4 +; CHECK: ret i32 %tinkywinky +define i32 @test4(i32 %foo) { + %tinkywinky = sdiv i32 %foo, 0 + ret i32 %tinkywinky +} |

