[llvm] 3a295f0 - [InstCombine] add tests for masked/casted icmp; NFC
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 23 15:25:31 PST 2023
Author: Sanjay Patel
Date: 2023-01-23T18:23:43-05:00
New Revision: 3a295f03359f87a3e401dce72b43a0c9c93a20c4
URL: https://github.com/llvm/llvm-project/commit/3a295f03359f87a3e401dce72b43a0c9c93a20c4
DIFF: https://github.com/llvm/llvm-project/commit/3a295f03359f87a3e401dce72b43a0c9c93a20c4.diff
LOG: [InstCombine] add tests for masked/casted icmp; NFC
Added:
Modified:
llvm/test/Transforms/InstCombine/icmp.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/icmp.ll b/llvm/test/Transforms/InstCombine/icmp.ll
index 4039b9a3f660..411383e9168b 100644
--- a/llvm/test/Transforms/InstCombine/icmp.ll
+++ b/llvm/test/Transforms/InstCombine/icmp.ll
@@ -5,6 +5,10 @@ target datalayout = "e-p:64:64:64-p1:16:16:16-p2:32:32:32-p3:64:64:64-i1:8:8-i8:
declare i8 @llvm.abs.i8(i8, i1)
+declare void @use_i1(i1)
+declare void @use_i32(i32)
+declare void @use_i64(i64)
+
define i32 @test1(i32 %X) {
; CHECK-LABEL: @test1(
; CHECK-NEXT: [[X_LOBIT:%.*]] = lshr i32 [[X:%.*]], 31
@@ -528,16 +532,16 @@ define i1 @test27(i32 %x, i32 %y, i32 %z) {
define i1 @test27_extra_uses(i32 %x, i32 %y, i32 %z) {
; CHECK-LABEL: @test27_extra_uses(
; CHECK-NEXT: [[LHS:%.*]] = sub nsw i32 [[X:%.*]], [[Z:%.*]]
-; CHECK-NEXT: call void @foo(i32 [[LHS]])
+; CHECK-NEXT: call void @use_i32(i32 [[LHS]])
; CHECK-NEXT: [[RHS:%.*]] = sub nsw i32 [[Y:%.*]], [[Z]]
-; CHECK-NEXT: call void @foo(i32 [[RHS]])
+; CHECK-NEXT: call void @use_i32(i32 [[RHS]])
; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[X]], [[Y]]
; CHECK-NEXT: ret i1 [[C]]
;
%lhs = sub nsw i32 %x, %z
- call void @foo(i32 %lhs)
+ call void @use_i32(i32 %lhs)
%rhs = sub nsw i32 %y, %z
- call void @foo(i32 %rhs)
+ call void @use_i32(i32 %rhs)
%c = icmp sgt i32 %lhs, %rhs
ret i1 %c
}
@@ -557,16 +561,16 @@ define i1 @test28(i32 %x, i32 %y, i32 %z) {
define i1 @test28_extra_uses(i32 %x, i32 %y, i32 %z) {
; CHECK-LABEL: @test28_extra_uses(
; CHECK-NEXT: [[LHS:%.*]] = sub nuw i32 [[X:%.*]], [[Z:%.*]]
-; CHECK-NEXT: call void @foo(i32 [[LHS]])
+; CHECK-NEXT: call void @use_i32(i32 [[LHS]])
; CHECK-NEXT: [[RHS:%.*]] = sub nuw i32 [[Y:%.*]], [[Z]]
-; CHECK-NEXT: call void @foo(i32 [[RHS]])
+; CHECK-NEXT: call void @use_i32(i32 [[RHS]])
; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[X]], [[Y]]
; CHECK-NEXT: ret i1 [[C]]
;
%lhs = sub nuw i32 %x, %z
- call void @foo(i32 %lhs)
+ call void @use_i32(i32 %lhs)
%rhs = sub nuw i32 %y, %z
- call void @foo(i32 %rhs)
+ call void @use_i32(i32 %rhs)
%c = icmp ugt i32 %lhs, %rhs
ret i1 %c
}
@@ -657,16 +661,16 @@ define i1 @test37(i32 %x, i32 %y, i32 %z) {
define i1 @test37_extra_uses(i32 %x, i32 %y, i32 %z) {
; CHECK-LABEL: @test37_extra_uses(
; CHECK-NEXT: [[LHS:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: call void @foo(i32 [[LHS]])
+; CHECK-NEXT: call void @use_i32(i32 [[LHS]])
; CHECK-NEXT: [[RHS:%.*]] = sub nsw i32 [[X]], [[Z:%.*]]
-; CHECK-NEXT: call void @foo(i32 [[RHS]])
+; CHECK-NEXT: call void @use_i32(i32 [[RHS]])
; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[Z]], [[Y]]
; CHECK-NEXT: ret i1 [[C]]
;
%lhs = sub nsw i32 %x, %y
- call void @foo(i32 %lhs)
+ call void @use_i32(i32 %lhs)
%rhs = sub nsw i32 %x, %z
- call void @foo(i32 %rhs)
+ call void @use_i32(i32 %rhs)
%c = icmp sgt i32 %lhs, %rhs
ret i1 %c
}
@@ -714,16 +718,16 @@ define i1 @test38(i32 %x, i32 %y, i32 %z) {
define i1 @test38_extra_uses(i32 %x, i32 %y, i32 %z) {
; CHECK-LABEL: @test38_extra_uses(
; CHECK-NEXT: [[LHS:%.*]] = sub nuw i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: call void @foo(i32 [[LHS]])
+; CHECK-NEXT: call void @use_i32(i32 [[LHS]])
; CHECK-NEXT: [[RHS:%.*]] = sub nuw i32 [[X]], [[Z:%.*]]
-; CHECK-NEXT: call void @foo(i32 [[RHS]])
+; CHECK-NEXT: call void @use_i32(i32 [[RHS]])
; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[Z]], [[Y]]
; CHECK-NEXT: ret i1 [[C]]
;
%lhs = sub nuw i32 %x, %y
- call void @foo(i32 %lhs)
+ call void @use_i32(i32 %lhs)
%rhs = sub nuw i32 %x, %z
- call void @foo(i32 %rhs)
+ call void @use_i32(i32 %rhs)
%c = icmp ugt i32 %lhs, %rhs
ret i1 %c
}
@@ -1016,17 +1020,16 @@ define <2 x i1> @test56vec(<2 x i32> %a) {
}
; PR10267 Don't make icmps more expensive when no other inst is subsumed.
-declare void @foo(i32)
define i1 @test57(i32 %a) {
; CHECK-LABEL: @test57(
; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], -2
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0
-; CHECK-NEXT: call void @foo(i32 [[AND]])
+; CHECK-NEXT: call void @use_i32(i32 [[AND]])
; CHECK-NEXT: ret i1 [[CMP]]
;
%and = and i32 %a, -2
%cmp = icmp ne i32 %and, 0
- call void @foo(i32 %and)
+ call void @use_i32(i32 %and)
ret i1 %cmp
}
@@ -1137,6 +1140,66 @@ define i1 @low_mask_eq_zext_commute(i8 %a, i32 %b) {
ret i1 %c
}
+define i1 @low_mask_eq_zext_use1(i8 %a, i32 %b) {
+; CHECK-LABEL: @low_mask_eq_zext_use1(
+; CHECK-NEXT: [[T:%.*]] = and i32 [[B:%.*]], 255
+; CHECK-NEXT: call void @use_i32(i32 [[T]])
+; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[B]] to i8
+; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[TMP1]], [[A:%.*]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %t = and i32 %b, 255
+ call void @use_i32(i32 %t)
+ %z = zext i8 %a to i32
+ %c = icmp eq i32 %t, %z
+ ret i1 %c
+}
+
+define i1 @low_mask_eq_zext_use2(i8 %a, i32 %b) {
+; CHECK-LABEL: @low_mask_eq_zext_use2(
+; CHECK-NEXT: [[T:%.*]] = and i32 [[B:%.*]], 255
+; CHECK-NEXT: [[Z:%.*]] = zext i8 [[A:%.*]] to i32
+; CHECK-NEXT: call void @use_i32(i32 [[Z]])
+; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[T]], [[Z]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %t = and i32 %b, 255
+ %z = zext i8 %a to i32
+ call void @use_i32(i32 %z)
+ %c = icmp eq i32 %t, %z
+ ret i1 %c
+}
+
+define i1 @low_mask_eq_zext_use3(i8 %a, i32 %b) {
+; CHECK-LABEL: @low_mask_eq_zext_use3(
+; CHECK-NEXT: [[T:%.*]] = and i32 [[B:%.*]], 255
+; CHECK-NEXT: call void @use_i32(i32 [[T]])
+; CHECK-NEXT: [[Z:%.*]] = zext i8 [[A:%.*]] to i32
+; CHECK-NEXT: call void @use_i32(i32 [[Z]])
+; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[T]], [[Z]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %t = and i32 %b, 255
+ call void @use_i32(i32 %t)
+ %z = zext i8 %a to i32
+ call void @use_i32(i32 %z)
+ %c = icmp eq i32 %t, %z
+ ret i1 %c
+}
+
+define <2 x i1> @low_mask_eq_zext_vec_splat(<2 x i8> %a, <2 x i32> %b) {
+; CHECK-LABEL: @low_mask_eq_zext_vec_splat(
+; CHECK-NEXT: [[T:%.*]] = and <2 x i32> [[B:%.*]], <i32 255, i32 255>
+; CHECK-NEXT: [[Z:%.*]] = zext <2 x i8> [[A:%.*]] to <2 x i32>
+; CHECK-NEXT: [[C:%.*]] = icmp eq <2 x i32> [[T]], [[Z]]
+; CHECK-NEXT: ret <2 x i1> [[C]]
+;
+ %t = and <2 x i32> %b, <i32 255, i32 255>
+ %z = zext <2 x i8> %a to <2 x i32>
+ %c = icmp eq <2 x i32> %t, %z
+ ret <2 x i1> %c
+}
+
define i1 @test65(i64 %A, i64 %B) {
; CHECK-LABEL: @test65(
; CHECK-NEXT: ret i1 true
@@ -4084,9 +4147,6 @@ define <4 x i1> @signbit_bitcast_fpext_vec_wrong_bitcast(<2 x half> %x) {
ret <4 x i1> %r
}
-declare void @use_i1(i1)
-declare void @use_i64(i64)
-
define i1 @signbit_bitcast_fpext_extra_use(float %x, ptr %p) {
; CHECK-LABEL: @signbit_bitcast_fpext_extra_use(
; CHECK-NEXT: [[F:%.*]] = fpext float [[X:%.*]] to double
@@ -4264,8 +4324,6 @@ define i1 @redundant_sign_bit_count_ult_31_30(i32 %x) {
ret i1 %c
}
-declare void @use_i32(i32)
-
define i1 @redundant_sign_bit_count_ult_31_30_extra_use_ashr(i32 %x) {
; CHECK-LABEL: @redundant_sign_bit_count_ult_31_30_extra_use_ashr(
; CHECK-NEXT: [[Y:%.*]] = ashr i32 [[X:%.*]], 31
More information about the llvm-commits
mailing list