Skip to content

Commit a26bf5a

Browse files
committed
RuntimeLibcalls: Remove table of soft float compare cond codes
Previously we had a table of entries for every Libcall for the comparison to use against an integer 0 if it was a soft float compare function. This was only relevant to a handful of opcodes, so it was wasteful. Now that we can distinguish the abstract libcall for the compare with the concrete implementation, we can just directly hardcode the comparison against the libcall impl without this configuration system.
1 parent ff47400 commit a26bf5a

File tree

7 files changed

+182
-200
lines changed

7 files changed

+182
-200
lines changed

llvm/include/llvm/CodeGen/RuntimeLibcallUtil.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,6 @@ LLVM_ABI Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize);
105105
/// UNKNOW_LIBCALL if there is none.
106106
LLVM_ABI Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize);
107107

108-
/// Initialize the default condition code on the libcalls.
109-
LLVM_ABI void initCmpLibcallCCs(ISD::CondCode *CmpLibcallCCs);
110-
111108
} // namespace RTLIB
112109
} // namespace llvm
113110

llvm/include/llvm/CodeGen/TargetLowering.h

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3574,19 +3574,10 @@ class LLVM_ABI TargetLoweringBase {
35743574

35753575
const char *getMemcpyName() const { return Libcalls.getMemcpyName(); }
35763576

3577-
/// Override the default CondCode to be used to test the result of the
3578-
/// comparison libcall against zero.
3579-
/// FIXME: This should be removed
3580-
void setCmpLibcallCC(RTLIB::Libcall Call, CmpInst::Predicate Pred) {
3581-
Libcalls.setSoftFloatCmpLibcallPredicate(Call, Pred);
3582-
}
3583-
3584-
/// Get the CondCode that's to be used to test the result of the comparison
3585-
/// libcall against zero.
3586-
CmpInst::Predicate
3587-
getSoftFloatCmpLibcallPredicate(RTLIB::Libcall Call) const {
3588-
return Libcalls.getSoftFloatCmpLibcallPredicate(Call);
3589-
}
3577+
/// Get the comparison predicate that's to be used to test the result of the
3578+
/// comparison libcall against zero. This should only be used with
3579+
/// floating-point compare libcalls.
3580+
ISD::CondCode getSoftFloatCmpLibcallPredicate(RTLIB::LibcallImpl Call) const;
35903581

35913582
/// Set the CallingConv that should be used for the specified libcall.
35923583
void setLibcallImplCallingConv(RTLIB::LibcallImpl Call, CallingConv::ID CC) {

llvm/include/llvm/IR/RuntimeLibcalls.h

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ struct RuntimeLibcallsInfo {
5959
ExceptionHandling ExceptionModel = ExceptionHandling::None,
6060
FloatABI::ABIType FloatABI = FloatABI::Default,
6161
EABI EABIVersion = EABI::Default, StringRef ABIName = "") {
62-
initSoftFloatCmpLibcallPredicates();
6362
initLibcalls(TT, ExceptionModel, FloatABI, EABIVersion, ABIName);
6463
}
6564

@@ -106,22 +105,6 @@ struct RuntimeLibcallsInfo {
106105
return ArrayRef(LibcallImpls).drop_front();
107106
}
108107

109-
/// Get the comparison predicate that's to be used to test the result of the
110-
/// comparison libcall against zero. This should only be used with
111-
/// floating-point compare libcalls.
112-
// FIXME: This should be a function of RTLIB::LibcallImpl
113-
CmpInst::Predicate
114-
getSoftFloatCmpLibcallPredicate(RTLIB::Libcall Call) const {
115-
return SoftFloatCompareLibcallPredicates[Call];
116-
}
117-
118-
// FIXME: This should be removed. This should be private constant.
119-
// FIXME: This should be a function of RTLIB::LibcallImpl
120-
void setSoftFloatCmpLibcallPredicate(RTLIB::Libcall Call,
121-
CmpInst::Predicate Pred) {
122-
SoftFloatCompareLibcallPredicates[Call] = Pred;
123-
}
124-
125108
/// Return a function name compatible with RTLIB::MEMCPY, or nullptr if fully
126109
/// unsupported.
127110
const char *getMemcpyName() const {
@@ -132,6 +115,11 @@ struct RuntimeLibcallsInfo {
132115
return getLibcallName(RTLIB::MEMMOVE);
133116
}
134117

118+
/// Return the libcall provided by \p Impl
119+
static RTLIB::Libcall getLibcallFromImpl(RTLIB::LibcallImpl Impl) {
120+
return ImplToLibcall[Impl];
121+
}
122+
135123
private:
136124
static const RTLIB::LibcallImpl
137125
DefaultLibcallImpls[RTLIB::UNKNOWN_LIBCALL + 1];
@@ -147,14 +135,6 @@ struct RuntimeLibcallsInfo {
147135
/// implementation.;
148136
CallingConv::ID LibcallImplCallingConvs[RTLIB::NumLibcallImpls] = {};
149137

150-
/// The condition type that should be used to test the result of each of the
151-
/// soft floating-point comparison libcall against integer zero.
152-
///
153-
// FIXME: This is only relevant for the handful of floating-point comparison
154-
// runtime calls; it's excessive to have a table entry for every single
155-
// opcode.
156-
CmpInst::Predicate SoftFloatCompareLibcallPredicates[RTLIB::UNKNOWN_LIBCALL];
157-
158138
/// Names of concrete implementations of runtime calls. e.g. __ashlsi3 for
159139
/// SHL_I32
160140
static const char *const LibCallImplNames[RTLIB::NumLibcallImpls];
@@ -190,8 +170,6 @@ struct RuntimeLibcallsInfo {
190170
/// Generated by tablegen.
191171
void setTargetRuntimeLibcallSets(const Triple &TT);
192172

193-
void initSoftFloatCmpLibcallPredicates();
194-
195173
/// Set default libcall names. If a target wants to opt-out of a libcall it
196174
/// should be placed here.
197175
LLVM_ABI void initLibcalls(const Triple &TT, ExceptionHandling ExceptionModel,

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,13 @@ void TargetLowering::softenSetCCOperands(SelectionDAG &DAG, EVT VT,
424424
NewLHS = Call.first;
425425
NewRHS = DAG.getConstant(0, dl, RetVT);
426426

427-
CCCode = getICmpCondCode(getSoftFloatCmpLibcallPredicate(LC1));
427+
RTLIB::LibcallImpl LC1Impl = getLibcallImpl(LC1);
428+
if (LC1Impl == RTLIB::Unsupported) {
429+
reportFatalUsageError(
430+
"no libcall available to soften floating-point compare");
431+
}
432+
433+
CCCode = getSoftFloatCmpLibcallPredicate(LC1Impl);
428434
if (ShouldInvertCC) {
429435
assert(RetVT.isInteger());
430436
CCCode = getSetCCInverse(CCCode, RetVT);
@@ -434,6 +440,12 @@ void TargetLowering::softenSetCCOperands(SelectionDAG &DAG, EVT VT,
434440
// Update Chain.
435441
Chain = Call.second;
436442
} else {
443+
RTLIB::LibcallImpl LC2Impl = getLibcallImpl(LC2);
444+
if (LC2Impl == RTLIB::Unsupported) {
445+
reportFatalUsageError(
446+
"no libcall available to soften floating-point compare");
447+
}
448+
437449
assert(CCCode == (ShouldInvertCC ? ISD::SETEQ : ISD::SETNE) &&
438450
"unordered call should be simple boolean");
439451

@@ -446,7 +458,7 @@ void TargetLowering::softenSetCCOperands(SelectionDAG &DAG, EVT VT,
446458

447459
SDValue Tmp = DAG.getSetCC(dl, SetCCVT, NewLHS, NewRHS, CCCode);
448460
auto Call2 = makeLibCall(DAG, LC2, RetVT, Ops, CallOptions, dl, Chain);
449-
CCCode = getICmpCondCode(getSoftFloatCmpLibcallPredicate(LC2));
461+
CCCode = getSoftFloatCmpLibcallPredicate(LC2Impl);
450462
if (ShouldInvertCC)
451463
CCCode = getSetCCInverse(CCCode, RetVT);
452464
NewLHS = DAG.getSetCC(dl, SetCCVT, Call2.first, NewRHS, CCCode);

llvm/lib/CodeGen/TargetLoweringBase.cpp

Lines changed: 74 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -597,37 +597,80 @@ RTLIB::Libcall RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) {
597597
}
598598
}
599599

600-
void RTLIB::initCmpLibcallCCs(ISD::CondCode *CmpLibcallCCs) {
601-
std::fill(CmpLibcallCCs, CmpLibcallCCs + RTLIB::UNKNOWN_LIBCALL,
602-
ISD::SETCC_INVALID);
603-
CmpLibcallCCs[RTLIB::OEQ_F32] = ISD::SETEQ;
604-
CmpLibcallCCs[RTLIB::OEQ_F64] = ISD::SETEQ;
605-
CmpLibcallCCs[RTLIB::OEQ_F128] = ISD::SETEQ;
606-
CmpLibcallCCs[RTLIB::OEQ_PPCF128] = ISD::SETEQ;
607-
CmpLibcallCCs[RTLIB::UNE_F32] = ISD::SETNE;
608-
CmpLibcallCCs[RTLIB::UNE_F64] = ISD::SETNE;
609-
CmpLibcallCCs[RTLIB::UNE_F128] = ISD::SETNE;
610-
CmpLibcallCCs[RTLIB::UNE_PPCF128] = ISD::SETNE;
611-
CmpLibcallCCs[RTLIB::OGE_F32] = ISD::SETGE;
612-
CmpLibcallCCs[RTLIB::OGE_F64] = ISD::SETGE;
613-
CmpLibcallCCs[RTLIB::OGE_F128] = ISD::SETGE;
614-
CmpLibcallCCs[RTLIB::OGE_PPCF128] = ISD::SETGE;
615-
CmpLibcallCCs[RTLIB::OLT_F32] = ISD::SETLT;
616-
CmpLibcallCCs[RTLIB::OLT_F64] = ISD::SETLT;
617-
CmpLibcallCCs[RTLIB::OLT_F128] = ISD::SETLT;
618-
CmpLibcallCCs[RTLIB::OLT_PPCF128] = ISD::SETLT;
619-
CmpLibcallCCs[RTLIB::OLE_F32] = ISD::SETLE;
620-
CmpLibcallCCs[RTLIB::OLE_F64] = ISD::SETLE;
621-
CmpLibcallCCs[RTLIB::OLE_F128] = ISD::SETLE;
622-
CmpLibcallCCs[RTLIB::OLE_PPCF128] = ISD::SETLE;
623-
CmpLibcallCCs[RTLIB::OGT_F32] = ISD::SETGT;
624-
CmpLibcallCCs[RTLIB::OGT_F64] = ISD::SETGT;
625-
CmpLibcallCCs[RTLIB::OGT_F128] = ISD::SETGT;
626-
CmpLibcallCCs[RTLIB::OGT_PPCF128] = ISD::SETGT;
627-
CmpLibcallCCs[RTLIB::UO_F32] = ISD::SETNE;
628-
CmpLibcallCCs[RTLIB::UO_F64] = ISD::SETNE;
629-
CmpLibcallCCs[RTLIB::UO_F128] = ISD::SETNE;
630-
CmpLibcallCCs[RTLIB::UO_PPCF128] = ISD::SETNE;
600+
ISD::CondCode TargetLoweringBase::getSoftFloatCmpLibcallPredicate(
601+
RTLIB::LibcallImpl Impl) const {
602+
switch (Impl) {
603+
case RTLIB::__aeabi_dcmpeq__ne:
604+
return ISD::SETNE;
605+
case RTLIB::__aeabi_dcmpeq__eq:
606+
return ISD::SETEQ;
607+
case RTLIB::__aeabi_dcmplt:
608+
return ISD::SETNE;
609+
case RTLIB::__aeabi_dcmple:
610+
return ISD::SETNE;
611+
case RTLIB::__aeabi_dcmpge:
612+
return ISD::SETNE;
613+
case RTLIB::__aeabi_dcmpgt:
614+
return ISD::SETNE;
615+
case RTLIB::__aeabi_dcmpun:
616+
return ISD::SETNE;
617+
case RTLIB::__aeabi_fcmpeq__ne:
618+
return ISD::SETNE;
619+
case RTLIB::__aeabi_fcmpeq__eq:
620+
return ISD::SETEQ;
621+
case RTLIB::__aeabi_fcmplt:
622+
return ISD::SETNE;
623+
case RTLIB::__aeabi_fcmple:
624+
return ISD::SETNE;
625+
case RTLIB::__aeabi_fcmpge:
626+
return ISD::SETNE;
627+
case RTLIB::__aeabi_fcmpgt:
628+
return ISD::SETNE;
629+
default:
630+
break;
631+
}
632+
633+
// Assume libgcc/compiler-rt behavior
634+
RTLIB::Libcall LC = RTLIB::RuntimeLibcallsInfo::getLibcallFromImpl(Impl);
635+
switch (LC) {
636+
case RTLIB::OEQ_F32:
637+
case RTLIB::OEQ_F64:
638+
case RTLIB::OEQ_F128:
639+
case RTLIB::OEQ_PPCF128:
640+
return ISD::SETEQ;
641+
case RTLIB::UNE_F32:
642+
case RTLIB::UNE_F64:
643+
case RTLIB::UNE_F128:
644+
case RTLIB::UNE_PPCF128:
645+
return ISD::SETNE;
646+
case RTLIB::OGE_F32:
647+
case RTLIB::OGE_F64:
648+
case RTLIB::OGE_F128:
649+
case RTLIB::OGE_PPCF128:
650+
return ISD::SETGE;
651+
case RTLIB::OLT_F32:
652+
case RTLIB::OLT_F64:
653+
case RTLIB::OLT_F128:
654+
case RTLIB::OLT_PPCF128:
655+
return ISD::SETLT;
656+
case RTLIB::OLE_F32:
657+
case RTLIB::OLE_F64:
658+
case RTLIB::OLE_F128:
659+
case RTLIB::OLE_PPCF128:
660+
return ISD::SETLE;
661+
case RTLIB::OGT_F32:
662+
case RTLIB::OGT_F64:
663+
case RTLIB::OGT_F128:
664+
case RTLIB::OGT_PPCF128:
665+
return ISD::SETGT;
666+
case RTLIB::UO_F32:
667+
case RTLIB::UO_F64:
668+
case RTLIB::UO_F128:
669+
case RTLIB::UO_PPCF128:
670+
return ISD::SETNE;
671+
default:
672+
llvm_unreachable("not a compare libcall");
673+
}
631674
}
632675

633676
/// NOTE: The TargetMachine owns TLOF.
@@ -666,8 +709,6 @@ TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm)
666709

667710
MinCmpXchgSizeInBits = 0;
668711
SupportsUnalignedAtomics = false;
669-
670-
RTLIB::initCmpLibcallCCs(CmpLibcallCCs);
671712
}
672713

673714
// Define the virtual destructor out-of-line to act as a key method to anchor

llvm/lib/IR/RuntimeLibcalls.cpp

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -100,37 +100,6 @@ static void setARMLibcallNames(RuntimeLibcallsInfo &Info, const Triple &TT,
100100
}
101101
}
102102

103-
void RuntimeLibcallsInfo::initSoftFloatCmpLibcallPredicates() {
104-
SoftFloatCompareLibcallPredicates[RTLIB::OEQ_F32] = CmpInst::ICMP_EQ;
105-
SoftFloatCompareLibcallPredicates[RTLIB::OEQ_F64] = CmpInst::ICMP_EQ;
106-
SoftFloatCompareLibcallPredicates[RTLIB::OEQ_F128] = CmpInst::ICMP_EQ;
107-
SoftFloatCompareLibcallPredicates[RTLIB::OEQ_PPCF128] = CmpInst::ICMP_EQ;
108-
SoftFloatCompareLibcallPredicates[RTLIB::UNE_F32] = CmpInst::ICMP_NE;
109-
SoftFloatCompareLibcallPredicates[RTLIB::UNE_F64] = CmpInst::ICMP_NE;
110-
SoftFloatCompareLibcallPredicates[RTLIB::UNE_F128] = CmpInst::ICMP_NE;
111-
SoftFloatCompareLibcallPredicates[RTLIB::UNE_PPCF128] = CmpInst::ICMP_NE;
112-
SoftFloatCompareLibcallPredicates[RTLIB::OGE_F32] = CmpInst::ICMP_SGE;
113-
SoftFloatCompareLibcallPredicates[RTLIB::OGE_F64] = CmpInst::ICMP_SGE;
114-
SoftFloatCompareLibcallPredicates[RTLIB::OGE_F128] = CmpInst::ICMP_SGE;
115-
SoftFloatCompareLibcallPredicates[RTLIB::OGE_PPCF128] = CmpInst::ICMP_SGE;
116-
SoftFloatCompareLibcallPredicates[RTLIB::OLT_F32] = CmpInst::ICMP_SLT;
117-
SoftFloatCompareLibcallPredicates[RTLIB::OLT_F64] = CmpInst::ICMP_SLT;
118-
SoftFloatCompareLibcallPredicates[RTLIB::OLT_F128] = CmpInst::ICMP_SLT;
119-
SoftFloatCompareLibcallPredicates[RTLIB::OLT_PPCF128] = CmpInst::ICMP_SLT;
120-
SoftFloatCompareLibcallPredicates[RTLIB::OLE_F32] = CmpInst::ICMP_SLE;
121-
SoftFloatCompareLibcallPredicates[RTLIB::OLE_F64] = CmpInst::ICMP_SLE;
122-
SoftFloatCompareLibcallPredicates[RTLIB::OLE_F128] = CmpInst::ICMP_SLE;
123-
SoftFloatCompareLibcallPredicates[RTLIB::OLE_PPCF128] = CmpInst::ICMP_SLE;
124-
SoftFloatCompareLibcallPredicates[RTLIB::OGT_F32] = CmpInst::ICMP_SGT;
125-
SoftFloatCompareLibcallPredicates[RTLIB::OGT_F64] = CmpInst::ICMP_SGT;
126-
SoftFloatCompareLibcallPredicates[RTLIB::OGT_F128] = CmpInst::ICMP_SGT;
127-
SoftFloatCompareLibcallPredicates[RTLIB::OGT_PPCF128] = CmpInst::ICMP_SGT;
128-
SoftFloatCompareLibcallPredicates[RTLIB::UO_F32] = CmpInst::ICMP_NE;
129-
SoftFloatCompareLibcallPredicates[RTLIB::UO_F64] = CmpInst::ICMP_NE;
130-
SoftFloatCompareLibcallPredicates[RTLIB::UO_F128] = CmpInst::ICMP_NE;
131-
SoftFloatCompareLibcallPredicates[RTLIB::UO_PPCF128] = CmpInst::ICMP_NE;
132-
}
133-
134103
static void setLongDoubleIsF128Libm(RuntimeLibcallsInfo &Info,
135104
bool FiniteOnlyFuncs = false) {
136105
Info.setLibcallImpl(RTLIB::REM_F128, RTLIB::fmodf128);

0 commit comments

Comments
 (0)