From: Nikita Popov Date: Sat, 5 Jan 2019 17:36:05 +0000 (+0000) Subject: [InstCombine] Improve cttz/ctlz + icmp tests; NFC X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b77ce1890a8f2391d22c3dd0bd20f70c36256ddd;p=llvm [InstCombine] Improve cttz/ctlz + icmp tests; NFC Change part of the tests to use vectors (I'm using scalar for ugt and vector for ult), add multiuse variations, rename %lz to %tz for the cttz tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350471 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Transforms/InstCombine/cmp-intrinsic.ll b/test/Transforms/InstCombine/cmp-intrinsic.ll index feea7c21528..d9199ce3ff4 100644 --- a/test/Transforms/InstCombine/cmp-intrinsic.ll +++ b/test/Transforms/InstCombine/cmp-intrinsic.ll @@ -169,6 +169,19 @@ define i1 @ctlz_ugt_other_i32(i32 %x) { ret i1 %cmp } +define i1 @ctlz_ugt_other_multiuse_i32(i32 %x, i32* %p) { +; CHECK-LABEL: @ctlz_ugt_other_multiuse_i32( +; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0 +; CHECK-NEXT: store i32 [[LZ]], i32* [[P:%.*]], align 4 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[LZ]], 16 +; CHECK-NEXT: ret i1 [[CMP]] +; + %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) + store i32 %lz, i32* %p + %cmp = icmp ugt i32 %lz, 16 + ret i1 %cmp +} + define i1 @ctlz_ugt_bw_minus_one_i32(i32 %x) { ; CHECK-LABEL: @ctlz_ugt_bw_minus_one_i32( ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0 @@ -180,47 +193,60 @@ define i1 @ctlz_ugt_bw_minus_one_i32(i32 %x) { ret i1 %cmp } -define i1 @ctlz_ult_one_i32(i32 %x) { -; CHECK-LABEL: @ctlz_ult_one_i32( -; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 0 -; CHECK-NEXT: ret i1 [[CMP]] +define <2 x i1> @ctlz_ult_one_v2i32(<2 x i32> %x) { +; CHECK-LABEL: @ctlz_ult_one_v2i32( +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i32> [[X:%.*]], zeroinitializer +; CHECK-NEXT: ret <2 x i1> [[CMP]] ; - %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) - %cmp = icmp ult i32 %lz, 1 - ret i1 %cmp + %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false) + %cmp = icmp ult <2 x i32> %lz, + ret <2 x i1> %cmp } -define i1 @ctlz_ult_other_i32(i32 %x) { -; CHECK-LABEL: @ctlz_ult_other_i32( -; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0 -; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[LZ]], 16 -; CHECK-NEXT: ret i1 [[CMP]] +define <2 x i1> @ctlz_ult_other_v2i32(<2 x i32> %x) { +; CHECK-LABEL: @ctlz_ult_other_v2i32( +; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false) +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] ; - %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) - %cmp = icmp ult i32 %lz, 16 - ret i1 %cmp + %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false) + %cmp = icmp ult <2 x i32> %lz, + ret <2 x i1> %cmp } -define i1 @ctlz_ult_bw_minus_one_i32(i32 %x) { -; CHECK-LABEL: @ctlz_ult_bw_minus_one_i32( -; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0 -; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[LZ]], 31 -; CHECK-NEXT: ret i1 [[CMP]] +define <2 x i1> @ctlz_ult_other_multiuse_v2i32(<2 x i32> %x, <2 x i32>* %p) { +; CHECK-LABEL: @ctlz_ult_other_multiuse_v2i32( +; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false) +; CHECK-NEXT: store <2 x i32> [[LZ]], <2 x i32>* [[P:%.*]], align 8 +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] ; - %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) - %cmp = icmp ult i32 %lz, 31 - ret i1 %cmp + %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false) + store <2 x i32> %lz, <2 x i32>* %p + %cmp = icmp ult <2 x i32> %lz, + ret <2 x i1> %cmp } -define i1 @ctlz_ult_bitwidth_i32(i32 %x) { -; CHECK-LABEL: @ctlz_ult_bitwidth_i32( -; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0 -; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[LZ]], 32 -; CHECK-NEXT: ret i1 [[CMP]] +define <2 x i1> @ctlz_ult_bw_minus_one_v2i32(<2 x i32> %x) { +; CHECK-LABEL: @ctlz_ult_bw_minus_one_v2i32( +; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false) +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] ; - %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) - %cmp = icmp ult i32 %lz, 32 - ret i1 %cmp + %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false) + %cmp = icmp ult <2 x i32> %lz, + ret <2 x i1> %cmp +} + +define <2 x i1> @ctlz_ult_bitwidth_v2i32(<2 x i32> %x) { +; CHECK-LABEL: @ctlz_ult_bitwidth_v2i32( +; CHECK-NEXT: [[LZ:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false) +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[LZ]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false) + %cmp = icmp ult <2 x i32> %lz, + ret <2 x i1> %cmp } define i1 @cttz_ne_bitwidth_i33(i33 %x) { @@ -309,14 +335,14 @@ define <2 x i1> @cttz_ne_other_v2i32(<2 x i32> %a) { define i1 @cttz_eq_other_i33_multiuse(i33 %x, i33* %p) { ; CHECK-LABEL: @cttz_eq_other_i33_multiuse( -; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 -; CHECK-NEXT: store i33 [[LZ]], i33* [[P:%.*]], align 4 -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[LZ]], 4 +; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 +; CHECK-NEXT: store i33 [[TZ]], i33* [[P:%.*]], align 4 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TZ]], 4 ; CHECK-NEXT: ret i1 [[CMP]] ; - %lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) - store i33 %lz, i33* %p - %cmp = icmp eq i33 %lz, 4 + %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) + store i33 %tz, i33* %p + %cmp = icmp eq i33 %tz, 4 ret i1 %cmp } @@ -326,86 +352,111 @@ define i1 @cttz_ugt_zero_i33(i33 %x) { ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0 ; CHECK-NEXT: ret i1 [[CMP]] ; - %lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) - %cmp = icmp ugt i33 %lz, 0 + %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) + %cmp = icmp ugt i33 %tz, 0 ret i1 %cmp } define i1 @cttz_ugt_one_i33(i33 %x) { ; CHECK-LABEL: @cttz_ugt_one_i33( -; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 -; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[LZ]], 1 +; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ]], 1 ; CHECK-NEXT: ret i1 [[CMP]] ; - %lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) - %cmp = icmp ugt i33 %lz, 1 + %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) + %cmp = icmp ugt i33 %tz, 1 ret i1 %cmp } define i1 @cttz_ugt_other_i33(i33 %x) { ; CHECK-LABEL: @cttz_ugt_other_i33( -; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 -; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[LZ]], 16 +; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ]], 16 ; CHECK-NEXT: ret i1 [[CMP]] ; - %lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) - %cmp = icmp ugt i33 %lz, 16 + %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) + %cmp = icmp ugt i33 %tz, 16 ret i1 %cmp } -define i1 @cttz_ugt_bw_minus_one_i33(i33 %x) { -; CHECK-LABEL: @cttz_ugt_bw_minus_one_i33( -; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 -; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[LZ]], 32 +define i1 @cttz_ugt_other_multiuse_i33(i33 %x, i33* %p) { +; CHECK-LABEL: @cttz_ugt_other_multiuse_i33( +; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 +; CHECK-NEXT: store i33 [[TZ]], i33* [[P:%.*]], align 4 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ]], 16 ; CHECK-NEXT: ret i1 [[CMP]] ; - %lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) - %cmp = icmp ugt i33 %lz, 32 + %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) + store i33 %tz, i33* %p + %cmp = icmp ugt i33 %tz, 16 ret i1 %cmp } -define i1 @cttz_ult_one_i33(i33 %x) { -; CHECK-LABEL: @cttz_ult_one_i33( -; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 1 -; CHECK-NEXT: [[CMP:%.*]] = icmp ne i33 [[TMP1]], 0 +define i1 @cttz_ugt_bw_minus_one_i33(i33 %x) { +; CHECK-LABEL: @cttz_ugt_bw_minus_one_i33( +; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ]], 32 ; CHECK-NEXT: ret i1 [[CMP]] ; - %lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) - %cmp = icmp ult i33 %lz, 1 + %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) + %cmp = icmp ugt i33 %tz, 32 ret i1 %cmp } -define i1 @cttz_ult_other_i33(i33 %x) { -; CHECK-LABEL: @cttz_ult_other_i33( -; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 -; CHECK-NEXT: [[CMP:%.*]] = icmp ult i33 [[LZ]], 16 -; CHECK-NEXT: ret i1 [[CMP]] +define <2 x i1> @cttz_ult_one_v2i32(<2 x i32> %x) { +; CHECK-LABEL: @cttz_ult_one_v2i32( +; CHECK-NEXT: [[CMP:%.*]] = trunc <2 x i32> [[X:%.*]] to <2 x i1> +; CHECK-NEXT: ret <2 x i1> [[CMP]] ; - %lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) - %cmp = icmp ult i33 %lz, 16 - ret i1 %cmp + %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false) + %cmp = icmp ult <2 x i32> %tz, + ret <2 x i1> %cmp } -define i1 @cttz_ult_bw_minus_one_i33(i33 %x) { -; CHECK-LABEL: @cttz_ult_bw_minus_one_i33( -; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 -; CHECK-NEXT: [[CMP:%.*]] = icmp ult i33 [[LZ]], 32 -; CHECK-NEXT: ret i1 [[CMP]] +define <2 x i1> @cttz_ult_other_v2i32(<2 x i32> %x) { +; CHECK-LABEL: @cttz_ult_other_v2i32( +; CHECK-NEXT: [[TZ:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false) +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] ; - %lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) - %cmp = icmp ult i33 %lz, 32 - ret i1 %cmp + %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false) + %cmp = icmp ult <2 x i32> %tz, + ret <2 x i1> %cmp } -define i1 @cttz_ult_bitwidth_i33(i33 %x) { -; CHECK-LABEL: @cttz_ult_bitwidth_i33( -; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1 -; CHECK-NEXT: [[CMP:%.*]] = icmp ult i33 [[LZ]], 33 -; CHECK-NEXT: ret i1 [[CMP]] +define <2 x i1> @cttz_ult_other_multiuse_v2i32(<2 x i32> %x, <2 x i32>* %p) { +; CHECK-LABEL: @cttz_ult_other_multiuse_v2i32( +; CHECK-NEXT: [[TZ:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false) +; CHECK-NEXT: store <2 x i32> [[TZ]], <2 x i32>* [[P:%.*]], align 8 +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] ; - %lz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) - %cmp = icmp ult i33 %lz, 33 - ret i1 %cmp + %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false) + store <2 x i32> %tz, <2 x i32>* %p + %cmp = icmp ult <2 x i32> %tz, + ret <2 x i1> %cmp +} + +define <2 x i1> @cttz_ult_bw_minus_one_v2i32(<2 x i32> %x) { +; CHECK-LABEL: @cttz_ult_bw_minus_one_v2i32( +; CHECK-NEXT: [[TZ:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false) +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false) + %cmp = icmp ult <2 x i32> %tz, + ret <2 x i1> %cmp +} + +define <2 x i1> @cttz_ult_bitwidth_v2i32(<2 x i32> %x) { +; CHECK-LABEL: @cttz_ult_bitwidth_v2i32( +; CHECK-NEXT: [[TZ:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false) +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false) + %cmp = icmp ult <2 x i32> %tz, + ret <2 x i1> %cmp } define i1 @ctpop_eq_zero_i11(i11 %x) {