summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/InstCombine/icmp-div-constant.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/Transforms/InstCombine/icmp-div-constant.ll')
-rw-r--r--llvm/test/Transforms/InstCombine/icmp-div-constant.ll28
1 files changed, 20 insertions, 8 deletions
diff --git a/llvm/test/Transforms/InstCombine/icmp-div-constant.ll b/llvm/test/Transforms/InstCombine/icmp-div-constant.ll
index a3c24090a47..8028dd636c1 100644
--- a/llvm/test/Transforms/InstCombine/icmp-div-constant.ll
+++ b/llvm/test/Transforms/InstCombine/icmp-div-constant.ll
@@ -3,8 +3,8 @@
define i1 @is_rem2_neg_i8(i8 %x) {
; CHECK-LABEL: @is_rem2_neg_i8(
-; CHECK-NEXT: [[S:%.*]] = srem i8 [[X:%.*]], 2
-; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[S]], 0
+; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], -127
+; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[TMP1]], -127
; CHECK-NEXT: ret i1 [[R]]
;
%s = srem i8 %x, 2
@@ -14,8 +14,8 @@ define i1 @is_rem2_neg_i8(i8 %x) {
define <2 x i1> @is_rem2_pos_v2i8(<2 x i8> %x) {
; CHECK-LABEL: @is_rem2_pos_v2i8(
-; CHECK-NEXT: [[S:%.*]] = srem <2 x i8> [[X:%.*]], <i8 2, i8 2>
-; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i8> [[S]], zeroinitializer
+; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i8> [[X:%.*]], <i8 -127, i8 -127>
+; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[TMP1]], <i8 1, i8 1>
; CHECK-NEXT: ret <2 x i1> [[R]]
;
%s = srem <2 x i8> %x, <i8 2, i8 2>
@@ -23,10 +23,12 @@ define <2 x i1> @is_rem2_pos_v2i8(<2 x i8> %x) {
ret <2 x i1> %r
}
+; i8 -97 == 159 == 0b10011111
+
define i1 @is_rem32_pos_i8(i8 %x) {
; CHECK-LABEL: @is_rem32_pos_i8(
-; CHECK-NEXT: [[S:%.*]] = srem i8 [[X:%.*]], 32
-; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[S]], 0
+; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], -97
+; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[TMP1]], 0
; CHECK-NEXT: ret i1 [[R]]
;
%s = srem i8 %x, 32
@@ -34,10 +36,12 @@ define i1 @is_rem32_pos_i8(i8 %x) {
ret i1 %r
}
+; i16 -32765 == 32771 == 0b1000000000000011
+
define i1 @is_rem4_neg_i16(i16 %x) {
; CHECK-LABEL: @is_rem4_neg_i16(
-; CHECK-NEXT: [[S:%.*]] = srem i16 [[X:%.*]], 4
-; CHECK-NEXT: [[R:%.*]] = icmp slt i16 [[S]], 0
+; CHECK-NEXT: [[TMP1:%.*]] = and i16 [[X:%.*]], -32765
+; CHECK-NEXT: [[R:%.*]] = icmp ugt i16 [[TMP1]], -32768
; CHECK-NEXT: ret i1 [[R]]
;
%s = srem i16 %x, 4
@@ -47,6 +51,8 @@ define i1 @is_rem4_neg_i16(i16 %x) {
declare void @use(i32)
+; TODO: This is still worth folding because srem is difficult?
+
define i1 @is_rem32_neg_i32_extra_use(i32 %x) {
; CHECK-LABEL: @is_rem32_neg_i32_extra_use(
; CHECK-NEXT: [[S:%.*]] = srem i32 [[X:%.*]], 32
@@ -60,6 +66,8 @@ define i1 @is_rem32_neg_i32_extra_use(i32 %x) {
ret i1 %r
}
+; Negative test - wrong compare constant
+
define i1 @is_rem8_nonneg_i16(i16 %x) {
; CHECK-LABEL: @is_rem8_nonneg_i16(
; CHECK-NEXT: [[S:%.*]] = srem i16 [[X:%.*]], 8
@@ -71,6 +79,8 @@ define i1 @is_rem8_nonneg_i16(i16 %x) {
ret i1 %r
}
+; Negative test - wrong remainder constant
+
define i1 @is_rem3_neg_i8(i8 %x) {
; CHECK-LABEL: @is_rem3_neg_i8(
; CHECK-NEXT: [[S:%.*]] = srem i8 [[X:%.*]], 3
@@ -82,6 +92,8 @@ define i1 @is_rem3_neg_i8(i8 %x) {
ret i1 %r
}
+; Negative test - wrong compare constant
+
define i1 @is_rem16_something_i8(i8 %x) {
; CHECK-LABEL: @is_rem16_something_i8(
; CHECK-NEXT: [[S:%.*]] = srem i8 [[X:%.*]], 16
OpenPOWER on IntegriCloud