Skip to content

Commit 48fcd78

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 e8b5aa1 commit 48fcd78

File tree

7 files changed

+182
-201
lines changed

7 files changed

+182
-201
lines changed

llvm/include/llvm/CodeGen/RuntimeLibcallUtil.h

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

112-
/// Initialize the default condition code on the libcalls.
113-
LLVM_ABI void initCmpLibcallCCs(ISD::CondCode *CmpLibcallCCs);
114-
115112
} // namespace RTLIB
116113
} // namespace llvm
117114

llvm/include/llvm/CodeGen/TargetLowering.h

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

35723572
const char *getMemcpyName() const { return Libcalls.getMemcpyName(); }
35733573

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

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

llvm/include/llvm/IR/RuntimeLibcalls.h

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,6 @@ struct RuntimeLibcallsInfo {
5959
ExceptionHandling ExceptionModel = ExceptionHandling::None,
6060
FloatABI::ABIType FloatABI = FloatABI::Default,
6161
EABI EABIVersion = EABI::Default, StringRef ABIName = "") {
62-
initSoftFloatCmpLibcallPredicates();
63-
6462
// FIXME: The ExceptionModel parameter is to handle the field in
6563
// TargetOptions. This interface fails to distinguish the forced disable
6664
// case for targets which support exceptions by default. This should
@@ -114,22 +112,6 @@ struct RuntimeLibcallsInfo {
114112
return ArrayRef(LibcallImpls).drop_front();
115113
}
116114

117-
/// Get the comparison predicate that's to be used to test the result of the
118-
/// comparison libcall against zero. This should only be used with
119-
/// floating-point compare libcalls.
120-
// FIXME: This should be a function of RTLIB::LibcallImpl
121-
CmpInst::Predicate
122-
getSoftFloatCmpLibcallPredicate(RTLIB::Libcall Call) const {
123-
return SoftFloatCompareLibcallPredicates[Call];
124-
}
125-
126-
// FIXME: This should be removed. This should be private constant.
127-
// FIXME: This should be a function of RTLIB::LibcallImpl
128-
void setSoftFloatCmpLibcallPredicate(RTLIB::Libcall Call,
129-
CmpInst::Predicate Pred) {
130-
SoftFloatCompareLibcallPredicates[Call] = Pred;
131-
}
132-
133115
/// Return a function name compatible with RTLIB::MEMCPY, or nullptr if fully
134116
/// unsupported.
135117
const char *getMemcpyName() const {
@@ -140,6 +122,11 @@ struct RuntimeLibcallsInfo {
140122
return getLibcallName(RTLIB::MEMMOVE);
141123
}
142124

125+
/// Return the libcall provided by \p Impl
126+
static RTLIB::Libcall getLibcallFromImpl(RTLIB::LibcallImpl Impl) {
127+
return ImplToLibcall[Impl];
128+
}
129+
143130
private:
144131
static const RTLIB::LibcallImpl
145132
DefaultLibcallImpls[RTLIB::UNKNOWN_LIBCALL + 1];
@@ -155,14 +142,6 @@ struct RuntimeLibcallsInfo {
155142
/// implementation.;
156143
CallingConv::ID LibcallImplCallingConvs[RTLIB::NumLibcallImpls] = {};
157144

158-
/// The condition type that should be used to test the result of each of the
159-
/// soft floating-point comparison libcall against integer zero.
160-
///
161-
// FIXME: This is only relevant for the handful of floating-point comparison
162-
// runtime calls; it's excessive to have a table entry for every single
163-
// opcode.
164-
CmpInst::Predicate SoftFloatCompareLibcallPredicates[RTLIB::UNKNOWN_LIBCALL];
165-
166145
/// Names of concrete implementations of runtime calls. e.g. __ashlsi3 for
167146
/// SHL_I32
168147
static const char *const LibCallImplNames[RTLIB::NumLibcallImpls];
@@ -200,8 +179,6 @@ struct RuntimeLibcallsInfo {
200179
/// Generated by tablegen.
201180
void setTargetRuntimeLibcallSets(const Triple &TT);
202181

203-
void initSoftFloatCmpLibcallPredicates();
204-
205182
/// Set default libcall names. If a target wants to opt-out of a libcall it
206183
/// should be placed here.
207184
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
@@ -601,37 +601,80 @@ RTLIB::Libcall RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) {
601601
}
602602
}
603603

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

637680
/// NOTE: The TargetMachine owns TLOF.
@@ -670,8 +713,6 @@ TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm)
670713

671714
MinCmpXchgSizeInBits = 0;
672715
SupportsUnalignedAtomics = false;
673-
674-
RTLIB::initCmpLibcallCCs(CmpLibcallCCs);
675716
}
676717

677718
// 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)