From 3382dc644e86cded3e6b6e6069c8cc4e484886a7 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Thu, 21 Jun 2018 18:07:38 +0000 Subject: [InstCombine] add tests for shuffled cmps; NFC llvm-svn: 335266 --- llvm/test/Transforms/InstCombine/icmp-vec.ll | 123 ++++++++++++++++++++++----- 1 file changed, 104 insertions(+), 19 deletions(-) (limited to 'llvm') diff --git a/llvm/test/Transforms/InstCombine/icmp-vec.ll b/llvm/test/Transforms/InstCombine/icmp-vec.ll index 6b8073b409f..7c4fc8a8d8c 100644 --- a/llvm/test/Transforms/InstCombine/icmp-vec.ll +++ b/llvm/test/Transforms/InstCombine/icmp-vec.ll @@ -8,7 +8,7 @@ define <2 x i1> @sge(<2 x i8> %x) { ; CHECK-LABEL: @sge( -; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[X:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sge <2 x i8> %x, @@ -17,7 +17,7 @@ define <2 x i1> @sge(<2 x i8> %x) { define <2 x i1> @uge(<2 x i8> %x) { ; CHECK-LABEL: @uge( -; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i8> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i8> [[X:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp uge <2 x i8> %x, @@ -26,7 +26,7 @@ define <2 x i1> @uge(<2 x i8> %x) { define <2 x i1> @sle(<2 x i8> %x) { ; CHECK-LABEL: @sle( -; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[X:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sle <2 x i8> %x, @@ -35,7 +35,7 @@ define <2 x i1> @sle(<2 x i8> %x) { define <2 x i1> @ule(<2 x i8> %x) { ; CHECK-LABEL: @ule( -; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i8> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i8> [[X:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp ule <2 x i8> %x, @@ -44,7 +44,7 @@ define <2 x i1> @ule(<2 x i8> %x) { define <2 x i1> @ult_min_signed_value(<2 x i8> %x) { ; CHECK-LABEL: @ult_min_signed_value( -; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[X:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp ult <2 x i8> %x, @@ -55,7 +55,7 @@ define <2 x i1> @ult_min_signed_value(<2 x i8> %x) { define <2 x i1> @sge_zero(<2 x i8> %x) { ; CHECK-LABEL: @sge_zero( -; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[X:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sge <2 x i8> %x, @@ -72,7 +72,7 @@ define <2 x i1> @uge_zero(<2 x i8> %x) { define <2 x i1> @sle_zero(<2 x i8> %x) { ; CHECK-LABEL: @sle_zero( -; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[X:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sle <2 x i8> %x, @@ -81,7 +81,7 @@ define <2 x i1> @sle_zero(<2 x i8> %x) { define <2 x i1> @ule_zero(<2 x i8> %x) { ; CHECK-LABEL: @ule_zero( -; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> %x, zeroinitializer +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[X:%.*]], zeroinitializer ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp ule <2 x i8> %x, @@ -96,7 +96,7 @@ define <2 x i1> @ule_zero(<2 x i8> %x) { define <3 x i1> @sge_weird(<3 x i3> %x) { ; CHECK-LABEL: @sge_weird( -; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <3 x i3> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <3 x i3> [[X:%.*]], ; CHECK-NEXT: ret <3 x i1> [[CMP]] ; %cmp = icmp sge <3 x i3> %x, @@ -105,7 +105,7 @@ define <3 x i1> @sge_weird(<3 x i3> %x) { define <3 x i1> @uge_weird(<3 x i3> %x) { ; CHECK-LABEL: @uge_weird( -; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <3 x i3> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <3 x i3> [[X:%.*]], ; CHECK-NEXT: ret <3 x i1> [[CMP]] ; %cmp = icmp uge <3 x i3> %x, @@ -114,7 +114,7 @@ define <3 x i1> @uge_weird(<3 x i3> %x) { define <3 x i1> @sle_weird(<3 x i3> %x) { ; CHECK-LABEL: @sle_weird( -; CHECK-NEXT: [[CMP:%.*]] = icmp slt <3 x i3> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <3 x i3> [[X:%.*]], ; CHECK-NEXT: ret <3 x i1> [[CMP]] ; %cmp = icmp sle <3 x i3> %x, @@ -123,7 +123,7 @@ define <3 x i1> @sle_weird(<3 x i3> %x) { define <3 x i1> @ule_weird(<3 x i3> %x) { ; CHECK-LABEL: @ule_weird( -; CHECK-NEXT: [[CMP:%.*]] = icmp ult <3 x i3> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <3 x i3> [[X:%.*]], ; CHECK-NEXT: ret <3 x i1> [[CMP]] ; %cmp = icmp ule <3 x i3> %x, @@ -134,7 +134,7 @@ define <3 x i1> @ule_weird(<3 x i3> %x) { define <2 x i1> @sge_min(<2 x i3> %x) { ; CHECK-LABEL: @sge_min( -; CHECK-NEXT: [[CMP:%.*]] = icmp sge <2 x i3> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp sge <2 x i3> [[X:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sge <2 x i3> %x, @@ -143,7 +143,7 @@ define <2 x i1> @sge_min(<2 x i3> %x) { define <2 x i1> @uge_min(<2 x i3> %x) { ; CHECK-LABEL: @uge_min( -; CHECK-NEXT: [[CMP:%.*]] = icmp uge <2 x i3> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp uge <2 x i3> [[X:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp uge <2 x i3> %x, @@ -152,7 +152,7 @@ define <2 x i1> @uge_min(<2 x i3> %x) { define <2 x i1> @sle_max(<2 x i3> %x) { ; CHECK-LABEL: @sle_max( -; CHECK-NEXT: [[CMP:%.*]] = icmp sle <2 x i3> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp sle <2 x i3> [[X:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sle <2 x i3> %x, @@ -161,7 +161,7 @@ define <2 x i1> @sle_max(<2 x i3> %x) { define <2 x i1> @ule_max(<2 x i3> %x) { ; CHECK-LABEL: @ule_max( -; CHECK-NEXT: [[CMP:%.*]] = icmp ule <2 x i3> %x, +; CHECK-NEXT: [[CMP:%.*]] = icmp ule <2 x i3> [[X:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp ule <2 x i3> %x, @@ -170,7 +170,7 @@ define <2 x i1> @ule_max(<2 x i3> %x) { define <2 x i1> @PR27756_1(<2 x i8> %a) { ; CHECK-LABEL: @PR27756_1( -; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> %a, +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[A:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sle <2 x i8> %a, to i8), i8 0> @@ -181,7 +181,7 @@ define <2 x i1> @PR27756_1(<2 x i8> %a) { define <2 x i1> @PR27756_2(<2 x i8> %a) { ; CHECK-LABEL: @PR27756_2( -; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> %a, +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[A:%.*]], ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sle <2 x i8> %a, @@ -192,9 +192,94 @@ define <2 x i1> @PR27756_2(<2 x i8> %a) { define <2 x i1> @PR27786(<2 x i8> %a) { ; CHECK-LABEL: @PR27786( -; CHECK-NEXT: [[CMP:%.*]] = icmp sle <2 x i8> %a, bitcast (i16 ptrtoint (i32* @someglobal to i16) to <2 x i8>) +; CHECK-NEXT: [[CMP:%.*]] = icmp sle <2 x i8> [[A:%.*]], bitcast (i16 ptrtoint (i32* @someglobal to i16) to <2 x i8>) ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sle <2 x i8> %a, bitcast (i16 ptrtoint (i32* @someglobal to i16) to <2 x i8>) ret <2 x i1> %cmp } + +; FIXME: +; This is similar to a transform for shuffled binops: compare first, shuffle after. + +define <4 x i1> @same_shuffle_inputs_icmp(<4 x i8> %x, <4 x i8> %y) { +; CHECK-LABEL: @same_shuffle_inputs_icmp( +; CHECK-NEXT: [[SHUFX:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> undef, <4 x i32> +; CHECK-NEXT: [[SHUFY:%.*]] = shufflevector <4 x i8> [[Y:%.*]], <4 x i8> undef, <4 x i32> +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <4 x i8> [[SHUFX]], [[SHUFY]] +; CHECK-NEXT: ret <4 x i1> [[CMP]] +; + %shufx = shufflevector <4 x i8> %x, <4 x i8> undef, <4 x i32> < i32 3, i32 3, i32 2, i32 0 > + %shufy = shufflevector <4 x i8> %y, <4 x i8> undef, <4 x i32> < i32 3, i32 3, i32 2, i32 0 > + %cmp = icmp sgt <4 x i8> %shufx, %shufy + ret <4 x i1> %cmp +} + +; fcmp and size-changing shuffles are ok too. + +define <5 x i1> @same_shuffle_inputs_fcmp(<4 x float> %x, <4 x float> %y) { +; CHECK-LABEL: @same_shuffle_inputs_fcmp( +; CHECK-NEXT: [[SHUFX:%.*]] = shufflevector <4 x float> [[X:%.*]], <4 x float> undef, <5 x i32> +; CHECK-NEXT: [[SHUFY:%.*]] = shufflevector <4 x float> [[Y:%.*]], <4 x float> undef, <5 x i32> +; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq <5 x float> [[SHUFX]], [[SHUFY]] +; CHECK-NEXT: ret <5 x i1> [[CMP]] +; + %shufx = shufflevector <4 x float> %x, <4 x float> undef, <5 x i32> < i32 0, i32 1, i32 3, i32 2, i32 0 > + %shufy = shufflevector <4 x float> %y, <4 x float> undef, <5 x i32> < i32 0, i32 1, i32 3, i32 2, i32 0 > + %cmp = fcmp oeq <5 x float> %shufx, %shufy + ret <5 x i1> %cmp +} + +declare void @use_v4i8(<4 x i8>) + +define <4 x i1> @same_shuffle_inputs_icmp_extra_use1(<4 x i8> %x, <4 x i8> %y) { +; CHECK-LABEL: @same_shuffle_inputs_icmp_extra_use1( +; CHECK-NEXT: [[SHUFX:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> undef, <4 x i32> +; CHECK-NEXT: [[SHUFY:%.*]] = shufflevector <4 x i8> [[Y:%.*]], <4 x i8> undef, <4 x i32> +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <4 x i8> [[SHUFX]], [[SHUFY]] +; CHECK-NEXT: call void @use_v4i8(<4 x i8> [[SHUFX]]) +; CHECK-NEXT: ret <4 x i1> [[CMP]] +; + %shufx = shufflevector <4 x i8> %x, <4 x i8> undef, <4 x i32> < i32 3, i32 3, i32 3, i32 3 > + %shufy = shufflevector <4 x i8> %y, <4 x i8> undef, <4 x i32> < i32 3, i32 3, i32 3, i32 3 > + %cmp = icmp ugt <4 x i8> %shufx, %shufy + call void @use_v4i8(<4 x i8> %shufx) + ret <4 x i1> %cmp +} + +declare void @use_v2i8(<2 x i8>) + +define <2 x i1> @same_shuffle_inputs_icmp_extra_use2(<4 x i8> %x, <4 x i8> %y) { +; CHECK-LABEL: @same_shuffle_inputs_icmp_extra_use2( +; CHECK-NEXT: [[SHUFX:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> undef, <2 x i32> +; CHECK-NEXT: [[SHUFY:%.*]] = shufflevector <4 x i8> [[Y:%.*]], <4 x i8> undef, <2 x i32> +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[SHUFX]], [[SHUFY]] +; CHECK-NEXT: call void @use_v2i8(<2 x i8> [[SHUFY]]) +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + %shufx = shufflevector <4 x i8> %x, <4 x i8> undef, <2 x i32> < i32 3, i32 2 > + %shufy = shufflevector <4 x i8> %y, <4 x i8> undef, <2 x i32> < i32 3, i32 2 > + %cmp = icmp eq <2 x i8> %shufx, %shufy + call void @use_v2i8(<2 x i8> %shufy) + ret <2 x i1> %cmp +} + +; Negative test: if both shuffles have extra uses, don't transform because that would increase instruction count. + +define <2 x i1> @same_shuffle_inputs_icmp_extra_use3(<4 x i8> %x, <4 x i8> %y) { +; CHECK-LABEL: @same_shuffle_inputs_icmp_extra_use3( +; CHECK-NEXT: [[SHUFX:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> undef, <2 x i32> zeroinitializer +; CHECK-NEXT: [[SHUFY:%.*]] = shufflevector <4 x i8> [[Y:%.*]], <4 x i8> undef, <2 x i32> zeroinitializer +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[SHUFX]], [[SHUFY]] +; CHECK-NEXT: call void @use_v2i8(<2 x i8> [[SHUFX]]) +; CHECK-NEXT: call void @use_v2i8(<2 x i8> [[SHUFY]]) +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + %shufx = shufflevector <4 x i8> %x, <4 x i8> undef, <2 x i32> < i32 0, i32 0 > + %shufy = shufflevector <4 x i8> %y, <4 x i8> undef, <2 x i32> < i32 0, i32 0 > + %cmp = icmp eq <2 x i8> %shufx, %shufy + call void @use_v2i8(<2 x i8> %shufx) + call void @use_v2i8(<2 x i8> %shufy) + ret <2 x i1> %cmp +} + -- cgit v1.2.3