diff options
-rw-r--r-- | llvm/test/Transforms/InstCombine/icmp-vec.ll | 123 |
1 files changed, 104 insertions, 19 deletions
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, <i8 -128, i8 126> +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[X:%.*]], <i8 -128, i8 126> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sge <2 x i8> %x, <i8 -127, i8 -129> @@ -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, <i8 -2, i8 0> +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i8> [[X:%.*]], <i8 -2, i8 0> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp uge <2 x i8> %x, <i8 -1, i8 1> @@ -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, <i8 127, i8 -127> +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[X:%.*]], <i8 127, i8 -127> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sle <2 x i8> %x, <i8 126, i8 128> @@ -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, <i8 -1, i8 1> +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i8> [[X:%.*]], <i8 -1, i8 1> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp ule <2 x i8> %x, <i8 254, i8 0> @@ -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, <i8 -1, i8 -1> +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[X:%.*]], <i8 -1, i8 -1> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp ult <2 x i8> %x, <i8 128, i8 128> @@ -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, <i8 -1, i8 -1> +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i8> [[X:%.*]], <i8 -1, i8 -1> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sge <2 x i8> %x, <i8 0, i8 0> @@ -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, <i8 1, i8 1> +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[X:%.*]], <i8 1, i8 1> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sle <2 x i8> %x, <i8 0, i8 0> @@ -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, <i8 0, i8 0> @@ -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, <i3 -4, i3 2, i3 -1> +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <3 x i3> [[X:%.*]], <i3 -4, i3 2, i3 -1> ; CHECK-NEXT: ret <3 x i1> [[CMP]] ; %cmp = icmp sge <3 x i3> %x, <i3 -3, i3 -5, i3 0> @@ -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, <i3 -2, i3 0, i3 1> +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <3 x i3> [[X:%.*]], <i3 -2, i3 0, i3 1> ; CHECK-NEXT: ret <3 x i1> [[CMP]] ; %cmp = icmp uge <3 x i3> %x, <i3 -1, i3 1, i3 2> @@ -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, <i3 3, i3 -3, i3 1> +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <3 x i3> [[X:%.*]], <i3 3, i3 -3, i3 1> ; CHECK-NEXT: ret <3 x i1> [[CMP]] ; %cmp = icmp sle <3 x i3> %x, <i3 2, i3 4, i3 0> @@ -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, <i3 -1, i3 1, i3 2> +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <3 x i3> [[X:%.*]], <i3 -1, i3 1, i3 2> ; CHECK-NEXT: ret <3 x i1> [[CMP]] ; %cmp = icmp ule <3 x i3> %x, <i3 6, i3 0, i3 1> @@ -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, <i3 -4, i3 1> +; CHECK-NEXT: [[CMP:%.*]] = icmp sge <2 x i3> [[X:%.*]], <i3 -4, i3 1> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sge <2 x i3> %x, <i3 -4, i3 1> @@ -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, <i3 1, i3 0> +; CHECK-NEXT: [[CMP:%.*]] = icmp uge <2 x i3> [[X:%.*]], <i3 1, i3 0> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp uge <2 x i3> %x, <i3 1, i3 0> @@ -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, <i3 1, i3 3> +; CHECK-NEXT: [[CMP:%.*]] = icmp sle <2 x i3> [[X:%.*]], <i3 1, i3 3> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sle <2 x i3> %x, <i3 1, i3 3> @@ -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, <i3 -1, i3 1> +; CHECK-NEXT: [[CMP:%.*]] = icmp ule <2 x i3> [[X:%.*]], <i3 -1, i3 1> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp ule <2 x i3> %x, <i3 7, i3 1> @@ -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, <i8 34, i8 1> +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[A:%.*]], <i8 34, i8 1> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sle <2 x i8> %a, <i8 bitcast (<2 x i4> <i4 1, i4 2> 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, <i8 undef, i8 1> +; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i8> [[A:%.*]], <i8 undef, i8 1> ; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %cmp = icmp sle <2 x i8> %a, <i8 undef, i8 0> @@ -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> <i32 3, i32 3, i32 2, i32 0> +; CHECK-NEXT: [[SHUFY:%.*]] = shufflevector <4 x i8> [[Y:%.*]], <4 x i8> undef, <4 x i32> <i32 3, i32 3, i32 2, i32 0> +; 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> <i32 0, i32 1, i32 3, i32 2, i32 0> +; CHECK-NEXT: [[SHUFY:%.*]] = shufflevector <4 x float> [[Y:%.*]], <4 x float> undef, <5 x i32> <i32 0, i32 1, i32 3, i32 2, i32 0> +; 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> <i32 3, i32 3, i32 3, i32 3> +; CHECK-NEXT: [[SHUFY:%.*]] = shufflevector <4 x i8> [[Y:%.*]], <4 x i8> undef, <4 x i32> <i32 3, i32 3, i32 3, i32 3> +; 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> <i32 3, i32 2> +; CHECK-NEXT: [[SHUFY:%.*]] = shufflevector <4 x i8> [[Y:%.*]], <4 x i8> undef, <2 x i32> <i32 3, i32 2> +; 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 +} + |