Skip to content

Commit eadf4fe

Browse files
dtcxzywgithub-actions[bot]
authored andcommitted
Automerge: [APFloat] Inline static getters (#163794)
This patch exposes the declaration of fltSemantics to inline PPCDoubleDouble() calls in the IEEEFloat/DoubleAPFloat dispatch. It slightly improves the compile time: https://llvm-compile-time-tracker.com/compare.php?from=f4359301c033694d36865c7560714164d2050240&to=68de94d77d5bd33603193e8769829345b18fbae3&stat=instructions:u With llvm/llvm-project#111544, the improvement is more significant: https://llvm-compile-time-tracker.com/compare.php?from=e438bae71d1fd55640d942b9ad795de2f60e44f2&to=04751477940890c092dc4edb74e284de8f746d5a&stat=instructions:u Address comment llvm/llvm-project#111544 (comment). If breaking changes are allowed, we can encode all the properties of fltSemantics within a 64-bit integer. Then we don't need `Semantics <-> const fltSemantic` conversion.
2 parents ca08ba0 + 0f68dc6 commit eadf4fe

File tree

2 files changed

+305
-253
lines changed

2 files changed

+305
-253
lines changed

llvm/include/llvm/ADT/APFloat.h

Lines changed: 62 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,16 @@ enum lostFraction { // Example of truncated bits:
138138
/// New operations: sqrt, IEEE remainder, C90 fmod, nexttoward.
139139
///
140140

141+
namespace detail {
142+
class IEEEFloat;
143+
class DoubleAPFloat;
144+
} // namespace detail
145+
141146
// This is the common type definitions shared by APFloat and its internal
142147
// implementation classes. This struct should not define any non-static data
143148
// members.
144-
struct APFloatBase {
149+
class APFloatBase {
150+
public:
145151
typedef APInt::WordType integerPart;
146152
static constexpr unsigned integerPartWidth = APInt::APINT_BITS_PER_WORD;
147153

@@ -257,30 +263,64 @@ struct APFloatBase {
257263
LLVM_ABI static const llvm::fltSemantics &EnumToSemantics(Semantics S);
258264
LLVM_ABI static Semantics SemanticsToEnum(const llvm::fltSemantics &Sem);
259265

260-
LLVM_ABI static const fltSemantics &IEEEhalf() LLVM_READNONE;
261-
LLVM_ABI static const fltSemantics &BFloat() LLVM_READNONE;
262-
LLVM_ABI static const fltSemantics &IEEEsingle() LLVM_READNONE;
263-
LLVM_ABI static const fltSemantics &IEEEdouble() LLVM_READNONE;
264-
LLVM_ABI static const fltSemantics &IEEEquad() LLVM_READNONE;
265-
LLVM_ABI static const fltSemantics &PPCDoubleDouble() LLVM_READNONE;
266-
LLVM_ABI static const fltSemantics &PPCDoubleDoubleLegacy() LLVM_READNONE;
267-
LLVM_ABI static const fltSemantics &Float8E5M2() LLVM_READNONE;
268-
LLVM_ABI static const fltSemantics &Float8E5M2FNUZ() LLVM_READNONE;
269-
LLVM_ABI static const fltSemantics &Float8E4M3() LLVM_READNONE;
270-
LLVM_ABI static const fltSemantics &Float8E4M3FN() LLVM_READNONE;
271-
LLVM_ABI static const fltSemantics &Float8E4M3FNUZ() LLVM_READNONE;
272-
LLVM_ABI static const fltSemantics &Float8E4M3B11FNUZ() LLVM_READNONE;
273-
LLVM_ABI static const fltSemantics &Float8E3M4() LLVM_READNONE;
274-
LLVM_ABI static const fltSemantics &FloatTF32() LLVM_READNONE;
275-
LLVM_ABI static const fltSemantics &Float8E8M0FNU() LLVM_READNONE;
276-
LLVM_ABI static const fltSemantics &Float6E3M2FN() LLVM_READNONE;
277-
LLVM_ABI static const fltSemantics &Float6E2M3FN() LLVM_READNONE;
278-
LLVM_ABI static const fltSemantics &Float4E2M1FN() LLVM_READNONE;
279-
LLVM_ABI static const fltSemantics &x87DoubleExtended() LLVM_READNONE;
266+
private:
267+
LLVM_ABI static const fltSemantics semIEEEhalf;
268+
LLVM_ABI static const fltSemantics semBFloat;
269+
LLVM_ABI static const fltSemantics semIEEEsingle;
270+
LLVM_ABI static const fltSemantics semIEEEdouble;
271+
LLVM_ABI static const fltSemantics semIEEEquad;
272+
LLVM_ABI static const fltSemantics semFloat8E5M2;
273+
LLVM_ABI static const fltSemantics semFloat8E5M2FNUZ;
274+
LLVM_ABI static const fltSemantics semFloat8E4M3;
275+
LLVM_ABI static const fltSemantics semFloat8E4M3FN;
276+
LLVM_ABI static const fltSemantics semFloat8E4M3FNUZ;
277+
LLVM_ABI static const fltSemantics semFloat8E4M3B11FNUZ;
278+
LLVM_ABI static const fltSemantics semFloat8E3M4;
279+
LLVM_ABI static const fltSemantics semFloatTF32;
280+
LLVM_ABI static const fltSemantics semFloat8E8M0FNU;
281+
LLVM_ABI static const fltSemantics semFloat6E3M2FN;
282+
LLVM_ABI static const fltSemantics semFloat6E2M3FN;
283+
LLVM_ABI static const fltSemantics semFloat4E2M1FN;
284+
LLVM_ABI static const fltSemantics semX87DoubleExtended;
285+
LLVM_ABI static const fltSemantics semBogus;
286+
LLVM_ABI static const fltSemantics semPPCDoubleDouble;
287+
LLVM_ABI static const fltSemantics semPPCDoubleDoubleLegacy;
288+
289+
friend class detail::IEEEFloat;
290+
friend class detail::DoubleAPFloat;
291+
friend class APFloat;
292+
293+
public:
294+
static const fltSemantics &IEEEhalf() { return semIEEEhalf; }
295+
static const fltSemantics &BFloat() { return semBFloat; }
296+
static const fltSemantics &IEEEsingle() { return semIEEEsingle; }
297+
static const fltSemantics &IEEEdouble() { return semIEEEdouble; }
298+
static const fltSemantics &IEEEquad() { return semIEEEquad; }
299+
static const fltSemantics &PPCDoubleDouble() { return semPPCDoubleDouble; }
300+
static const fltSemantics &PPCDoubleDoubleLegacy() {
301+
return semPPCDoubleDoubleLegacy;
302+
}
303+
static const fltSemantics &Float8E5M2() { return semFloat8E5M2; }
304+
static const fltSemantics &Float8E5M2FNUZ() { return semFloat8E5M2FNUZ; }
305+
static const fltSemantics &Float8E4M3() { return semFloat8E4M3; }
306+
static const fltSemantics &Float8E4M3FN() { return semFloat8E4M3FN; }
307+
static const fltSemantics &Float8E4M3FNUZ() { return semFloat8E4M3FNUZ; }
308+
static const fltSemantics &Float8E4M3B11FNUZ() {
309+
return semFloat8E4M3B11FNUZ;
310+
}
311+
static const fltSemantics &Float8E3M4() { return semFloat8E3M4; }
312+
static const fltSemantics &FloatTF32() { return semFloatTF32; }
313+
static const fltSemantics &Float8E8M0FNU() { return semFloat8E8M0FNU; }
314+
static const fltSemantics &Float6E3M2FN() { return semFloat6E3M2FN; }
315+
static const fltSemantics &Float6E2M3FN() { return semFloat6E2M3FN; }
316+
static const fltSemantics &Float4E2M1FN() { return semFloat4E2M1FN; }
317+
static const fltSemantics &x87DoubleExtended() {
318+
return semX87DoubleExtended;
319+
}
280320

281321
/// A Pseudo fltsemantic used to construct APFloats that cannot conflict with
282322
/// anything real.
283-
LLVM_ABI static const fltSemantics &Bogus() LLVM_READNONE;
323+
static const fltSemantics &Bogus() { return semBogus; }
284324

285325
// Returns true if any number described by this semantics can be precisely
286326
// represented by the specified semantics. Does not take into account

0 commit comments

Comments
 (0)