Skip to content

Commit 6004f55

Browse files
authored
[ADT][APFloat] Make sure EBO is performed on APFloat (#111641)
Since both APFloat and (Double)IEEEFloat inherit from APFloatBase, empty base optimization is not performed by GCC/Clang (Minimal reproducer: https://godbolt.org/z/dY8cM3Wre). This patch removes inheritance relation between (Double)IEEEFloat and APFloatBase to make sure EBO is performed on APFloat. After this patch, the size of `ConstantFPRange` will be reduced from 72 to 56. Address comment #111544 (comment).
1 parent baa1fc9 commit 6004f55

File tree

2 files changed

+106
-72
lines changed

2 files changed

+106
-72
lines changed

llvm/include/llvm/ADT/APFloat.h

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,38 @@ struct APFloatBase {
322322

323323
namespace detail {
324324

325-
class IEEEFloat final : public APFloatBase {
325+
using integerPart = APFloatBase::integerPart;
326+
using uninitializedTag = APFloatBase::uninitializedTag;
327+
using roundingMode = APFloatBase::roundingMode;
328+
using opStatus = APFloatBase::opStatus;
329+
using cmpResult = APFloatBase::cmpResult;
330+
using fltCategory = APFloatBase::fltCategory;
331+
using ExponentType = APFloatBase::ExponentType;
332+
static constexpr uninitializedTag uninitialized = APFloatBase::uninitialized;
333+
static constexpr roundingMode rmNearestTiesToEven =
334+
APFloatBase::rmNearestTiesToEven;
335+
static constexpr roundingMode rmNearestTiesToAway =
336+
APFloatBase::rmNearestTiesToAway;
337+
static constexpr roundingMode rmTowardNegative = APFloatBase::rmTowardNegative;
338+
static constexpr roundingMode rmTowardPositive = APFloatBase::rmTowardPositive;
339+
static constexpr roundingMode rmTowardZero = APFloatBase::rmTowardZero;
340+
static constexpr unsigned integerPartWidth = APFloatBase::integerPartWidth;
341+
static constexpr cmpResult cmpEqual = APFloatBase::cmpEqual;
342+
static constexpr cmpResult cmpLessThan = APFloatBase::cmpLessThan;
343+
static constexpr cmpResult cmpGreaterThan = APFloatBase::cmpGreaterThan;
344+
static constexpr cmpResult cmpUnordered = APFloatBase::cmpUnordered;
345+
static constexpr opStatus opOK = APFloatBase::opOK;
346+
static constexpr opStatus opInvalidOp = APFloatBase::opInvalidOp;
347+
static constexpr opStatus opDivByZero = APFloatBase::opDivByZero;
348+
static constexpr opStatus opOverflow = APFloatBase::opOverflow;
349+
static constexpr opStatus opUnderflow = APFloatBase::opUnderflow;
350+
static constexpr opStatus opInexact = APFloatBase::opInexact;
351+
static constexpr fltCategory fcInfinity = APFloatBase::fcInfinity;
352+
static constexpr fltCategory fcNaN = APFloatBase::fcNaN;
353+
static constexpr fltCategory fcNormal = APFloatBase::fcNormal;
354+
static constexpr fltCategory fcZero = APFloatBase::fcZero;
355+
356+
class IEEEFloat final {
326357
public:
327358
/// \name Constructors
328359
/// @{
@@ -433,7 +464,7 @@ class IEEEFloat final : public APFloatBase {
433464
bool isFinite() const { return !isNaN() && !isInfinity(); }
434465

435466
/// Returns true if and only if the float is plus or minus zero.
436-
bool isZero() const { return category == fcZero; }
467+
bool isZero() const { return category == fltCategory::fcZero; }
437468

438469
/// IEEE-754R isSubnormal(): Returns true if and only if the float is a
439470
/// denormal.
@@ -455,7 +486,7 @@ class IEEEFloat final : public APFloatBase {
455486

456487
fltCategory getCategory() const { return category; }
457488
const fltSemantics &getSemantics() const { return *semantics; }
458-
bool isNonZero() const { return category != fcZero; }
489+
bool isNonZero() const { return category != fltCategory::fcZero; }
459490
bool isFiniteNonZero() const { return isFinite() && !isZero(); }
460491
bool isPosZero() const { return isZero() && !isNegative(); }
461492
bool isNegZero() const { return isZero() && isNegative(); }
@@ -719,14 +750,14 @@ class IEEEFloat final : public APFloatBase {
719750

720751
hash_code hash_value(const IEEEFloat &Arg);
721752
int ilogb(const IEEEFloat &Arg);
722-
IEEEFloat scalbn(IEEEFloat X, int Exp, IEEEFloat::roundingMode);
723-
IEEEFloat frexp(const IEEEFloat &Val, int &Exp, IEEEFloat::roundingMode RM);
753+
IEEEFloat scalbn(IEEEFloat X, int Exp, roundingMode);
754+
IEEEFloat frexp(const IEEEFloat &Val, int &Exp, roundingMode RM);
724755

725756
// This mode implements more precise float in terms of two APFloats.
726757
// The interface and layout is designed for arbitrary underlying semantics,
727758
// though currently only PPCDoubleDouble semantics are supported, whose
728759
// corresponding underlying semantics are IEEEdouble.
729-
class DoubleAPFloat final : public APFloatBase {
760+
class DoubleAPFloat final {
730761
// Note: this must be the first data member.
731762
const fltSemantics *Semantics;
732763
std::unique_ptr<APFloat[]> Floats;
@@ -819,8 +850,8 @@ class DoubleAPFloat final : public APFloatBase {
819850
};
820851

821852
hash_code hash_value(const DoubleAPFloat &Arg);
822-
DoubleAPFloat scalbn(const DoubleAPFloat &Arg, int Exp, IEEEFloat::roundingMode RM);
823-
DoubleAPFloat frexp(const DoubleAPFloat &X, int &Exp, IEEEFloat::roundingMode);
853+
DoubleAPFloat scalbn(const DoubleAPFloat &Arg, int Exp, roundingMode RM);
854+
DoubleAPFloat frexp(const DoubleAPFloat &X, int &Exp, roundingMode);
824855

825856
} // End detail namespace
826857

@@ -1440,6 +1471,9 @@ class APFloat : public APFloatBase {
14401471
friend DoubleAPFloat;
14411472
};
14421473

1474+
static_assert(sizeof(APFloat) == sizeof(detail::IEEEFloat),
1475+
"Empty base class optimization is not performed.");
1476+
14431477
/// See friend declarations above.
14441478
///
14451479
/// These additional declarations are required in order to compile LLVM with IBM

0 commit comments

Comments
 (0)