Skip to content

Commit bf50d75

Browse files
committed
Fix internal error
1 parent e6c2192 commit bf50d75

File tree

3 files changed

+22
-8
lines changed

3 files changed

+22
-8
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp

Lines changed: 19 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,10 @@ 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:
3305+
R = SoftPromoteHalfRes_UnaryOpExt1(N);
3306+
break;
33093307

33103308
// Binary FP Operations
33113309
case ISD::FADD:
@@ -3632,6 +3630,21 @@ SDValue DAGTypeLegalizer::SoftPromoteHalfRes_UnaryOp(SDNode *N) {
36323630
return DAG.getNode(GetPromotionOpcode(NVT, OVT), dl, MVT::i16, Res);
36333631
}
36343632

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