Index: llvm/trunk/include/llvm/ADT/APFloat.h =================================================================== --- llvm/trunk/include/llvm/ADT/APFloat.h +++ llvm/trunk/include/llvm/ADT/APFloat.h @@ -671,41 +671,49 @@ Storage(const fltSemantics &Semantics, ArgTypes &&... Args) { if (usesLayout(Semantics)) { new (&IEEE) IEEEFloat(Semantics, std::forward(Args)...); - } else if (usesLayout(Semantics)) { + return; + } + if (usesLayout(Semantics)) { new (&Double) DoubleAPFloat(Semantics, std::forward(Args)...); - } else { - llvm_unreachable("Unexpected semantics"); + return; } + llvm_unreachable("Unexpected semantics"); } ~Storage() { if (usesLayout(*semantics)) { IEEE.~IEEEFloat(); - } else if (usesLayout(*semantics)) { + return; + } + if (usesLayout(*semantics)) { Double.~DoubleAPFloat(); - } else { - llvm_unreachable("Unexpected semantics"); + return; } + llvm_unreachable("Unexpected semantics"); } Storage(const Storage &RHS) { if (usesLayout(*RHS.semantics)) { new (this) IEEEFloat(RHS.IEEE); - } else if (usesLayout(*RHS.semantics)) { + return; + } + if (usesLayout(*RHS.semantics)) { new (this) DoubleAPFloat(RHS.Double); - } else { - llvm_unreachable("Unexpected semantics"); + return; } + llvm_unreachable("Unexpected semantics"); } Storage(Storage &&RHS) { if (usesLayout(*RHS.semantics)) { new (this) IEEEFloat(std::move(RHS.IEEE)); - } else if (usesLayout(*RHS.semantics)) { + return; + } + if (usesLayout(*RHS.semantics)) { new (this) DoubleAPFloat(std::move(RHS.Double)); - } else { - llvm_unreachable("Unexpected semantics"); + return; } + llvm_unreachable("Unexpected semantics"); } Storage &operator=(const Storage &RHS) { @@ -747,35 +755,29 @@ } 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 @@ 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 @@ ~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 @@ 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); Index: llvm/trunk/lib/Support/APFloat.cpp =================================================================== --- llvm/trunk/lib/Support/APFloat.cpp +++ llvm/trunk/lib/Support/APFloat.cpp @@ -4110,13 +4110,15 @@ 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 @@ 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) {