Skip to content

Commit c8466ab

Browse files
[LegalizeType][X86] Support WidenVecRes_AssertZext and SplitVecRes_AssertZext for ISD::AssertZext during LegalizeType procedure
Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D150941
1 parent 9c3c6f6 commit c8466ab

File tree

4 files changed

+61
-0
lines changed

4 files changed

+61
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
946946
// Widen Vector Result Promotion.
947947
void WidenVectorResult(SDNode *N, unsigned ResNo);
948948
SDValue WidenVecRes_MERGE_VALUES(SDNode* N, unsigned ResNo);
949+
SDValue WidenVecRes_AssertZext(SDNode* N);
949950
SDValue WidenVecRes_BITCAST(SDNode* N);
950951
SDValue WidenVecRes_BUILD_VECTOR(SDNode* N);
951952
SDValue WidenVecRes_CONCAT_VECTORS(SDNode* N);
@@ -1075,6 +1076,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
10751076
// Generic Result Splitting.
10761077
void SplitRes_MERGE_VALUES(SDNode *N, unsigned ResNo,
10771078
SDValue &Lo, SDValue &Hi);
1079+
void SplitVecRes_AssertZext (SDNode *N, SDValue &Lo, SDValue &Hi);
10781080
void SplitRes_ARITH_FENCE (SDNode *N, SDValue &Lo, SDValue &Hi);
10791081
void SplitRes_Select (SDNode *N, SDValue &Lo, SDValue &Hi);
10801082
void SplitRes_SELECT_CC (SDNode *N, SDValue &Lo, SDValue &Hi);

llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,16 @@ void DAGTypeLegalizer::SplitRes_UNDEF(SDNode *N, SDValue &Lo, SDValue &Hi) {
571571
Hi = DAG.getUNDEF(HiVT);
572572
}
573573

574+
void DAGTypeLegalizer::SplitVecRes_AssertZext(SDNode *N, SDValue &Lo,
575+
SDValue &Hi) {
576+
SDValue L, H;
577+
SDLoc dl(N);
578+
GetSplitOp(N->getOperand(0), L, H);
579+
580+
Lo = DAG.getNode(ISD::AssertZext, dl, L.getValueType(), L, N->getOperand(1));
581+
Hi = DAG.getNode(ISD::AssertZext, dl, H.getValueType(), H, N->getOperand(1));
582+
}
583+
574584
void DAGTypeLegalizer::SplitRes_FREEZE(SDNode *N, SDValue &Lo, SDValue &Hi) {
575585
SDValue L, H;
576586
SDLoc dl(N);

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,7 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
948948
"operator!\n");
949949

950950
case ISD::MERGE_VALUES: SplitRes_MERGE_VALUES(N, ResNo, Lo, Hi); break;
951+
case ISD::AssertZext: SplitVecRes_AssertZext(N, Lo, Hi); break;
951952
case ISD::VSELECT:
952953
case ISD::SELECT:
953954
case ISD::VP_MERGE:
@@ -3925,6 +3926,7 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
39253926
llvm_unreachable("Do not know how to widen the result of this operator!");
39263927

39273928
case ISD::MERGE_VALUES: Res = WidenVecRes_MERGE_VALUES(N, ResNo); break;
3929+
case ISD::AssertZext: Res = WidenVecRes_AssertZext(N); break;
39283930
case ISD::BITCAST: Res = WidenVecRes_BITCAST(N); break;
39293931
case ISD::BUILD_VECTOR: Res = WidenVecRes_BUILD_VECTOR(N); break;
39303932
case ISD::CONCAT_VECTORS: Res = WidenVecRes_CONCAT_VECTORS(N); break;
@@ -5126,6 +5128,14 @@ SDValue DAGTypeLegalizer::WidenVecRes_EXTRACT_SUBVECTOR(SDNode *N) {
51265128
return DAG.getBuildVector(WidenVT, dl, Ops);
51275129
}
51285130

5131+
SDValue DAGTypeLegalizer::WidenVecRes_AssertZext(SDNode *N) {
5132+
SDValue InOp = ModifyToType(
5133+
N->getOperand(0),
5134+
TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)), true);
5135+
return DAG.getNode(ISD::AssertZext, SDLoc(N), InOp.getValueType(), InOp,
5136+
N->getOperand(1));
5137+
}
5138+
51295139
SDValue DAGTypeLegalizer::WidenVecRes_INSERT_VECTOR_ELT(SDNode *N) {
51305140
SDValue InOp = GetWidenedVector(N->getOperand(0));
51315141
return DAG.getNode(ISD::INSERT_VECTOR_ELT, SDLoc(N),
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s
3+
4+
define i64 @split_assertzext(ptr %x) nounwind {
5+
; CHECK-LABEL: split_assertzext:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: pushq %rax
8+
; CHECK-NEXT: callq test@PLT
9+
; CHECK-NEXT: vextracti32x4 $3, %zmm1, %xmm0
10+
; CHECK-NEXT: vpextrq $1, %xmm0, %rax
11+
; CHECK-NEXT: popq %rcx
12+
; CHECK-NEXT: vzeroupper
13+
; CHECK-NEXT: retq
14+
%e = call <16 x i64> @test(), !range !0
15+
%d = extractelement <16 x i64> %e, i32 15
16+
ret i64 %d
17+
}
18+
19+
define i64 @widen_assertzext(ptr %x) nounwind {
20+
; CHECK-LABEL: widen_assertzext:
21+
; CHECK: # %bb.0:
22+
; CHECK-NEXT: pushq %rax
23+
; CHECK-NEXT: callq test2@PLT
24+
; CHECK-NEXT: movb $127, %al
25+
; CHECK-NEXT: kmovw %eax, %k1
26+
; CHECK-NEXT: vpexpandq %zmm0, %zmm0 {%k1} {z}
27+
; CHECK-NEXT: vextracti32x4 $3, %zmm0, %xmm0
28+
; CHECK-NEXT: vmovq %xmm0, %rax
29+
; CHECK-NEXT: popq %rcx
30+
; CHECK-NEXT: vzeroupper
31+
; CHECK-NEXT: retq
32+
%e = call <7 x i64> @test2(), !range !0
33+
%d = extractelement <7 x i64> %e, i32 6
34+
ret i64 %d
35+
}
36+
37+
declare <16 x i64> @test()
38+
declare <7 x i64> @test2()
39+
!0 = !{ i64 0, i64 2 }

0 commit comments

Comments
 (0)