Skip to content

Commit 04e349b

Browse files
[X86] Create all-one vector(v8i32) for TESTC(X,~X) == TESTC(X,-1) if … (#9096)
…X is v8f32
1 parent b8f54e0 commit 04e349b

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47348,9 +47348,10 @@ static SDValue combinePTESTCC(SDValue EFLAGS, X86::CondCode &CC,
4734847348
if (SDValue NotOp1 = IsNOT(Op1, DAG)) {
4734947349
if (peekThroughBitcasts(NotOp1) == peekThroughBitcasts(Op0)) {
4735047350
SDLoc DL(EFLAGS);
47351-
return DAG.getNode(EFLAGS.getOpcode(), DL, VT,
47352-
DAG.getBitcast(OpVT, NotOp1),
47353-
DAG.getAllOnesConstant(DL, OpVT));
47351+
return DAG.getNode(
47352+
EFLAGS.getOpcode(), DL, VT, DAG.getBitcast(OpVT, NotOp1),
47353+
DAG.getBitcast(OpVT,
47354+
DAG.getAllOnesConstant(DL, NotOp1.getValueType())));
4735447355
}
4735547356
}
4735647357
}

llvm/test/CodeGen/X86/combine-testpd.ll

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,28 @@ define i32 @testpdz_256_signbit(<4 x double> %c, <4 x double> %d, i32 %a, i32 %b
187187
ret i32 %t6
188188
}
189189

190+
define void @combine_testp_v4f64(<4 x i64> %x){
191+
; CHECK-LABEL: combine_testp_v4f64:
192+
; CHECK: # %bb.0: # %entry
193+
; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1
194+
; CHECK-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
195+
; CHECK-NEXT: vtestpd %ymm1, %ymm0
196+
; CHECK-NEXT: vzeroupper
197+
; CHECK-NEXT: retq
198+
entry:
199+
%xor.i.i.i.i.i.i.i.i.i = xor <4 x i64> %x, <i64 -1, i64 -1, i64 -1, i64 -1>
200+
%.cast.i.i.i.i.i.i = bitcast <4 x i64> %xor.i.i.i.i.i.i.i.i.i to <4 x double>
201+
%0 = call i32 @llvm.x86.avx.vtestz.pd.256(<4 x double> %.cast.i.i.i.i.i.i, <4 x double> %.cast.i.i.i.i.i.i)
202+
%cmp.i.not.i.i.i.i.i.i = icmp eq i32 %0, 0
203+
br i1 %cmp.i.not.i.i.i.i.i.i, label %if.end3.i.i.i.i.i.i, label %end
204+
205+
if.end3.i.i.i.i.i.i: ; preds = %entry
206+
ret void
207+
208+
end: ; preds = %entry
209+
ret void
210+
}
211+
190212
declare i32 @llvm.x86.avx.vtestz.pd(<2 x double>, <2 x double>) nounwind readnone
191213
declare i32 @llvm.x86.avx.vtestc.pd(<2 x double>, <2 x double>) nounwind readnone
192214
declare i32 @llvm.x86.avx.vtestnzc.pd(<2 x double>, <2 x double>) nounwind readnone

llvm/test/CodeGen/X86/combine-testps.ll

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,28 @@ define i32 @testpsnzc_256_signbit(<8 x float> %c, <8 x float> %d, i32 %a, i32 %b
187187
ret i32 %t6
188188
}
189189

190+
define void @combine_testp_v8f32(<8 x i32> %x){
191+
; CHECK-LABEL: combine_testp_v8f32:
192+
; CHECK: # %bb.0: # %entry
193+
; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm1
194+
; CHECK-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
195+
; CHECK-NEXT: vtestps %ymm1, %ymm0
196+
; CHECK-NEXT: vzeroupper
197+
; CHECK-NEXT: retq
198+
entry:
199+
%xor.i.i.i.i.i.i.i.i.i = xor <8 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
200+
%.cast.i.i.i.i.i.i = bitcast <8 x i32> %xor.i.i.i.i.i.i.i.i.i to <8 x float>
201+
%0 = call i32 @llvm.x86.avx.vtestz.ps.256(<8 x float> %.cast.i.i.i.i.i.i, <8 x float> %.cast.i.i.i.i.i.i)
202+
%cmp.i.not.i.i.i.i.i.i = icmp eq i32 %0, 0
203+
br i1 %cmp.i.not.i.i.i.i.i.i, label %if.end3.i.i.i.i.i.i, label %end
204+
205+
if.end3.i.i.i.i.i.i: ; preds = %entry
206+
ret void
207+
208+
end: ; preds = %entry
209+
ret void
210+
}
211+
190212
declare i32 @llvm.x86.avx.vtestz.ps(<4 x float>, <4 x float>) nounwind readnone
191213
declare i32 @llvm.x86.avx.vtestc.ps(<4 x float>, <4 x float>) nounwind readnone
192214
declare i32 @llvm.x86.avx.vtestnzc.ps(<4 x float>, <4 x float>) nounwind readnone

0 commit comments

Comments
 (0)