diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2016-09-05 23:38:22 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2016-09-05 23:38:22 +0000 |
| commit | eea2ef7862e0be7368a74b142d5d87f700b02a8d (patch) | |
| tree | bde070e284bf8815a1d98e324c567c687042ce12 /llvm/test/Transforms/InstCombine | |
| parent | 46f9df5b718891a74067ee59f2e2a1f38dd8e0ed (diff) | |
| download | bcm5719-llvm-eea2ef7862e0be7368a74b142d5d87f700b02a8d.tar.gz bcm5719-llvm-eea2ef7862e0be7368a74b142d5d87f700b02a8d.zip | |
[InstCombine] don't assert that division-by-constant has been folded (PR30281)
This is effectively a revert of:
https://reviews.llvm.org/rL280115
And this should fix
https://llvm.org/bugs/show_bug.cgi?id=30281:
llvm-svn: 280677
Diffstat (limited to 'llvm/test/Transforms/InstCombine')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/icmp-div-constant.ll | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/icmp-div-constant.ll b/llvm/test/Transforms/InstCombine/icmp-div-constant.ll new file mode 100644 index 00000000000..98900ef8113 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/icmp-div-constant.ll @@ -0,0 +1,93 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -instcombine -S | FileCheck %s + +; PR30281 - https://llvm.org/bugs/show_bug.cgi?id=30281 + +; All of these tests contain foldable division-by-constant instructions, but we +; can't assert that those folds have occurred before we process the later icmp. + +define i32 @icmp_div(i16 %a, i16 %c) { +; CHECK-LABEL: @icmp_div( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i16 %a, 0 +; CHECK-NEXT: br i1 [[TOBOOL]], label %then, label %exit +; CHECK: then: +; CHECK-NEXT: [[NOT_CMP:%.*]] = icmp eq i16 %c, 0 +; CHECK-NEXT: [[PHITMP1:%.*]] = sext i1 [[NOT_CMP]] to i32 +; CHECK-NEXT: br label %exit +; CHECK: exit: +; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ -1, %entry ], [ [[PHI:%.*]]tmp1, %then ] +; CHECK-NEXT: ret i32 [[PHI]] +; +entry: + %tobool = icmp eq i16 %a, 0 + br i1 %tobool, label %then, label %exit + +then: + %div = sdiv i16 %c, -1 + %cmp = icmp ne i16 %div, 0 + br label %exit + +exit: + %phi = phi i1 [ false, %entry ], [ %cmp, %then ] + %zext = zext i1 %phi to i32 + %add = add nsw i32 %zext, -1 + ret i32 %add +} + +define i32 @icmp_div2(i16 %a, i16 %c) { +; CHECK-LABEL: @icmp_div2( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i16 %a, 0 +; CHECK-NEXT: br i1 [[TOBOOL]], label %then, label %exit +; CHECK: then: +; CHECK-NEXT: br label %exit +; CHECK: exit: +; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ -1, %entry ], [ 0, %then ] +; CHECK-NEXT: ret i32 [[PHI]] +; +entry: + %tobool = icmp eq i16 %a, 0 + br i1 %tobool, label %then, label %exit + +then: + %div = sdiv i16 %c, 0 + %cmp = icmp ne i16 %div, 0 + br label %exit + +exit: + %phi = phi i1 [ false, %entry ], [ %cmp, %then ] + %zext = zext i1 %phi to i32 + %add = add nsw i32 %zext, -1 + ret i32 %add +} + +define i32 @icmp_div3(i16 %a, i16 %c) { +; CHECK-LABEL: @icmp_div3( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i16 %a, 0 +; CHECK-NEXT: br i1 [[TOBOOL]], label %then, label %exit +; CHECK: then: +; CHECK-NEXT: [[NOT_CMP:%.*]] = icmp eq i16 %c, 0 +; CHECK-NEXT: [[PHITMP1:%.*]] = sext i1 [[NOT_CMP]] to i32 +; CHECK-NEXT: br label %exit +; CHECK: exit: +; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ -1, %entry ], [ [[PHI:%.*]]tmp1, %then ] +; CHECK-NEXT: ret i32 [[PHI]] +; +entry: + %tobool = icmp eq i16 %a, 0 + br i1 %tobool, label %then, label %exit + +then: + %div = sdiv i16 %c, 1 + %cmp = icmp ne i16 %div, 0 + br label %exit + +exit: + %phi = phi i1 [ false, %entry ], [ %cmp, %then ] + %zext = zext i1 %phi to i32 + %add = add nsw i32 %zext, -1 + ret i32 %add +} + |

