diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-10-21 19:51:55 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-10-21 19:51:55 +0000 |
commit | d205602a0b05bd2c28c03117ae5054c34dc8c4f8 (patch) | |
tree | 869250b7dd60bf6bfacee983d0e59d0ce2d5b644 /llvm/test/Transforms | |
parent | 9d35e2e70e163d93a1e3da691de6ad9ec22288e6 (diff) | |
download | bcm5719-llvm-d205602a0b05bd2c28c03117ae5054c34dc8c4f8.tar.gz bcm5719-llvm-d205602a0b05bd2c28c03117ae5054c34dc8c4f8.zip |
InstCombine: Simplify FoldICmpCstShrCst
This function was complicated by the fact that it tried to perform
canonicalizations that were already preformed by InstSimplify. Remove
this extra code and move the tests over to InstSimplify. Add asserts to
make sure our preconditions hold before we make any assumptions.
llvm-svn: 220314
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r-- | llvm/test/Transforms/InstCombine/icmp-shr.ll | 320 | ||||
-rw-r--r-- | llvm/test/Transforms/InstSimplify/ashr-nop.ll | 10 | ||||
-rw-r--r-- | llvm/test/Transforms/InstSimplify/shr-nop.ll | 332 |
3 files changed, 332 insertions, 330 deletions
diff --git a/llvm/test/Transforms/InstCombine/icmp-shr.ll b/llvm/test/Transforms/InstCombine/icmp-shr.ll index 7562f24a35d..52414b99cca 100644 --- a/llvm/test/Transforms/InstCombine/icmp-shr.ll +++ b/llvm/test/Transforms/InstCombine/icmp-shr.ll @@ -2,134 +2,6 @@ target datalayout = "e-p:64:64:64-p1:16:16:16-p2:32:32:32-p3:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" -; CHECK-LABEL: @exact_lshr_eq_both_zero -; CHECK-NEXT: ret i1 true -define i1 @exact_lshr_eq_both_zero(i8 %a) { - %shr = lshr exact i8 0, %a - %cmp = icmp eq i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_ashr_eq_both_zero -; CHECK-NEXT: ret i1 true -define i1 @exact_ashr_eq_both_zero(i8 %a) { - %shr = ashr exact i8 0, %a - %cmp = icmp eq i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_lshr_eq_both_zero -; CHECK-NEXT: ret i1 true -define i1 @nonexact_lshr_eq_both_zero(i8 %a) { - %shr = lshr i8 0, %a - %cmp = icmp eq i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_ashr_eq_both_zero -; CHECK-NEXT: ret i1 true -define i1 @nonexact_ashr_eq_both_zero(i8 %a) { - %shr = ashr i8 0, %a - %cmp = icmp eq i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_lshr_ne_both_zero -; CHECK-NEXT: ret i1 false -define i1 @exact_lshr_ne_both_zero(i8 %a) { - %shr = lshr exact i8 0, %a - %cmp = icmp ne i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_ashr_ne_both_zero -; CHECK-NEXT: ret i1 false -define i1 @exact_ashr_ne_both_zero(i8 %a) { - %shr = ashr exact i8 0, %a - %cmp = icmp ne i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_lshr_ne_both_zero -; CHECK-NEXT: ret i1 false -define i1 @nonexact_lshr_ne_both_zero(i8 %a) { - %shr = lshr i8 0, %a - %cmp = icmp ne i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_ashr_ne_both_zero -; CHECK-NEXT: ret i1 false -define i1 @nonexact_ashr_ne_both_zero(i8 %a) { - %shr = ashr i8 0, %a - %cmp = icmp ne i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_lshr_eq_last_zero -; CHECK-NEXT: ret i1 false -define i1 @exact_lshr_eq_last_zero(i8 %a) { - %shr = lshr exact i8 128, %a - %cmp = icmp eq i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_ashr_eq_last_zero -; CHECK-NEXT: ret i1 false -define i1 @exact_ashr_eq_last_zero(i8 %a) { - %shr = ashr exact i8 -128, %a - %cmp = icmp eq i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_lshr_ne_last_zero -; CHECK-NEXT: ret i1 true -define i1 @exact_lshr_ne_last_zero(i8 %a) { - %shr = lshr exact i8 128, %a - %cmp = icmp ne i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_ashr_ne_last_zero -; CHECK-NEXT: ret i1 true -define i1 @exact_ashr_ne_last_zero(i8 %a) { - %shr = ashr exact i8 -128, %a - %cmp = icmp ne i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_lshr_eq_last_zero -; CHECK-NEXT: ret i1 false -define i1 @nonexact_lshr_eq_last_zero(i8 %a) { - %shr = lshr i8 128, %a - %cmp = icmp eq i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_ashr_eq_last_zero -; CHECK-NEXT: ret i1 false -define i1 @nonexact_ashr_eq_last_zero(i8 %a) { - %shr = ashr i8 -128, %a - %cmp = icmp eq i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_lshr_ne_last_zero -; CHECK-NEXT: ret i1 true -define i1 @nonexact_lshr_ne_last_zero(i8 %a) { - %shr = lshr i8 128, %a - %cmp = icmp ne i8 %shr, 0 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_ashr_ne_last_zero -; CHECK-NEXT: ret i1 true -define i1 @nonexact_ashr_ne_last_zero(i8 %a) { - %shr = ashr i8 -128, %a - %cmp = icmp ne i8 %shr, 0 - ret i1 %cmp -} - ; CHECK-LABEL: @lshr_eq_msb_low_last_zero ; CHECK-NEXT: icmp ugt i8 %a, 6 define i1 @lshr_eq_msb_low_last_zero(i8 %a) { @@ -162,70 +34,6 @@ define i1 @ashr_ne_msb_low_second_zero(i8 %a) { ret i1 %cmp } -; CHECK-LABEL: @lshr_eq_first_zero -; CHECK-NEXT: ret i1 false -define i1 @lshr_eq_first_zero(i8 %a) { - %shr = lshr i8 0, %a - %cmp = icmp eq i8 %shr, 2 - ret i1 %cmp -} - -; CHECK-LABEL: @ashr_eq_first_zero -; CHECK-NEXT: ret i1 false -define i1 @ashr_eq_first_zero(i8 %a) { - %shr = ashr i8 0, %a - %cmp = icmp eq i8 %shr, 2 - ret i1 %cmp -} - -; CHECK-LABEL: @lshr_ne_first_zero -; CHECK-NEXT: ret i1 true -define i1 @lshr_ne_first_zero(i8 %a) { - %shr = lshr i8 0, %a - %cmp = icmp ne i8 %shr, 2 - ret i1 %cmp -} - -; CHECK-LABEL: @ashr_ne_first_zero -; CHECK-NEXT: ret i1 true -define i1 @ashr_ne_first_zero(i8 %a) { - %shr = ashr i8 0, %a - %cmp = icmp ne i8 %shr, 2 - ret i1 %cmp -} - -; CHECK-LABEL: @ashr_eq_both_minus1 -; CHECK-NEXT: ret i1 true -define i1 @ashr_eq_both_minus1(i8 %a) { - %shr = ashr i8 -1, %a - %cmp = icmp eq i8 %shr, -1 - ret i1 %cmp -} - -; CHECK-LABEL: @ashr_ne_both_minus1 -; CHECK-NEXT: ret i1 false -define i1 @ashr_ne_both_minus1(i8 %a) { - %shr = ashr i8 -1, %a - %cmp = icmp ne i8 %shr, -1 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_ashr_eq_both_minus1 -; CHECK-NEXT: ret i1 true -define i1 @exact_ashr_eq_both_minus1(i8 %a) { - %shr = ashr exact i8 -1, %a - %cmp = icmp eq i8 %shr, -1 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_ashr_ne_both_minus1 -; CHECK-NEXT: ret i1 false -define i1 @exact_ashr_ne_both_minus1(i8 %a) { - %shr = ashr exact i8 -1, %a - %cmp = icmp ne i8 %shr, -1 - ret i1 %cmp -} - ; CHECK-LABEL: @ashr_eq_both_equal ; CHECK-NEXT: icmp eq i8 %a, 0 define i1 @ashr_eq_both_equal(i8 %a) { @@ -290,22 +98,6 @@ define i1 @exact_lshr_ne_both_equal(i8 %a) { ret i1 %cmp } -; CHECK-LABEL: @exact_ashr_eq_opposite_msb -; CHECK-NEXT: ret i1 false -define i1 @exact_ashr_eq_opposite_msb(i8 %a) { - %shr = ashr exact i8 -128, %a - %cmp = icmp eq i8 %shr, 1 - ret i1 %cmp -} - -; CHECK-LABEL: @ashr_eq_opposite_msb -; CHECK-NEXT: ret i1 false -define i1 @ashr_eq_opposite_msb(i8 %a) { - %shr = ashr i8 -128, %a - %cmp = icmp eq i8 %shr, 1 - ret i1 %cmp -} - ; CHECK-LABEL: @exact_lshr_eq_opposite_msb ; CHECK-NEXT: icmp eq i8 %a, 7 define i1 @exact_lshr_eq_opposite_msb(i8 %a) { @@ -322,22 +114,6 @@ define i1 @lshr_eq_opposite_msb(i8 %a) { ret i1 %cmp } -; CHECK-LABEL: @exact_ashr_ne_opposite_msb -; CHECK-NEXT: ret i1 true -define i1 @exact_ashr_ne_opposite_msb(i8 %a) { - %shr = ashr exact i8 -128, %a - %cmp = icmp ne i8 %shr, 1 - ret i1 %cmp -} - -; CHECK-LABEL: @ashr_ne_opposite_msb -; CHECK-NEXT: ret i1 true -define i1 @ashr_ne_opposite_msb(i8 %a) { - %shr = ashr i8 -128, %a - %cmp = icmp ne i8 %shr, 1 - ret i1 %cmp -} - ; CHECK-LABEL: @exact_lshr_ne_opposite_msb ; CHECK-NEXT: icmp ne i8 %a, 7 define i1 @exact_lshr_ne_opposite_msb(i8 %a) { @@ -354,70 +130,6 @@ define i1 @lshr_ne_opposite_msb(i8 %a) { ret i1 %cmp } -; CHECK-LABEL: @exact_ashr_eq_shift_gt -; CHECK-NEXT : ret i1 false -define i1 @exact_ashr_eq_shift_gt(i8 %a) { - %shr = ashr exact i8 -2, %a - %cmp = icmp eq i8 %shr, -8 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_ashr_ne_shift_gt -; CHECK-NEXT : ret i1 true -define i1 @exact_ashr_ne_shift_gt(i8 %a) { - %shr = ashr exact i8 -2, %a - %cmp = icmp ne i8 %shr, -8 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_ashr_eq_shift_gt -; CHECK-NEXT : ret i1 false -define i1 @nonexact_ashr_eq_shift_gt(i8 %a) { - %shr = ashr i8 -2, %a - %cmp = icmp eq i8 %shr, -8 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_ashr_ne_shift_gt -; CHECK-NEXT : ret i1 true -define i1 @nonexact_ashr_ne_shift_gt(i8 %a) { - %shr = ashr i8 -2, %a - %cmp = icmp ne i8 %shr, -8 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_lshr_eq_shift_gt -; CHECK-NEXT: ret i1 false -define i1 @exact_lshr_eq_shift_gt(i8 %a) { - %shr = lshr exact i8 2, %a - %cmp = icmp eq i8 %shr, 8 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_lshr_ne_shift_gt -; CHECK-NEXT: ret i1 true -define i1 @exact_lshr_ne_shift_gt(i8 %a) { - %shr = lshr exact i8 2, %a - %cmp = icmp ne i8 %shr, 8 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_lshr_eq_shift_gt -; CHECK-NEXT : ret i1 false -define i1 @nonexact_lshr_eq_shift_gt(i8 %a) { - %shr = lshr i8 2, %a - %cmp = icmp eq i8 %shr, 8 - ret i1 %cmp -} - -; CHECK-LABEL: @nonexact_lshr_ne_shift_gt -; CHECK-NEXT : ret i1 true -define i1 @nonexact_lshr_ne_shift_gt(i8 %a) { - %shr = ashr i8 2, %a - %cmp = icmp ne i8 %shr, 8 - ret i1 %cmp -} - ; CHECK-LABEL: @exact_ashr_eq ; CHECK-NEXT: icmp eq i8 %a, 7 define i1 @exact_ashr_eq(i8 %a) { @@ -610,22 +322,6 @@ define i1 @nonexact_ashr_ne_noexactdiv(i8 %a) { ret i1 %cmp } -; CHECK-LABEL: @exact_lshr_eq_noexactlog -; CHECK-NEXT: ret i1 false -define i1 @exact_lshr_eq_noexactlog(i8 %a) { - %shr = lshr exact i8 90, %a - %cmp = icmp eq i8 %shr, 30 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_lshr_ne_noexactlog -; CHECK-NEXT: ret i1 true -define i1 @exact_lshr_ne_noexactlog(i8 %a) { - %shr = lshr exact i8 90, %a - %cmp = icmp ne i8 %shr, 30 - ret i1 %cmp -} - ; CHECK-LABEL: @nonexact_lshr_eq_noexactlog ; CHECK-NEXT: ret i1 false define i1 @nonexact_lshr_eq_noexactlog(i8 %a) { @@ -642,22 +338,6 @@ define i1 @nonexact_lshr_ne_noexactlog(i8 %a) { ret i1 %cmp } -; CHECK-LABEL: @exact_ashr_eq_noexactlog -; CHECK-NEXT: ret i1 false -define i1 @exact_ashr_eq_noexactlog(i8 %a) { - %shr = ashr exact i8 -90, %a - %cmp = icmp eq i8 %shr, -30 - ret i1 %cmp -} - -; CHECK-LABEL: @exact_ashr_ne_noexactlog -; CHECK-NEXT: ret i1 true -define i1 @exact_ashr_ne_noexactlog(i8 %a) { - %shr = ashr exact i8 -90, %a - %cmp = icmp ne i8 %shr, -30 - ret i1 %cmp -} - ; CHECK-LABEL: @nonexact_ashr_eq_noexactlog ; CHECK-NEXT: ret i1 false define i1 @nonexact_ashr_eq_noexactlog(i8 %a) { diff --git a/llvm/test/Transforms/InstSimplify/ashr-nop.ll b/llvm/test/Transforms/InstSimplify/ashr-nop.ll deleted file mode 100644 index 0914d725e40..00000000000 --- a/llvm/test/Transforms/InstSimplify/ashr-nop.ll +++ /dev/null @@ -1,10 +0,0 @@ -; RUN: opt < %s -instsimplify -S | FileCheck %s - -; CHECK-LABEL: @foo -; CHECK-NOT: ashr -define i32 @foo(i32 %x) { - %o = and i32 %x, 1 - %n = add i32 %o, -1 - %t = ashr i32 %n, 17 - ret i32 %t -} diff --git a/llvm/test/Transforms/InstSimplify/shr-nop.ll b/llvm/test/Transforms/InstSimplify/shr-nop.ll new file mode 100644 index 00000000000..86917ad8fba --- /dev/null +++ b/llvm/test/Transforms/InstSimplify/shr-nop.ll @@ -0,0 +1,332 @@ +; RUN: opt < %s -instsimplify -S | FileCheck %s + +; CHECK-LABEL: @foo +; CHECK: %[[and:.*]] = and i32 %x, 1 +; CHECK-NEXT: %[[add:.*]] = add i32 %[[and]], -1 +; CHECK-NEXT: ret i32 %[[add]] +define i32 @foo(i32 %x) { + %o = and i32 %x, 1 + %n = add i32 %o, -1 + %t = ashr i32 %n, 17 + ret i32 %t +} + +; CHECK-LABEL: @exact_lshr_eq_both_zero +; CHECK-NEXT: ret i1 true +define i1 @exact_lshr_eq_both_zero(i8 %a) { + %shr = lshr exact i8 0, %a + %cmp = icmp eq i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_eq_both_zero +; CHECK-NEXT: ret i1 true +define i1 @exact_ashr_eq_both_zero(i8 %a) { + %shr = ashr exact i8 0, %a + %cmp = icmp eq i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_ashr_eq_both_zero +; CHECK-NEXT: ret i1 true +define i1 @nonexact_ashr_eq_both_zero(i8 %a) { + %shr = ashr i8 0, %a + %cmp = icmp eq i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_lshr_ne_both_zero +; CHECK-NEXT: ret i1 false +define i1 @exact_lshr_ne_both_zero(i8 %a) { + %shr = lshr exact i8 0, %a + %cmp = icmp ne i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_ne_both_zero +; CHECK-NEXT: ret i1 false +define i1 @exact_ashr_ne_both_zero(i8 %a) { + %shr = ashr exact i8 0, %a + %cmp = icmp ne i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_lshr_ne_both_zero +; CHECK-NEXT: ret i1 false +define i1 @nonexact_lshr_ne_both_zero(i8 %a) { + %shr = lshr i8 0, %a + %cmp = icmp ne i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_ashr_ne_both_zero +; CHECK-NEXT: ret i1 false +define i1 @nonexact_ashr_ne_both_zero(i8 %a) { + %shr = ashr i8 0, %a + %cmp = icmp ne i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_lshr_eq_last_zero +; CHECK-NEXT: ret i1 false +define i1 @exact_lshr_eq_last_zero(i8 %a) { + %shr = lshr exact i8 128, %a + %cmp = icmp eq i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_eq_last_zero +; CHECK-NEXT: ret i1 false +define i1 @exact_ashr_eq_last_zero(i8 %a) { + %shr = ashr exact i8 -128, %a + %cmp = icmp eq i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_lshr_eq_both_zero +; CHECK-NEXT: ret i1 true +define i1 @nonexact_lshr_eq_both_zero(i8 %a) { + %shr = lshr i8 0, %a + %cmp = icmp eq i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_lshr_ne_last_zero +; CHECK-NEXT: ret i1 true +define i1 @exact_lshr_ne_last_zero(i8 %a) { + %shr = lshr exact i8 128, %a + %cmp = icmp ne i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_ne_last_zero +; CHECK-NEXT: ret i1 true +define i1 @exact_ashr_ne_last_zero(i8 %a) { + %shr = ashr exact i8 -128, %a + %cmp = icmp ne i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_lshr_eq_last_zero +; CHECK-NEXT: ret i1 false +define i1 @nonexact_lshr_eq_last_zero(i8 %a) { + %shr = lshr i8 128, %a + %cmp = icmp eq i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_ashr_eq_last_zero +; CHECK-NEXT: ret i1 false +define i1 @nonexact_ashr_eq_last_zero(i8 %a) { + %shr = ashr i8 -128, %a + %cmp = icmp eq i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_lshr_ne_last_zero +; CHECK-NEXT: ret i1 true +define i1 @nonexact_lshr_ne_last_zero(i8 %a) { + %shr = lshr i8 128, %a + %cmp = icmp ne i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_ashr_ne_last_zero +; CHECK-NEXT: ret i1 true +define i1 @nonexact_ashr_ne_last_zero(i8 %a) { + %shr = ashr i8 -128, %a + %cmp = icmp ne i8 %shr, 0 + ret i1 %cmp +} + +; CHECK-LABEL: @lshr_eq_first_zero +; CHECK-NEXT: ret i1 false +define i1 @lshr_eq_first_zero(i8 %a) { + %shr = lshr i8 0, %a + %cmp = icmp eq i8 %shr, 2 + ret i1 %cmp +} + +; CHECK-LABEL: @ashr_eq_first_zero +; CHECK-NEXT: ret i1 false +define i1 @ashr_eq_first_zero(i8 %a) { + %shr = ashr i8 0, %a + %cmp = icmp eq i8 %shr, 2 + ret i1 %cmp +} + +; CHECK-LABEL: @lshr_ne_first_zero +; CHECK-NEXT: ret i1 true +define i1 @lshr_ne_first_zero(i8 %a) { + %shr = lshr i8 0, %a + %cmp = icmp ne i8 %shr, 2 + ret i1 %cmp +} + +; CHECK-LABEL: @ashr_ne_first_zero +; CHECK-NEXT: ret i1 true +define i1 @ashr_ne_first_zero(i8 %a) { + %shr = ashr i8 0, %a + %cmp = icmp ne i8 %shr, 2 + ret i1 %cmp +} + +; CHECK-LABEL: @ashr_eq_both_minus1 +; CHECK-NEXT: ret i1 true +define i1 @ashr_eq_both_minus1(i8 %a) { + %shr = ashr i8 -1, %a + %cmp = icmp eq i8 %shr, -1 + ret i1 %cmp +} + +; CHECK-LABEL: @ashr_ne_both_minus1 +; CHECK-NEXT: ret i1 false +define i1 @ashr_ne_both_minus1(i8 %a) { + %shr = ashr i8 -1, %a + %cmp = icmp ne i8 %shr, -1 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_eq_both_minus1 +; CHECK-NEXT: ret i1 true +define i1 @exact_ashr_eq_both_minus1(i8 %a) { + %shr = ashr exact i8 -1, %a + %cmp = icmp eq i8 %shr, -1 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_ne_both_minus1 +; CHECK-NEXT: ret i1 false +define i1 @exact_ashr_ne_both_minus1(i8 %a) { + %shr = ashr exact i8 -1, %a + %cmp = icmp ne i8 %shr, -1 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_eq_opposite_msb +; CHECK-NEXT: ret i1 false +define i1 @exact_ashr_eq_opposite_msb(i8 %a) { + %shr = ashr exact i8 -128, %a + %cmp = icmp eq i8 %shr, 1 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_eq_noexactlog +; CHECK-NEXT: ret i1 false +define i1 @exact_ashr_eq_noexactlog(i8 %a) { + %shr = ashr exact i8 -90, %a + %cmp = icmp eq i8 %shr, -30 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_ne_opposite_msb +; CHECK-NEXT: ret i1 true +define i1 @exact_ashr_ne_opposite_msb(i8 %a) { + %shr = ashr exact i8 -128, %a + %cmp = icmp ne i8 %shr, 1 + ret i1 %cmp +} + +; CHECK-LABEL: @ashr_eq_opposite_msb +; CHECK-NEXT: ret i1 false +define i1 @ashr_eq_opposite_msb(i8 %a) { + %shr = ashr i8 -128, %a + %cmp = icmp eq i8 %shr, 1 + ret i1 %cmp +} + +; CHECK-LABEL: @ashr_ne_opposite_msb +; CHECK-NEXT: ret i1 true +define i1 @ashr_ne_opposite_msb(i8 %a) { + %shr = ashr i8 -128, %a + %cmp = icmp ne i8 %shr, 1 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_eq_shift_gt +; CHECK-NEXT : ret i1 false +define i1 @exact_ashr_eq_shift_gt(i8 %a) { + %shr = ashr exact i8 -2, %a + %cmp = icmp eq i8 %shr, -8 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_ne_shift_gt +; CHECK-NEXT : ret i1 true +define i1 @exact_ashr_ne_shift_gt(i8 %a) { + %shr = ashr exact i8 -2, %a + %cmp = icmp ne i8 %shr, -8 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_ashr_eq_shift_gt +; CHECK-NEXT : ret i1 false +define i1 @nonexact_ashr_eq_shift_gt(i8 %a) { + %shr = ashr i8 -2, %a + %cmp = icmp eq i8 %shr, -8 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_ashr_ne_shift_gt +; CHECK-NEXT : ret i1 true +define i1 @nonexact_ashr_ne_shift_gt(i8 %a) { + %shr = ashr i8 -2, %a + %cmp = icmp ne i8 %shr, -8 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_lshr_eq_shift_gt +; CHECK-NEXT: ret i1 false +define i1 @exact_lshr_eq_shift_gt(i8 %a) { + %shr = lshr exact i8 2, %a + %cmp = icmp eq i8 %shr, 8 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_lshr_ne_shift_gt +; CHECK-NEXT: ret i1 true +define i1 @exact_lshr_ne_shift_gt(i8 %a) { + %shr = lshr exact i8 2, %a + %cmp = icmp ne i8 %shr, 8 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_lshr_eq_shift_gt +; CHECK-NEXT : ret i1 false +define i1 @nonexact_lshr_eq_shift_gt(i8 %a) { + %shr = lshr i8 2, %a + %cmp = icmp eq i8 %shr, 8 + ret i1 %cmp +} + +; CHECK-LABEL: @nonexact_lshr_ne_shift_gt +; CHECK-NEXT : ret i1 true +define i1 @nonexact_lshr_ne_shift_gt(i8 %a) { + %shr = ashr i8 2, %a + %cmp = icmp ne i8 %shr, 8 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_ashr_ne_noexactlog +; CHECK-NEXT: ret i1 true +define i1 @exact_ashr_ne_noexactlog(i8 %a) { + %shr = ashr exact i8 -90, %a + %cmp = icmp ne i8 %shr, -30 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_lshr_eq_noexactlog +; CHECK-NEXT: ret i1 false +define i1 @exact_lshr_eq_noexactlog(i8 %a) { + %shr = lshr exact i8 90, %a + %cmp = icmp eq i8 %shr, 30 + ret i1 %cmp +} + +; CHECK-LABEL: @exact_lshr_ne_noexactlog +; CHECK-NEXT: ret i1 true +define i1 @exact_lshr_ne_noexactlog(i8 %a) { + %shr = lshr exact i8 90, %a + %cmp = icmp ne i8 %shr, 30 + ret i1 %cmp +} |