Skip to content

Commit dc69b00

Browse files
authored
RuntimeLibcalls: Remove table of soft float compare cond codes (#146082)
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 1d3b2c5 commit dc69b00

File tree

8 files changed

+185
-205
lines changed

8 files changed

+185
-205
lines changed

llvm/include/llvm/CodeGen/RuntimeLibcallUtil.h

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

120-
/// Initialize the default condition code on the libcalls.
121-
LLVM_ABI void initCmpLibcallCCs(ISD::CondCode *CmpLibcallCCs);
122-
123120
} // namespace RTLIB
124121
} // namespace llvm
125122

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_back();
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
LLVM_ABI 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-
LLVM_ABI 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/include/llvm/IR/RuntimeLibcalls.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,8 +1176,8 @@ def __aeabi_dsub : RuntimeLibcallImpl<SUB_F64>; // CallingConv::ARM_AAPCS
11761176

11771177
// Double-precision floating-point comparison helper functions
11781178
// RTABI chapter 4.1.2, Table 3
1179-
def __aeabi_dcmpeq__ne : RuntimeLibcallImpl<OEQ_F64, "__aeabi_dcmpeq">; // CallingConv::ARM_AAPCS, CmpInst::ICMP_NE
1180-
def __aeabi_dcmpeq__eq : RuntimeLibcallImpl<UNE_F64, "__aeabi_dcmpeq">; // CallingConv::ARM_AAPCS, CmpInst::ICMP_EQ
1179+
def __aeabi_dcmpeq__oeq : RuntimeLibcallImpl<OEQ_F64, "__aeabi_dcmpeq">; // CallingConv::ARM_AAPCS, CmpInst::ICMP_NE
1180+
def __aeabi_dcmpeq__une : RuntimeLibcallImpl<UNE_F64, "__aeabi_dcmpeq">; // CallingConv::ARM_AAPCS, CmpInst::ICMP_EQ
11811181
def __aeabi_dcmplt : RuntimeLibcallImpl<OLT_F64>; // CallingConv::ARM_AAPCS, CmpInst::ICMP_NE
11821182
def __aeabi_dcmple : RuntimeLibcallImpl<OLE_F64>; // CallingConv::ARM_AAPCS, CmpInst::ICMP_NE
11831183
def __aeabi_dcmpge : RuntimeLibcallImpl<OGE_F64>; // CallingConv::ARM_AAPCS, CmpInst::ICMP_NE
@@ -1193,8 +1193,8 @@ def __aeabi_fsub : RuntimeLibcallImpl<SUB_F32>; // CallingConv::ARM_AAPCS
11931193

11941194
// Single-precision floating-point comparison helper functions
11951195
// RTABI chapter 4.1.2, Table 5
1196-
def __aeabi_fcmpeq__ne : RuntimeLibcallImpl<OEQ_F32, "__aeabi_fcmpeq">; // CallingConv::ARM_AAPCS, CmpInst::ICMP_NE
1197-
def __aeabi_fcmpeq__eq : RuntimeLibcallImpl<UNE_F32, "__aeabi_fcmpeq">; // CallingConv::ARM_AAPCS, CmpInst::ICMP_EQ
1196+
def __aeabi_fcmpeq__oeq : RuntimeLibcallImpl<OEQ_F32, "__aeabi_fcmpeq">; // CallingConv::ARM_AAPCS, CmpInst::ICMP_NE
1197+
def __aeabi_fcmpeq__une : RuntimeLibcallImpl<UNE_F32, "__aeabi_fcmpeq">; // CallingConv::ARM_AAPCS, CmpInst::ICMP_EQ
11981198
def __aeabi_fcmplt : RuntimeLibcallImpl<OLT_F32>; // CallingConv::ARM_AAPCS, CmpInst::ICMP_NE
11991199
def __aeabi_fcmple : RuntimeLibcallImpl<OLE_F32>; // CallingConv::ARM_AAPCS, CmpInst::ICMP_NE
12001200
def __aeabi_fcmpge : RuntimeLibcallImpl<OGE_F32>; // CallingConv::ARM_AAPCS, CmpInst::ICMP_NE

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: 73 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -609,37 +609,79 @@ RTLIB::Libcall RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) {
609609
}
610610
}
611611

612-
void RTLIB::initCmpLibcallCCs(ISD::CondCode *CmpLibcallCCs) {
613-
std::fill(CmpLibcallCCs, CmpLibcallCCs + RTLIB::UNKNOWN_LIBCALL,
614-
ISD::SETCC_INVALID);
615-
CmpLibcallCCs[RTLIB::OEQ_F32] = ISD::SETEQ;
616-
CmpLibcallCCs[RTLIB::OEQ_F64] = ISD::SETEQ;
617-
CmpLibcallCCs[RTLIB::OEQ_F128] = ISD::SETEQ;
618-
CmpLibcallCCs[RTLIB::OEQ_PPCF128] = ISD::SETEQ;
619-
CmpLibcallCCs[RTLIB::UNE_F32] = ISD::SETNE;
620-
CmpLibcallCCs[RTLIB::UNE_F64] = ISD::SETNE;
621-
CmpLibcallCCs[RTLIB::UNE_F128] = ISD::SETNE;
622-
CmpLibcallCCs[RTLIB::UNE_PPCF128] = ISD::SETNE;
623-
CmpLibcallCCs[RTLIB::OGE_F32] = ISD::SETGE;
624-
CmpLibcallCCs[RTLIB::OGE_F64] = ISD::SETGE;
625-
CmpLibcallCCs[RTLIB::OGE_F128] = ISD::SETGE;
626-
CmpLibcallCCs[RTLIB::OGE_PPCF128] = ISD::SETGE;
627-
CmpLibcallCCs[RTLIB::OLT_F32] = ISD::SETLT;
628-
CmpLibcallCCs[RTLIB::OLT_F64] = ISD::SETLT;
629-
CmpLibcallCCs[RTLIB::OLT_F128] = ISD::SETLT;
630-
CmpLibcallCCs[RTLIB::OLT_PPCF128] = ISD::SETLT;
631-
CmpLibcallCCs[RTLIB::OLE_F32] = ISD::SETLE;
632-
CmpLibcallCCs[RTLIB::OLE_F64] = ISD::SETLE;
633-
CmpLibcallCCs[RTLIB::OLE_F128] = ISD::SETLE;
634-
CmpLibcallCCs[RTLIB::OLE_PPCF128] = ISD::SETLE;
635-
CmpLibcallCCs[RTLIB::OGT_F32] = ISD::SETGT;
636-
CmpLibcallCCs[RTLIB::OGT_F64] = ISD::SETGT;
637-
CmpLibcallCCs[RTLIB::OGT_F128] = ISD::SETGT;
638-
CmpLibcallCCs[RTLIB::OGT_PPCF128] = ISD::SETGT;
639-
CmpLibcallCCs[RTLIB::UO_F32] = ISD::SETNE;
640-
CmpLibcallCCs[RTLIB::UO_F64] = ISD::SETNE;
641-
CmpLibcallCCs[RTLIB::UO_F128] = ISD::SETNE;
642-
CmpLibcallCCs[RTLIB::UO_PPCF128] = ISD::SETNE;
612+
ISD::CondCode TargetLoweringBase::getSoftFloatCmpLibcallPredicate(
613+
RTLIB::LibcallImpl Impl) const {
614+
switch (Impl) {
615+
case RTLIB::__aeabi_dcmpeq__une:
616+
case RTLIB::__aeabi_fcmpeq__une:
617+
// Usage in the eq case, so we have to invert the comparison.
618+
return ISD::SETEQ;
619+
case RTLIB::__aeabi_dcmpeq__oeq:
620+
case RTLIB::__aeabi_fcmpeq__oeq:
621+
// Normal comparison to boolean value.
622+
return ISD::SETNE;
623+
case RTLIB::__aeabi_dcmplt:
624+
case RTLIB::__aeabi_dcmple:
625+
case RTLIB::__aeabi_dcmpge:
626+
case RTLIB::__aeabi_dcmpgt:
627+
case RTLIB::__aeabi_dcmpun:
628+
case RTLIB::__aeabi_fcmplt:
629+
case RTLIB::__aeabi_fcmple:
630+
case RTLIB::__aeabi_fcmpge:
631+
case RTLIB::__aeabi_fcmpgt:
632+
/// The AEABI versions return a typical boolean value, so we can compare
633+
/// against the integer result as simply != 0.
634+
return ISD::SETNE;
635+
default:
636+
break;
637+
}
638+
639+
// Assume libgcc/compiler-rt behavior. Most of the cases are really aliases of
640+
// each other, and return a 3-way comparison style result of -1, 0, or 1
641+
// depending on lt/eq/gt.
642+
//
643+
// FIXME: It would be cleaner to directly express this as a 3-way comparison
644+
// soft FP libcall instead of individual compares.
645+
RTLIB::Libcall LC = RTLIB::RuntimeLibcallsInfo::getLibcallFromImpl(Impl);
646+
switch (LC) {
647+
case RTLIB::OEQ_F32:
648+
case RTLIB::OEQ_F64:
649+
case RTLIB::OEQ_F128:
650+
case RTLIB::OEQ_PPCF128:
651+
return ISD::SETEQ;
652+
case RTLIB::UNE_F32:
653+
case RTLIB::UNE_F64:
654+
case RTLIB::UNE_F128:
655+
case RTLIB::UNE_PPCF128:
656+
return ISD::SETNE;
657+
case RTLIB::OGE_F32:
658+
case RTLIB::OGE_F64:
659+
case RTLIB::OGE_F128:
660+
case RTLIB::OGE_PPCF128:
661+
return ISD::SETGE;
662+
case RTLIB::OLT_F32:
663+
case RTLIB::OLT_F64:
664+
case RTLIB::OLT_F128:
665+
case RTLIB::OLT_PPCF128:
666+
return ISD::SETLT;
667+
case RTLIB::OLE_F32:
668+
case RTLIB::OLE_F64:
669+
case RTLIB::OLE_F128:
670+
case RTLIB::OLE_PPCF128:
671+
return ISD::SETLE;
672+
case RTLIB::OGT_F32:
673+
case RTLIB::OGT_F64:
674+
case RTLIB::OGT_F128:
675+
case RTLIB::OGT_PPCF128:
676+
return ISD::SETGT;
677+
case RTLIB::UO_F32:
678+
case RTLIB::UO_F64:
679+
case RTLIB::UO_F128:
680+
case RTLIB::UO_PPCF128:
681+
return ISD::SETNE;
682+
default:
683+
llvm_unreachable("not a compare libcall");
684+
}
643685
}
644686

645687
/// NOTE: The TargetMachine owns TLOF.
@@ -678,8 +720,6 @@ TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm)
678720

679721
MinCmpXchgSizeInBits = 0;
680722
SupportsUnalignedAtomics = false;
681-
682-
RTLIB::initCmpLibcallCCs(CmpLibcallCCs);
683723
}
684724

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