2016-08-10 01:03:51 +08:00
|
|
|
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
2012-03-30 06:01:41 +08:00
|
|
|
; RUN: opt < %s -instcombine -S | FileCheck %s
|
2007-03-24 04:48:34 +08:00
|
|
|
|
|
|
|
define i1 @test0(i39 %X, i39 %A) {
|
2013-07-14 09:42:54 +08:00
|
|
|
; CHECK-LABEL: @test0(
|
2018-10-02 04:22:28 +08:00
|
|
|
; CHECK-NEXT: [[TMP1:%.*]] = shl i39 1, [[A:%.*]]
|
|
|
|
; CHECK-NEXT: [[TMP2:%.*]] = and i39 [[TMP1]], [[X:%.*]]
|
2016-08-10 01:03:51 +08:00
|
|
|
; CHECK-NEXT: [[D:%.*]] = icmp ne i39 [[TMP2]], 0
|
|
|
|
; CHECK-NEXT: ret i1 [[D]]
|
|
|
|
;
|
|
|
|
%B = lshr i39 %X, %A
|
|
|
|
%D = trunc i39 %B to i1
|
|
|
|
ret i1 %D
|
2007-03-24 04:48:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
define i1 @test1(i799 %X, i799 %A) {
|
2013-07-14 09:42:54 +08:00
|
|
|
; CHECK-LABEL: @test1(
|
2018-10-02 04:22:28 +08:00
|
|
|
; CHECK-NEXT: [[TMP1:%.*]] = shl i799 1, [[A:%.*]]
|
|
|
|
; CHECK-NEXT: [[TMP2:%.*]] = and i799 [[TMP1]], [[X:%.*]]
|
2016-08-10 01:03:51 +08:00
|
|
|
; CHECK-NEXT: [[D:%.*]] = icmp ne i799 [[TMP2]], 0
|
|
|
|
; CHECK-NEXT: ret i1 [[D]]
|
|
|
|
;
|
|
|
|
%B = lshr i799 %X, %A
|
|
|
|
%D = trunc i799 %B to i1
|
|
|
|
ret i1 %D
|
2007-03-24 04:48:34 +08:00
|
|
|
}
|
2016-08-10 01:03:51 +08:00
|
|
|
|
2016-08-15 05:05:08 +08:00
|
|
|
define <2 x i1> @test0vec(<2 x i39> %X, <2 x i39> %A) {
|
|
|
|
; CHECK-LABEL: @test0vec(
|
[InstCombine] reverse 'trunc X to <N x i1>' canonicalization; 2nd try
Re-trying r344082 because it unintentionally included extra diffs.
Original commit message:
icmp ne (and X, 1), 0 --> trunc X to N x i1
Ideally, we'd do the same for scalars, but there will likely be
regressions unless we add more trunc folds as we're doing here
for vectors.
The motivating vector case is from PR37549:
https://bugs.llvm.org/show_bug.cgi?id=37549
define <4 x float> @bitwise_select(<4 x float> %x, <4 x float> %y, <4 x float> %z, <4 x float> %w) {
%c = fcmp ole <4 x float> %x, %y
%s = sext <4 x i1> %c to <4 x i32>
%s1 = shufflevector <4 x i32> %s, <4 x i32> undef, <4 x i32> <i32 0, i32 0, i32 1, i32 1>
%s2 = shufflevector <4 x i32> %s, <4 x i32> undef, <4 x i32> <i32 2, i32 2, i32 3, i32 3>
%cond = or <4 x i32> %s1, %s2
%condtr = trunc <4 x i32> %cond to <4 x i1>
%r = select <4 x i1> %condtr, <4 x float> %z, <4 x float> %w
ret <4 x float> %r
}
Here's a sampling of the vector codegen for that case using
mask+icmp (current behavior) vs. trunc (with this patch):
AVX before:
vcmpleps %xmm1, %xmm0, %xmm0
vpermilps $80, %xmm0, %xmm1 ## xmm1 = xmm0[0,0,1,1]
vpermilps $250, %xmm0, %xmm0 ## xmm0 = xmm0[2,2,3,3]
vorps %xmm0, %xmm1, %xmm0
vandps LCPI0_0(%rip), %xmm0, %xmm0
vxorps %xmm1, %xmm1, %xmm1
vpcmpeqd %xmm1, %xmm0, %xmm0
vblendvps %xmm0, %xmm3, %xmm2, %xmm0
AVX after:
vcmpleps %xmm1, %xmm0, %xmm0
vpermilps $80, %xmm0, %xmm1 ## xmm1 = xmm0[0,0,1,1]
vpermilps $250, %xmm0, %xmm0 ## xmm0 = xmm0[2,2,3,3]
vorps %xmm0, %xmm1, %xmm0
vblendvps %xmm0, %xmm2, %xmm3, %xmm0
AVX512f before:
vcmpleps %xmm1, %xmm0, %xmm0
vpermilps $80, %xmm0, %xmm1 ## xmm1 = xmm0[0,0,1,1]
vpermilps $250, %xmm0, %xmm0 ## xmm0 = xmm0[2,2,3,3]
vorps %xmm0, %xmm1, %xmm0
vpbroadcastd LCPI0_0(%rip), %xmm1 ## xmm1 = [1,1,1,1]
vptestnmd %zmm1, %zmm0, %k1
vblendmps %zmm3, %zmm2, %zmm0 {%k1}
AVX512f after:
vcmpleps %xmm1, %xmm0, %xmm0
vpermilps $80, %xmm0, %xmm1 ## xmm1 = xmm0[0,0,1,1]
vpermilps $250, %xmm0, %xmm0 ## xmm0 = xmm0[2,2,3,3]
vorps %xmm0, %xmm1, %xmm0
vpslld $31, %xmm0, %xmm0
vptestmd %zmm0, %zmm0, %k1
vblendmps %zmm2, %zmm3, %zmm0 {%k1}
AArch64 before:
fcmge v0.4s, v1.4s, v0.4s
zip1 v1.4s, v0.4s, v0.4s
zip2 v0.4s, v0.4s, v0.4s
orr v0.16b, v1.16b, v0.16b
movi v1.4s, #1
and v0.16b, v0.16b, v1.16b
cmeq v0.4s, v0.4s, #0
bsl v0.16b, v3.16b, v2.16b
AArch64 after:
fcmge v0.4s, v1.4s, v0.4s
zip1 v1.4s, v0.4s, v0.4s
zip2 v0.4s, v0.4s, v0.4s
orr v0.16b, v1.16b, v0.16b
bsl v0.16b, v2.16b, v3.16b
PowerPC-le before:
xvcmpgesp 34, 35, 34
vspltisw 0, 1
vmrglw 3, 2, 2
vmrghw 2, 2, 2
xxlor 0, 35, 34
xxlxor 35, 35, 35
xxland 34, 0, 32
vcmpequw 2, 2, 3
xxsel 34, 36, 37, 34
PowerPC-le after:
xvcmpgesp 34, 35, 34
vmrglw 3, 2, 2
vmrghw 2, 2, 2
xxlor 0, 35, 34
xxsel 34, 37, 36, 0
Differential Revision: https://reviews.llvm.org/D52747
llvm-svn: 344181
2018-10-11 04:47:46 +08:00
|
|
|
; CHECK-NEXT: [[B:%.*]] = lshr <2 x i39> [[X:%.*]], [[A:%.*]]
|
|
|
|
; CHECK-NEXT: [[D:%.*]] = trunc <2 x i39> [[B]] to <2 x i1>
|
2016-08-15 05:05:08 +08:00
|
|
|
; CHECK-NEXT: ret <2 x i1> [[D]]
|
|
|
|
;
|
|
|
|
%B = lshr <2 x i39> %X, %A
|
|
|
|
%D = trunc <2 x i39> %B to <2 x i1>
|
|
|
|
ret <2 x i1> %D
|
|
|
|
}
|
|
|
|
|