[llvm] dccddb2 - [InstCombine] add tests for icmp with mul op with known bits; NFC
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Sun Dec 5 06:57:25 PST 2021
Author: Sanjay Patel
Date: 2021-12-05T08:59:27-05:00
New Revision: dccddb268be8363b91157684be743807af746fce
URL: https://github.com/llvm/llvm-project/commit/dccddb268be8363b91157684be743807af746fce
DIFF: https://github.com/llvm/llvm-project/commit/dccddb268be8363b91157684be743807af746fce.diff
LOG: [InstCombine] add tests for icmp with mul op with known bits; NFC
D114962
Added:
Modified:
llvm/test/Transforms/InstCombine/icmp-mul.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/icmp-mul.ll b/llvm/test/Transforms/InstCombine/icmp-mul.ll
index 77f266bc25d5c..785f285322d24 100644
--- a/llvm/test/Transforms/InstCombine/icmp-mul.ll
+++ b/llvm/test/Transforms/InstCombine/icmp-mul.ll
@@ -762,12 +762,102 @@ define i1 @mul_of_bool_no_lz_other_op(i32 %x, i8 %y) {
; CHECK-NEXT: [[B:%.*]] = and i32 [[X:%.*]], 1
; CHECK-NEXT: [[S:%.*]] = sext i8 [[Y:%.*]] to i32
; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[B]], [[S]]
-; CHECK-NEXT: [[R:%.*]] = icmp sgt i32 [[M]], 255
+; CHECK-NEXT: [[R:%.*]] = icmp sgt i32 [[M]], 127
; CHECK-NEXT: ret i1 [[R]]
;
%b = and i32 %x, 1
%s = sext i8 %y to i32
%m = mul nuw nsw i32 %b, %s
- %r = icmp sgt i32 %m, 255
+ %r = icmp sgt i32 %m, 127
+ ret i1 %r
+}
+
+define i1 @mul_of_pow2(i32 %x, i8 %y) {
+; CHECK-LABEL: @mul_of_pow2(
+; CHECK-NEXT: [[B:%.*]] = and i32 [[X:%.*]], 2
+; CHECK-NEXT: [[Z:%.*]] = zext i8 [[Y:%.*]] to i32
+; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[B]], [[Z]]
+; CHECK-NEXT: [[R:%.*]] = icmp ugt i32 [[M]], 510
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %b = and i32 %x, 2
+ %z = zext i8 %y to i32
+ %m = mul i32 %b, %z
+ %r = icmp ugt i32 %m, 510
+ ret i1 %r
+}
+
+define i1 @mul_of_pow2_commute(i32 %x, i32 %y) {
+; CHECK-LABEL: @mul_of_pow2_commute(
+; CHECK-NEXT: [[X4:%.*]] = and i32 [[X:%.*]], 4
+; CHECK-NEXT: [[Y8:%.*]] = and i32 [[Y:%.*]], 255
+; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[Y8]], [[X4]]
+; CHECK-NEXT: [[R:%.*]] = icmp ugt i32 [[M]], 1020
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %x4 = and i32 %x, 4
+ %y8 = and i32 %y, 255
+ %m = mul i32 %y8, %x4
+ %r = icmp ugt i32 %m, 1020
+ ret i1 %r
+}
+
+define i32 @mul_of_pow2s(i32 %x, i32 %y) {
+; CHECK-LABEL: @mul_of_pow2s(
+; CHECK-NEXT: [[X8:%.*]] = and i32 [[X:%.*]], 8
+; CHECK-NEXT: [[Y16:%.*]] = and i32 [[Y:%.*]], 16
+; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[X8]], [[Y16]]
+; CHECK-NEXT: [[BIT7:%.*]] = or i32 [[M]], 128
+; CHECK-NEXT: ret i32 [[BIT7]]
+;
+ %x8 = and i32 %x, 8
+ %y16 = and i32 %y, 16
+ %m = mul i32 %x8, %y16
+ %bit7 = or i32 %m, 128
+ ret i32 %bit7
+}
+
+define i1 @not_mul_of_pow2(i32 %x, i8 %y) {
+; CHECK-LABEL: @not_mul_of_pow2(
+; CHECK-NEXT: [[Q:%.*]] = and i32 [[X:%.*]], 6
+; CHECK-NEXT: [[Z:%.*]] = zext i8 [[Y:%.*]] to i32
+; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[Q]], [[Z]]
+; CHECK-NEXT: [[R:%.*]] = icmp ugt i32 [[M]], 1530
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %q = and i32 %x, 6
+ %z = zext i8 %y to i32
+ %m = mul i32 %q, %z
+ %r = icmp ugt i32 %m, 1530
+ ret i1 %r
+}
+
+define i1 @not_mul_of_pow2_commute(i32 %x, i32 %y) {
+; CHECK-LABEL: @not_mul_of_pow2_commute(
+; CHECK-NEXT: [[X30:%.*]] = and i32 [[X:%.*]], 12
+; CHECK-NEXT: [[Y8:%.*]] = and i32 [[Y:%.*]], 255
+; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[Y8]], [[X30]]
+; CHECK-NEXT: [[R:%.*]] = icmp ugt i32 [[M]], 3060
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %x30 = and i32 %x, 12
+ %y8 = and i32 %y, 255
+ %m = mul i32 %y8, %x30
+ %r = icmp ugt i32 %m, 3060
+ ret i1 %r
+}
+
+define i1 @mul_of_pow2_no_lz_other_op(i32 %x, i8 %y) {
+; CHECK-LABEL: @mul_of_pow2_no_lz_other_op(
+; CHECK-NEXT: [[B:%.*]] = and i32 [[X:%.*]], 2
+; CHECK-NEXT: [[S:%.*]] = sext i8 [[Y:%.*]] to i32
+; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[B]], [[S]]
+; CHECK-NEXT: [[R:%.*]] = icmp sgt i32 [[M]], 254
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %b = and i32 %x, 2
+ %s = sext i8 %y to i32
+ %m = mul nuw nsw i32 %b, %s
+ %r = icmp sgt i32 %m, 254
ret i1 %r
}
More information about the llvm-commits
mailing list