[llvm] f3fe384 - [InstCombine] add tests for icmp of sext i1; NFC

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Tue May 31 09:45:14 PDT 2022


Author: Sanjay Patel
Date: 2022-05-31T12:37:56-04:00
New Revision: f3fe38448b8c41f828ed03dc704e8b918e3b773e

URL: https://github.com/llvm/llvm-project/commit/f3fe38448b8c41f828ed03dc704e8b918e3b773e
DIFF: https://github.com/llvm/llvm-project/commit/f3fe38448b8c41f828ed03dc704e8b918e3b773e.diff

LOG: [InstCombine] add tests for icmp of sext i1; NFC

These are adapted from the zext tests added for D126171.

Added: 
    

Modified: 
    llvm/test/Transforms/InstCombine/icmp-range.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/InstCombine/icmp-range.ll b/llvm/test/Transforms/InstCombine/icmp-range.ll
index d55787ee7c5e..b8d8310cfc74 100644
--- a/llvm/test/Transforms/InstCombine/icmp-range.ll
+++ b/llvm/test/Transforms/InstCombine/icmp-range.ll
@@ -399,6 +399,221 @@ define i1 @and_ugt_sub(i8 %b, i8 %x, i8 %y) {
   ret i1 %r
 }
 
+; Repeat the zext set of tests with a sext instead.
+
+define i1 @uge_sext(i1 %b, i8 %x) {
+; CHECK-LABEL: @uge_sext(
+; CHECK-NEXT:    [[S:%.*]] = sext i1 [[B:%.*]] to i8
+; CHECK-NEXT:    [[R:%.*]] = icmp uge i8 [[S]], [[X:%.*]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %s = sext i1 %b to i8
+  %r = icmp uge i8 %s, %x
+  ret i1 %r
+}
+
+define <2 x i1> @ule_sext(<2 x i1> %b, <2 x i8> %p) {
+; CHECK-LABEL: @ule_sext(
+; CHECK-NEXT:    [[X:%.*]] = mul <2 x i8> [[P:%.*]], [[P]]
+; CHECK-NEXT:    [[S:%.*]] = sext <2 x i1> [[B:%.*]] to <2 x i8>
+; CHECK-NEXT:    [[R:%.*]] = icmp ule <2 x i8> [[X]], [[S]]
+; CHECK-NEXT:    ret <2 x i1> [[R]]
+;
+  %x = mul <2 x i8> %p, %p ; thwart complexity-based canonicalization
+  %s = sext <2 x i1> %b to <2 x i8>
+  %r = icmp ule <2 x i8> %x, %s
+  ret <2 x i1> %r
+}
+
+define i1 @ugt_sext(i1 %b, i8 %x) {
+; CHECK-LABEL: @ugt_sext(
+; CHECK-NEXT:    [[S:%.*]] = sext i1 [[B:%.*]] to i8
+; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[S]], [[X:%.*]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %s = sext i1 %b to i8
+  %r = icmp ugt i8 %s, %x
+  ret i1 %r
+}
+
+define i1 @ult_sext(i1 %b, i8 %p) {
+; CHECK-LABEL: @ult_sext(
+; CHECK-NEXT:    [[X:%.*]] = mul i8 [[P:%.*]], [[P]]
+; CHECK-NEXT:    [[S:%.*]] = sext i1 [[B:%.*]] to i8
+; CHECK-NEXT:    [[R:%.*]] = icmp ult i8 [[X]], [[S]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %x = mul i8 %p, %p ; thwart complexity-based canonicalization
+  %s = sext i1 %b to i8
+  %r = icmp ult i8 %x, %s
+  ret i1 %r
+}
+
+define i1 @uge_sext_use(i1 %b, i8 %x) {
+; CHECK-LABEL: @uge_sext_use(
+; CHECK-NEXT:    [[S:%.*]] = sext i1 [[B:%.*]] to i8
+; CHECK-NEXT:    call void @use(i8 [[S]])
+; CHECK-NEXT:    [[R:%.*]] = icmp uge i8 [[S]], [[X:%.*]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %s = sext i1 %b to i8
+  call void @use(i8 %s)
+  %r = icmp uge i8 %s, %x
+  ret i1 %r
+}
+
+define i1 @ule_sext_not_i1(i2 %b, i8 %x) {
+; CHECK-LABEL: @ule_sext_not_i1(
+; CHECK-NEXT:    [[S:%.*]] = sext i2 [[B:%.*]] to i8
+; CHECK-NEXT:    [[R:%.*]] = icmp uge i8 [[S]], [[X:%.*]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %s = sext i2 %b to i8
+  %r = icmp ule i8 %x, %s
+  ret i1 %r
+}
+
+define i1 @sub_ule_sext(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @sub_ule_sext(
+; CHECK-NEXT:    [[S:%.*]] = sext i1 [[B:%.*]] to i8
+; CHECK-NEXT:    [[D:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[D]], [[S]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %s = sext i1 %b to i8
+  %d = sub i8 %x, %y
+  %r = icmp ule i8 %d, %s
+  ret i1 %r
+}
+
+define i1 @sext_ule_sext(i1 %b, i8 %p) {
+; CHECK-LABEL: @sext_ule_sext(
+; CHECK-NEXT:    [[X:%.*]] = mul i8 [[P:%.*]], [[P]]
+; CHECK-NEXT:    [[TMP1:%.*]] = sext i1 [[B:%.*]] to i8
+; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[X]], [[TMP1]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %x = mul i8 %p, %p ; thwart complexity-based canonicalization
+  %s = sext i1 %b to i16
+  %sx = sext i8 %x to i16
+  %r = icmp ule i16 %sx, %s
+  ret i1 %r
+}
+
+define i1 @sext_uge_sext(i1 %b, i4 %x) {
+; CHECK-LABEL: @sext_uge_sext(
+; CHECK-NEXT:    [[SX:%.*]] = sext i4 [[X:%.*]] to i8
+; CHECK-NEXT:    call void @use(i8 [[SX]])
+; CHECK-NEXT:    [[TMP1:%.*]] = sext i1 [[B:%.*]] to i4
+; CHECK-NEXT:    [[R:%.*]] = icmp uge i4 [[TMP1]], [[X]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %s = sext i1 %b to i8
+  %sx = sext i4 %x to i8
+  call void @use(i8 %sx)
+  %r = icmp uge i8 %s, %sx
+  ret i1 %r
+}
+
+define i1 @sub_ule_sext_not_i1(i2 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @sub_ule_sext_not_i1(
+; CHECK-NEXT:    [[S:%.*]] = sext i2 [[B:%.*]] to i8
+; CHECK-NEXT:    [[D:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[D]], [[S]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %s = sext i2 %b to i8
+  %d = sub i8 %x, %y
+  %r = icmp ule i8 %d, %s
+  ret i1 %r
+}
+
+define i1 @sub_ule_sext_use1(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @sub_ule_sext_use1(
+; CHECK-NEXT:    [[S:%.*]] = sext i1 [[B:%.*]] to i8
+; CHECK-NEXT:    call void @use(i8 [[S]])
+; CHECK-NEXT:    [[D:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[D]], [[S]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %s = sext i1 %b to i8
+  call void @use(i8 %s)
+  %d = sub i8 %x, %y
+  %r = icmp ule i8 %d, %s
+  ret i1 %r
+}
+
+define <2 x i1> @sext_uge_sub_use2(<2 x i1> %b, <2 x i8> %x, <2 x i8> %y) {
+; CHECK-LABEL: @sext_uge_sub_use2(
+; CHECK-NEXT:    [[S:%.*]] = sext <2 x i1> [[B:%.*]] to <2 x i8>
+; CHECK-NEXT:    [[D:%.*]] = sub <2 x i8> [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT:    call void @use_vec(<2 x i8> [[D]])
+; CHECK-NEXT:    [[R:%.*]] = icmp ule <2 x i8> [[D]], [[S]]
+; CHECK-NEXT:    ret <2 x i1> [[R]]
+;
+  %s = sext <2 x i1> %b to <2 x i8>
+  %d = sub <2 x i8> %x, %y
+  call void @use_vec(<2 x i8> %d)
+  %r = icmp uge <2 x i8> %s, %d
+  ret <2 x i1> %r
+}
+
+define i1 @sub_ule_sext_use3(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @sub_ule_sext_use3(
+; CHECK-NEXT:    [[S:%.*]] = sext i1 [[B:%.*]] to i8
+; CHECK-NEXT:    call void @use(i8 [[S]])
+; CHECK-NEXT:    [[D:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT:    call void @use(i8 [[D]])
+; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[D]], [[S]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %s = sext i1 %b to i8
+  call void @use(i8 %s)
+  %d = sub i8 %x, %y
+  call void @use(i8 %d)
+  %r = icmp ule i8 %d, %s
+  ret i1 %r
+}
+
+define i1 @sub_ult_sext(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @sub_ult_sext(
+; CHECK-NEXT:    [[S:%.*]] = sext i1 [[B:%.*]] to i8
+; CHECK-NEXT:    [[D:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT:    [[R:%.*]] = icmp ult i8 [[D]], [[S]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %s = sext i1 %b to i8
+  %d = sub i8 %x, %y
+  %r = icmp ult i8 %d, %s
+  ret i1 %r
+}
+
+define <2 x i1> @sub_ule_ashr(<2 x i8> %b, <2 x i8> %x, <2 x i8> %y) {
+; CHECK-LABEL: @sub_ule_ashr(
+; CHECK-NEXT:    [[A:%.*]] = ashr <2 x i8> [[B:%.*]], <i8 7, i8 7>
+; CHECK-NEXT:    [[S:%.*]] = sub <2 x i8> [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT:    [[R:%.*]] = icmp ule <2 x i8> [[S]], [[A]]
+; CHECK-NEXT:    ret <2 x i1> [[R]]
+;
+  %a = ashr <2 x i8> %b, <i8 7, i8 7>
+  %s = sub <2 x i8> %x, %y
+  %r = icmp ule <2 x i8> %s, %a
+  ret <2 x i1> %r
+}
+
+define i1 @ashr_uge_sub(i8 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @ashr_uge_sub(
+; CHECK-NEXT:    [[A:%.*]] = ashr i8 [[B:%.*]], 7
+; CHECK-NEXT:    [[S:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT:    [[R:%.*]] = icmp uge i8 [[A]], [[S]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %a = ashr i8 %b, 7
+  %s = sub i8 %x, %y
+  %r = icmp uge i8 %a, %s
+  ret i1 %r
+}
+
 !0 = !{i32 1, i32 6}
 !1 = !{i32 0, i32 6}
 !2 = !{i8 0, i8 1}


        


More information about the llvm-commits mailing list