Skip to content

Commit 89e6e89

Browse files
committed
Fix internal error
1 parent 30e6bb7 commit 89e6e89

File tree

3 files changed

+20
-8
lines changed

3 files changed

+20
-8
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2639,11 +2639,7 @@ SDValue DAGTypeLegalizer::PromoteFloatOp_FCOPYSIGN(SDNode *N, unsigned OpNo) {
26392639
// Convert the promoted float value to the desired integer type
26402640
SDValue DAGTypeLegalizer::PromoteFloatOp_UnaryOp(SDNode *N, unsigned OpNo) {
26412641
SDValue Op = GetPromotedFloat(N->getOperand(0));
2642-
if (N->getOpcode() == ISD::AssertNoFPClass)
2643-
return DAG.getNode(N->getOpcode(), SDLoc(N), N->getValueType(0), Op,
2644-
N->getOperand(1));
2645-
else
2646-
return DAG.getNode(N->getOpcode(), SDLoc(N), N->getValueType(0), Op);
2642+
return DAG.getNode(N->getOpcode(), SDLoc(N), N->getValueType(0), Op);
26472643
}
26482644

26492645
// Convert the promoted float value to the desired integer type
@@ -3304,8 +3300,8 @@ void DAGTypeLegalizer::SoftPromoteHalfResult(SDNode *N, unsigned ResNo) {
33043300
case ISD::FTRUNC:
33053301
case ISD::FTAN:
33063302
case ISD::FTANH:
3307-
case ISD::AssertNoFPClass:
33083303
case ISD::FCANONICALIZE: R = SoftPromoteHalfRes_UnaryOp(N); break;
3304+
case ISD::AssertNoFPClass: R = SoftPromoteHalfRes_UnaryOpExt1(N); break;
33093305

33103306
// Binary FP Operations
33113307
case ISD::FADD:
@@ -3632,6 +3628,21 @@ SDValue DAGTypeLegalizer::SoftPromoteHalfRes_UnaryOp(SDNode *N) {
36323628
return DAG.getNode(GetPromotionOpcode(NVT, OVT), dl, MVT::i16, Res);
36333629
}
36343630

3631+
SDValue DAGTypeLegalizer::SoftPromoteHalfRes_UnaryOpExt1(SDNode *N) {
3632+
EVT OVT = N->getValueType(0);
3633+
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
3634+
SDValue Op = GetSoftPromotedHalf(N->getOperand(0));
3635+
SDLoc dl(N);
3636+
3637+
// Promote to the larger FP type.
3638+
Op = DAG.getNode(GetPromotionOpcode(OVT, NVT), dl, NVT, Op);
3639+
3640+
SDValue Res = DAG.getNode(N->getOpcode(), dl, NVT, Op, N->getOperand(1));
3641+
3642+
// Convert back to FP16 as an integer.
3643+
return DAG.getNode(GetPromotionOpcode(NVT, OVT), dl, MVT::i16, Res);
3644+
}
3645+
36353646
SDValue DAGTypeLegalizer::SoftPromoteHalfRes_BinOp(SDNode *N) {
36363647
EVT OVT = N->getValueType(0);
36373648
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
826826
SDValue SoftPromoteHalfRes_SELECT(SDNode *N);
827827
SDValue SoftPromoteHalfRes_SELECT_CC(SDNode *N);
828828
SDValue SoftPromoteHalfRes_UnaryOp(SDNode *N);
829+
SDValue SoftPromoteHalfRes_UnaryOpExt1(SDNode *N);
829830
SDValue SoftPromoteHalfRes_XINT_TO_FP(SDNode *N);
830831
SDValue SoftPromoteHalfRes_UNDEF(SDNode *N);
831832
SDValue SoftPromoteHalfRes_VECREDUCE(SDNode *N);

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {
6161
case ISD::AssertZext:
6262
case ISD::AssertSext:
6363
case ISD::FPOWI:
64+
case ISD::AssertNoFPClass:
6465
R = ScalarizeVecRes_UnaryOpWithExtraInput(N);
6566
break;
6667
case ISD::INSERT_VECTOR_ELT: R = ScalarizeVecRes_INSERT_VECTOR_ELT(N); break;
@@ -129,7 +130,6 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {
129130
case ISD::UINT_TO_FP:
130131
case ISD::ZERO_EXTEND:
131132
case ISD::FCANONICALIZE:
132-
case ISD::AssertNoFPClass:
133133
R = ScalarizeVecRes_UnaryOp(N);
134134
break;
135135
case ISD::ADDRSPACECAST:
@@ -2616,7 +2616,7 @@ void DAGTypeLegalizer::SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo,
26162616
const SDNodeFlags Flags = N->getFlags();
26172617
unsigned Opcode = N->getOpcode();
26182618
if (N->getNumOperands() <= 2) {
2619-
if (Opcode == ISD::FP_ROUND) {
2619+
if (Opcode == ISD::FP_ROUND || Opcode == ISD::AssertNoFPClass) {
26202620
Lo = DAG.getNode(Opcode, dl, LoVT, Lo, N->getOperand(1), Flags);
26212621
Hi = DAG.getNode(Opcode, dl, HiVT, Hi, N->getOperand(1), Flags);
26222622
} else {

0 commit comments

Comments
 (0)