diff --git a/include/llvm/ADT/APFloat.h b/include/llvm/ADT/APFloat.h index c66c154616d..00304230a99 100644 --- a/include/llvm/ADT/APFloat.h +++ b/include/llvm/ADT/APFloat.h @@ -671,41 +671,49 @@ class APFloat : public APFloatBase { Storage(const fltSemantics &Semantics, ArgTypes &&... Args) { if (usesLayout(Semantics)) { new (&IEEE) IEEEFloat(Semantics, std::forward(Args)...); - } else if (usesLayout(Semantics)) { - new (&Double) DoubleAPFloat(Semantics, std::forward(Args)...); - } else { - llvm_unreachable("Unexpected semantics"); + return; } + if (usesLayout(Semantics)) { + new (&Double) DoubleAPFloat(Semantics, std::forward(Args)...); + return; + } + llvm_unreachable("Unexpected semantics"); } ~Storage() { if (usesLayout(*semantics)) { IEEE.~IEEEFloat(); - } else if (usesLayout(*semantics)) { - Double.~DoubleAPFloat(); - } else { - llvm_unreachable("Unexpected semantics"); + return; } + if (usesLayout(*semantics)) { + Double.~DoubleAPFloat(); + return; + } + llvm_unreachable("Unexpected semantics"); } Storage(const Storage &RHS) { if (usesLayout(*RHS.semantics)) { new (this) IEEEFloat(RHS.IEEE); - } else if (usesLayout(*RHS.semantics)) { - new (this) DoubleAPFloat(RHS.Double); - } else { - llvm_unreachable("Unexpected semantics"); + return; } + if (usesLayout(*RHS.semantics)) { + new (this) DoubleAPFloat(RHS.Double); + return; + } + llvm_unreachable("Unexpected semantics"); } Storage(Storage &&RHS) { if (usesLayout(*RHS.semantics)) { new (this) IEEEFloat(std::move(RHS.IEEE)); - } else if (usesLayout(*RHS.semantics)) { - new (this) DoubleAPFloat(std::move(RHS.Double)); - } else { - llvm_unreachable("Unexpected semantics"); + return; } + if (usesLayout(*RHS.semantics)) { + new (this) DoubleAPFloat(std::move(RHS.Double)); + return; + } + llvm_unreachable("Unexpected semantics"); } Storage &operator=(const Storage &RHS) { @@ -747,35 +755,29 @@ class APFloat : public APFloatBase { } IEEEFloat &getIEEE() { - if (usesLayout(*U.semantics)) { + if (usesLayout(*U.semantics)) return U.IEEE; - } else if (usesLayout(*U.semantics)) { + if (usesLayout(*U.semantics)) return U.Double.getFirst().U.IEEE; - } else { - llvm_unreachable("Unexpected semantics"); - } + llvm_unreachable("Unexpected semantics"); } const IEEEFloat &getIEEE() const { - if (usesLayout(*U.semantics)) { + if (usesLayout(*U.semantics)) return U.IEEE; - } else if (usesLayout(*U.semantics)) { + if (usesLayout(*U.semantics)) return U.Double.getFirst().U.IEEE; - } else { - llvm_unreachable("Unexpected semantics"); - } + llvm_unreachable("Unexpected semantics"); } void makeZero(bool Neg) { getIEEE().makeZero(Neg); } void makeInf(bool Neg) { - if (usesLayout(*U.semantics)) { + if (usesLayout(*U.semantics)) return U.IEEE.makeInf(Neg); - } else if (usesLayout(*U.semantics)) { + if (usesLayout(*U.semantics)) return U.Double.makeInf(Neg); - } else { - llvm_unreachable("Unexpected semantics"); - } + llvm_unreachable("Unexpected semantics"); } void makeNaN(bool SNaN, bool Neg, const APInt *fill) { @@ -803,13 +805,11 @@ class APFloat : public APFloatBase { cmpResult compareAbsoluteValue(const APFloat &RHS) const { assert(&getSemantics() == &RHS.getSemantics()); - if (usesLayout(getSemantics())) { + if (usesLayout(getSemantics())) return U.IEEE.compareAbsoluteValue(RHS.U.IEEE); - } else if (usesLayout(getSemantics())) { + if (usesLayout(getSemantics())) return U.Double.compareAbsoluteValue(RHS.U.Double); - } else { - llvm_unreachable("Unexpected semantics"); - } + llvm_unreachable("Unexpected semantics"); } public: @@ -828,13 +828,11 @@ public: ~APFloat() = default; bool needsCleanup() const { - if (usesLayout(getSemantics())) { + if (usesLayout(getSemantics())) return U.IEEE.needsCleanup(); - } else if (usesLayout(getSemantics())) { + if (usesLayout(getSemantics())) return U.Double.needsCleanup(); - } else { - llvm_unreachable("Unexpected semantics"); - } + llvm_unreachable("Unexpected semantics"); } /// Factory for Positive and Negative Zero. @@ -925,22 +923,18 @@ public: void Profile(FoldingSetNodeID &NID) const { getIEEE().Profile(NID); } opStatus add(const APFloat &RHS, roundingMode RM) { - if (usesLayout(getSemantics())) { + if (usesLayout(getSemantics())) return U.IEEE.add(RHS.U.IEEE, RM); - } else if (usesLayout(getSemantics())) { + if (usesLayout(getSemantics())) return U.Double.add(RHS.U.Double, RM); - } else { - llvm_unreachable("Unexpected semantics"); - } + llvm_unreachable("Unexpected semantics"); } opStatus subtract(const APFloat &RHS, roundingMode RM) { - if (usesLayout(getSemantics())) { + if (usesLayout(getSemantics())) return U.IEEE.subtract(RHS.U.IEEE, RM); - } else if (usesLayout(getSemantics())) { + if (usesLayout(getSemantics())) return U.Double.subtract(RHS.U.Double, RM); - } else { - llvm_unreachable("Unexpected semantics"); - } + llvm_unreachable("Unexpected semantics"); } opStatus multiply(const APFloat &RHS, roundingMode RM) { return getIEEE().multiply(RHS.getIEEE(), RM); diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp index 4ad6b07ed2b..30f0deab90a 100644 --- a/lib/Support/APFloat.cpp +++ b/lib/Support/APFloat.cpp @@ -4110,13 +4110,15 @@ void DoubleAPFloat::makeNaN(bool SNaN, bool Neg, const APInt *fill) { APFloat::Storage::Storage(IEEEFloat F, const fltSemantics &Semantics) { if (usesLayout(Semantics)) { new (&IEEE) IEEEFloat(std::move(F)); - } else if (usesLayout(Semantics)) { + return; + } + if (usesLayout(Semantics)) { new (&Double) DoubleAPFloat(Semantics, APFloat(std::move(F), F.getSemantics()), APFloat(semIEEEdouble)); - } else { - llvm_unreachable("Unexpected semantics"); + return; } + llvm_unreachable("Unexpected semantics"); } APFloat::opStatus APFloat::convertFromString(StringRef Str, roundingMode RM) { @@ -4135,24 +4137,24 @@ APFloat::opStatus APFloat::convert(const fltSemantics &ToSemantics, if (&getSemantics() == &ToSemantics) return opOK; if (usesLayout(getSemantics()) && - usesLayout(ToSemantics)) { + usesLayout(ToSemantics)) return U.IEEE.convert(ToSemantics, RM, losesInfo); - } else if (usesLayout(getSemantics()) && - usesLayout(ToSemantics)) { + if (usesLayout(getSemantics()) && + usesLayout(ToSemantics)) { assert(&ToSemantics == &semPPCDoubleDouble); auto Ret = U.IEEE.convert(semPPCDoubleDoubleImpl, RM, losesInfo); - *this = APFloat( - DoubleAPFloat(semPPCDoubleDouble, std::move(*this), APFloat(semIEEEdouble)), - ToSemantics); + *this = APFloat(DoubleAPFloat(semPPCDoubleDouble, std::move(*this), + APFloat(semIEEEdouble)), + ToSemantics); return Ret; - } else if (usesLayout(getSemantics()) && - usesLayout(ToSemantics)) { + } + if (usesLayout(getSemantics()) && + usesLayout(ToSemantics)) { auto Ret = getIEEE().convert(ToSemantics, RM, losesInfo); *this = APFloat(std::move(getIEEE()), ToSemantics); return Ret; - } else { - llvm_unreachable("Unexpected semantics"); } + llvm_unreachable("Unexpected semantics"); } APFloat APFloat::getAllOnesValue(unsigned BitWidth, bool isIEEE) {