Index: include/llvm/Analysis/ValueTracking.h =================================================================== --- include/llvm/Analysis/ValueTracking.h +++ include/llvm/Analysis/ValueTracking.h @@ -256,8 +256,9 @@ const TargetLibraryInfo *TLI = nullptr); /// isSafeToSpeculativelyExecute - Return true if the instruction does not - /// have any effects besides calculating the result and does not have - /// undefined behavior. + /// have any effects besides calculating the result (in a way that doesn't + /// lose floating-point exceptions or precision when requested via + /// corresponding flags) and does not have undefined behavior. /// /// This method never returns true for an instruction that returns true for /// mayHaveSideEffects; however, this method also does some other checks in Index: include/llvm/IR/Constants.h =================================================================== --- include/llvm/IR/Constants.h +++ include/llvm/IR/Constants.h @@ -26,6 +26,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/IR/Constant.h" #include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/FastMathFlags.h" #include "llvm/IR/OperandTraits.h" namespace llvm { @@ -919,19 +920,24 @@ static Constant *getNot(Constant *C); static Constant *getAdd(Constant *C1, Constant *C2, bool HasNUW = false, bool HasNSW = false); - static Constant *getFAdd(Constant *C1, Constant *C2); + static Constant *getFAdd(Constant *C1, Constant *C2, + FastMathFlags FMF = FastMathFlags()); static Constant *getSub(Constant *C1, Constant *C2, bool HasNUW = false, bool HasNSW = false); - static Constant *getFSub(Constant *C1, Constant *C2); + static Constant *getFSub(Constant *C1, Constant *C2, + FastMathFlags FMF = FastMathFlags()); static Constant *getMul(Constant *C1, Constant *C2, bool HasNUW = false, bool HasNSW = false); - static Constant *getFMul(Constant *C1, Constant *C2); + static Constant *getFMul(Constant *C1, Constant *C2, + FastMathFlags FMF = FastMathFlags()); static Constant *getUDiv(Constant *C1, Constant *C2, bool isExact = false); static Constant *getSDiv(Constant *C1, Constant *C2, bool isExact = false); - static Constant *getFDiv(Constant *C1, Constant *C2); + static Constant *getFDiv(Constant *C1, Constant *C2, + FastMathFlags FMF = FastMathFlags()); static Constant *getURem(Constant *C1, Constant *C2); static Constant *getSRem(Constant *C1, Constant *C2); - static Constant *getFRem(Constant *C1, Constant *C2); + static Constant *getFRem(Constant *C1, Constant *C2, + FastMathFlags FMF = FastMathFlags()); static Constant *getAnd(Constant *C1, Constant *C2); static Constant *getOr(Constant *C1, Constant *C2); static Constant *getXor(Constant *C1, Constant *C2); @@ -1092,9 +1098,21 @@ /// get - Return a binary or shift operator constant expression, /// folding if possible. /// + /// \param Flags operator-specific set of flags (e.g. SDivOperator::IsExact). /// \param OnlyIfReducedTy see \a getWithOperands() docs. + /// \param FMF common fast-math flags that can affect folding. static Constant *get(unsigned Opcode, Constant *C1, Constant *C2, - unsigned Flags = 0, Type *OnlyIfReducedTy = nullptr); + unsigned Flags = 0, Type *OnlyIfReducedTy = nullptr, + FastMathFlags FMF = FastMathFlags()); + + /// Return a binary or shift operator constant expression, folding if + /// possible. + /// + /// Convenience overload for passing fast-math flags. + /// + /// \param FMF common fast-math flags that can affect folding. + static Constant *get(unsigned Opcode, Constant *C1, Constant *C2, + FastMathFlags FMF); /// \brief Return an ICmp or FCmp comparison operator constant expression. /// Index: include/llvm/IR/FastMathFlags.h =================================================================== --- /dev/null +++ include/llvm/IR/FastMathFlags.h @@ -0,0 +1,80 @@ +//===- FastMathFlags.h - Fast math flags structure definition ---*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file provides convenience struct for specifying and reasoning about +// fast-math flags. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_IR_FASTMATHFLAGS_H +#define LLVM_IR_FASTMATHFLAGS_H + +namespace llvm { + +/// Convenience struct for specifying and reasoning about fast-math flags. +class FastMathFlags { +private: + friend class FPMathOperator; + unsigned Flags; + FastMathFlags(unsigned F) : Flags(F) { } + +public: + enum { + UnsafeAlgebra = (1 << 0), + NoNaNs = (1 << 1), + NoInfs = (1 << 2), + NoSignedZeros = (1 << 3), + AllowReciprocal = (1 << 4), + NoExceptions = (1 << 5), + NoRounding = (1 << 6) + }; + + FastMathFlags() : Flags(0) + { } + + /// Whether any flag is set + bool any() const { return Flags != 0; } + + /// Set all the flags to false + void clear() { Flags = 0; } + + /// Flag queries + bool noNaNs() const { return 0 != (Flags & NoNaNs); } + bool noInfs() const { return 0 != (Flags & NoInfs); } + bool noSignedZeros() const { return 0 != (Flags & NoSignedZeros); } + bool allowReciprocal() const { return 0 != (Flags & AllowReciprocal); } + bool unsafeAlgebra() const { return 0 != (Flags & UnsafeAlgebra); } + bool noExceptions() const { return 0 != (Flags & NoExceptions); } + bool noRounding() const { return 0 != (Flags & NoRounding); } + + /// Flag setters + void setNoNaNs() { Flags |= NoNaNs; } + void setNoInfs() { Flags |= NoInfs; } + void setNoSignedZeros() { Flags |= NoSignedZeros; } + void setAllowReciprocal() { Flags |= AllowReciprocal; } + void setNoExceptions() { Flags |= NoExceptions; } + void setNoRounding() { Flags |= NoRounding; } + void setUnsafeAlgebra() { + Flags |= UnsafeAlgebra; + setNoNaNs(); + setNoInfs(); + setNoSignedZeros(); + setAllowReciprocal(); + setNoExceptions(); + setNoRounding(); + } + + void operator&=(const FastMathFlags &OtherFlags) { + Flags &= OtherFlags.Flags; + } +}; + +} // End llvm namespace + +#endif Index: include/llvm/IR/Operator.h =================================================================== --- include/llvm/IR/Operator.h +++ include/llvm/IR/Operator.h @@ -18,6 +18,7 @@ #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/FastMathFlags.h" #include "llvm/IR/Instruction.h" #include "llvm/IR/Type.h" @@ -160,65 +161,6 @@ } }; -/// Convenience struct for specifying and reasoning about fast-math flags. -class FastMathFlags { -private: - friend class FPMathOperator; - unsigned Flags; - FastMathFlags(unsigned F) : Flags(F) { } - -public: - enum { - UnsafeAlgebra = (1 << 0), - NoNaNs = (1 << 1), - NoInfs = (1 << 2), - NoSignedZeros = (1 << 3), - AllowReciprocal = (1 << 4), - NoExceptions = (1 << 5), - NoRounding = (1 << 6) - }; - - FastMathFlags() : Flags(0) - { } - - /// Whether any flag is set - bool any() const { return Flags != 0; } - - /// Set all the flags to false - void clear() { Flags = 0; } - - /// Flag queries - bool noNaNs() const { return 0 != (Flags & NoNaNs); } - bool noInfs() const { return 0 != (Flags & NoInfs); } - bool noSignedZeros() const { return 0 != (Flags & NoSignedZeros); } - bool allowReciprocal() const { return 0 != (Flags & AllowReciprocal); } - bool unsafeAlgebra() const { return 0 != (Flags & UnsafeAlgebra); } - bool noExceptions() const { return 0 != (Flags & NoExceptions); } - bool noRounding() const { return 0 != (Flags & NoRounding); } - - /// Flag setters - void setNoNaNs() { Flags |= NoNaNs; } - void setNoInfs() { Flags |= NoInfs; } - void setNoSignedZeros() { Flags |= NoSignedZeros; } - void setAllowReciprocal() { Flags |= AllowReciprocal; } - void setNoExceptions() { Flags |= NoExceptions; } - void setNoRounding() { Flags |= NoRounding; } - void setUnsafeAlgebra() { - Flags |= UnsafeAlgebra; - setNoNaNs(); - setNoInfs(); - setNoSignedZeros(); - setAllowReciprocal(); - setNoExceptions(); - setNoRounding(); - } - - void operator&=(const FastMathFlags &OtherFlags) { - Flags &= OtherFlags.Flags; - } -}; - - /// Utility class for floating point operations which can have /// information about relaxed accuracy requirements attached to them. class FPMathOperator : public Operator { Index: lib/Analysis/ValueTracking.cpp =================================================================== --- lib/Analysis/ValueTracking.cpp +++ lib/Analysis/ValueTracking.cpp @@ -3317,6 +3317,53 @@ return isDereferenceableAndAlignedPointer(V, 1, DL, CtxI, DT, TLI); } +/// Evaluates floating point operation to examine how it could affect +/// floating-environment at run-time if it's not folded. Returns false for +/// unsupported operation (not on constant operands), otherwise true is returned +/// and S is assigned status of the operation. +static bool getFPOpExceptions(const Operator *O, APFloat::opStatus &S) { + switch (O->getOpcode()) { + default: + assert(false && "Expected floating-point instruction!"); + return false; + case Instruction::FMul: + case Instruction::FAdd: + case Instruction::FSub: + case Instruction::FDiv: + case Instruction::FRem: + break; + } + + ConstantFP *LHSC = dyn_cast(O->getOperand(0)); + ConstantFP *RHSC = dyn_cast(O->getOperand(1)); + + if (!LHSC || !RHSC) + return false; + + APFloat LHS = LHSC->getValueAPF(); + APFloat RHS = RHSC->getValueAPF(); + + switch (O->getOpcode()) { + case Instruction::FMul: + S = LHS.multiply(RHS, APFloat::rmNearestTiesToEven); + break; + case Instruction::FAdd: + S = LHS.add(RHS, APFloat::rmNearestTiesToEven); + break; + case Instruction::FSub: + S = LHS.subtract(RHS, APFloat::rmNearestTiesToEven); + break; + case Instruction::FDiv: + S = LHS.divide(RHS, APFloat::rmNearestTiesToEven); + break; + case Instruction::FRem: + S = LHS.mod(RHS); + break; + } + + return true; +} + bool llvm::isSafeToSpeculativelyExecute(const Value *V, const Instruction *CtxI, const DominatorTree *DT, @@ -3330,9 +3377,29 @@ if (C->canTrap()) return false; + bool KeepExceptions = false; + if (const auto *MathOp = dyn_cast(Inst)) { + // Rounding-mode changes the observable exceptions by moving the + // overflow/underflow boundaries. + KeepExceptions = !MathOp->hasNoExceptions() || !MathOp->hasNoRounding(); + } + switch (Inst->getOpcode()) { default: return true; + case Instruction::FMul: + case Instruction::FAdd: + case Instruction::FSub: + case Instruction::FDiv: + case Instruction::FRem: + if (KeepExceptions) { + APFloat::opStatus S; + if (!getFPOpExceptions(Inst, S)) + return false; + if (S != APFloat::opOK || (S & APFloat::opInexact)) + return false; + } + return true; case Instruction::UDiv: case Instruction::URem: { // x / y is undefined if y == 0. Index: lib/IR/ConstantFold.h =================================================================== --- lib/IR/ConstantFold.h +++ lib/IR/ConstantFold.h @@ -24,6 +24,7 @@ namespace llvm { class Value; class Constant; + class FastMathFlags; class Type; // Constant fold various types of instruction... @@ -44,7 +45,7 @@ Constant *ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val, ArrayRef Idxs); Constant *ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1, - Constant *V2); + Constant *V2, FastMathFlags FMF); Constant *ConstantFoldCompareInstruction(unsigned short predicate, Constant *C1, Constant *C2); Constant *ConstantFoldGetElementPtr(Constant *C, bool inBounds, Index: lib/IR/ConstantFold.cpp =================================================================== --- lib/IR/ConstantFold.cpp +++ lib/IR/ConstantFold.cpp @@ -915,7 +915,8 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, - Constant *C1, Constant *C2) { + Constant *C1, Constant *C2, + FastMathFlags FMF) { // Handle UndefValue up front. if (isa(C1) || isa(C2)) { switch (Opcode) { @@ -1099,7 +1100,7 @@ } else if (isa(C1)) { // If C1 is a ConstantInt and C2 is not, swap the operands. if (Instruction::isCommutative(Opcode)) - return ConstantExpr::get(Opcode, C2, C1); + return ConstantExpr::get(Opcode, C2, C1, FMF); } // At this point we know neither constant is an UndefValue. @@ -1171,25 +1172,29 @@ APFloat C1V = CFP1->getValueAPF(); APFloat C2V = CFP2->getValueAPF(); APFloat C3V = C1V; // copy for modification + Optional S; switch (Opcode) { - default: + default: break; case Instruction::FAdd: - (void)C3V.add(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(C1->getContext(), C3V); + S = C3V.add(C2V, APFloat::rmNearestTiesToEven); + break; case Instruction::FSub: - (void)C3V.subtract(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(C1->getContext(), C3V); + S = C3V.subtract(C2V, APFloat::rmNearestTiesToEven); + break; case Instruction::FMul: - (void)C3V.multiply(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(C1->getContext(), C3V); + S = C3V.multiply(C2V, APFloat::rmNearestTiesToEven); + break; case Instruction::FDiv: - (void)C3V.divide(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(C1->getContext(), C3V); + S = C3V.divide(C2V, APFloat::rmNearestTiesToEven); + break; case Instruction::FRem: - (void)C3V.mod(C2V); - return ConstantFP::get(C1->getContext(), C3V); + S = C3V.mod(C2V); + break; } + if (S && (FMF.noExceptions() || *S == APFloat::opOK) && + (FMF.noRounding() || !(*S & APFloat::opInexact))) + return ConstantFP::get(C1->getContext(), C3V); } } else if (VectorType *VTy = dyn_cast(C1->getType())) { // Perform elementwise folding. @@ -1200,10 +1205,10 @@ ConstantExpr::getExtractElement(C1, ConstantInt::get(Ty, i)); Constant *RHS = ConstantExpr::getExtractElement(C2, ConstantInt::get(Ty, i)); - - Result.push_back(ConstantExpr::get(Opcode, LHS, RHS)); + + Result.push_back(ConstantExpr::get(Opcode, LHS, RHS, FMF)); } - + return ConstantVector::get(Result); } @@ -1215,15 +1220,15 @@ // Given ((a + b) + c), if (b + c) folds to something interesting, return // (a + (b + c)). if (Instruction::isAssociative(Opcode) && CE1->getOpcode() == Opcode) { - Constant *T = ConstantExpr::get(Opcode, CE1->getOperand(1), C2); + Constant *T = ConstantExpr::get(Opcode, CE1->getOperand(1), C2, FMF); if (!isa(T) || cast(T)->getOpcode() != Opcode) - return ConstantExpr::get(Opcode, CE1->getOperand(0), T); + return ConstantExpr::get(Opcode, CE1->getOperand(0), T, FMF); } } else if (isa(C2)) { // If C2 is a constant expr and C1 isn't, flop them around and fold the // other way if possible. if (Instruction::isCommutative(Opcode)) - return ConstantFoldBinaryInstruction(Opcode, C2, C1); + return ConstantFoldBinaryInstruction(Opcode, C2, C1, FMF); } // i1 can be simplified in many cases. Index: lib/IR/Constants.cpp =================================================================== --- lib/IR/Constants.cpp +++ lib/IR/Constants.cpp @@ -1800,7 +1800,8 @@ } Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2, - unsigned Flags, Type *OnlyIfReducedTy) { + unsigned Flags, Type *OnlyIfReducedTy, + FastMathFlags FMF) { // Check the operands for consistency first. assert(Opcode >= Instruction::BinaryOpsBegin && Opcode < Instruction::BinaryOpsEnd && @@ -1810,6 +1811,19 @@ #ifndef NDEBUG switch (Opcode) { + default: + assert(!FMF.any() && + "Fast-math flags must be used only with floating-point opcodes!"); + break; + case Instruction::FAdd: + case Instruction::FSub: + case Instruction::FMul: + case Instruction::FDiv: + case Instruction::FRem: + break; + } + + switch (Opcode) { case Instruction::Add: case Instruction::Sub: case Instruction::Mul: @@ -1866,7 +1880,7 @@ } #endif - if (Constant *FC = ConstantFoldBinaryInstruction(Opcode, C1, C2)) + if (Constant *FC = ConstantFoldBinaryInstruction(Opcode, C1, C2, FMF)) return FC; // Fold a few common cases. if (OnlyIfReducedTy == C1->getType()) @@ -1879,6 +1893,11 @@ return pImpl->ExprConstants.getOrCreate(C1->getType(), Key); } +Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2, + FastMathFlags FMF) { + return get(Opcode, C1, C2, 0, nullptr, FMF); +} + Constant *ConstantExpr::getSizeOf(Type* Ty) { // sizeof is implemented as: (i64) gep (Ty*)null, 1 // Note that a non-inbounds gep is used, as null isn't within any object. @@ -2196,8 +2215,8 @@ return get(Instruction::Add, C1, C2, Flags); } -Constant *ConstantExpr::getFAdd(Constant *C1, Constant *C2) { - return get(Instruction::FAdd, C1, C2); +Constant *ConstantExpr::getFAdd(Constant *C1, Constant *C2, FastMathFlags FMF) { + return get(Instruction::FAdd, C1, C2, 0, nullptr, FMF); } Constant *ConstantExpr::getSub(Constant *C1, Constant *C2, @@ -2207,19 +2226,19 @@ return get(Instruction::Sub, C1, C2, Flags); } -Constant *ConstantExpr::getFSub(Constant *C1, Constant *C2) { - return get(Instruction::FSub, C1, C2); +Constant *ConstantExpr::getFSub(Constant *C1, Constant *C2, FastMathFlags FMF) { + return get(Instruction::FSub, C1, C2, 0, nullptr, FMF); } Constant *ConstantExpr::getMul(Constant *C1, Constant *C2, bool HasNUW, bool HasNSW) { unsigned Flags = (HasNUW ? OverflowingBinaryOperator::NoUnsignedWrap : 0) | (HasNSW ? OverflowingBinaryOperator::NoSignedWrap : 0); - return get(Instruction::Mul, C1, C2, Flags); + return get(Instruction::Mul, C1, C2, Flags, nullptr); } -Constant *ConstantExpr::getFMul(Constant *C1, Constant *C2) { - return get(Instruction::FMul, C1, C2); +Constant *ConstantExpr::getFMul(Constant *C1, Constant *C2, FastMathFlags FMF) { + return get(Instruction::FMul, C1, C2, 0, nullptr, FMF); } Constant *ConstantExpr::getUDiv(Constant *C1, Constant *C2, bool isExact) { @@ -2232,8 +2251,8 @@ isExact ? PossiblyExactOperator::IsExact : 0); } -Constant *ConstantExpr::getFDiv(Constant *C1, Constant *C2) { - return get(Instruction::FDiv, C1, C2); +Constant *ConstantExpr::getFDiv(Constant *C1, Constant *C2, FastMathFlags FMF) { + return get(Instruction::FDiv, C1, C2, 0, nullptr, FMF); } Constant *ConstantExpr::getURem(Constant *C1, Constant *C2) { @@ -2244,8 +2263,8 @@ return get(Instruction::SRem, C1, C2); } -Constant *ConstantExpr::getFRem(Constant *C1, Constant *C2) { - return get(Instruction::FRem, C1, C2); +Constant *ConstantExpr::getFRem(Constant *C1, Constant *C2, FastMathFlags FMF) { + return get(Instruction::FRem, C1, C2, 0, nullptr, FMF); } Constant *ConstantExpr::getAnd(Constant *C1, Constant *C2) { Index: lib/Transforms/InstCombine/InstCombineMulDivRem.cpp =================================================================== --- lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -1227,6 +1227,7 @@ bool AllowReassociate = I.hasUnsafeAlgebra(); bool AllowReciprocal = I.hasAllowReciprocal(); + FastMathFlags FMF = I.getFastMathFlags(); if (Constant *Op1C = dyn_cast(Op1)) { if (SelectInst *SI = dyn_cast(Op0)) @@ -1242,13 +1243,13 @@ if (match(Op0, m_FMul(m_Value(X), m_Constant(C1)))) { // (X*C1)/C2 => X * (C1/C2) // - Constant *C = ConstantExpr::getFDiv(C1, C2); + Constant *C = ConstantExpr::getFDiv(C1, C2, FMF); if (isNormalFp(C)) Res = BinaryOperator::CreateFMul(X, C); } else if (match(Op0, m_FDiv(m_Value(X), m_Constant(C1)))) { // (X/C1)/C2 => X /(C2*C1) [=> X * 1/(C2*C1) if reciprocal is allowed] // - Constant *C = ConstantExpr::getFMul(C1, C2); + Constant *C = ConstantExpr::getFMul(C1, C2, FMF); if (isNormalFp(C)) { Res = CvtFDivConstToReciprocal(X, C, AllowReciprocal); if (!Res) @@ -1279,13 +1280,13 @@ // C1 / (X*C2) => (C1/C2) / X if (match(Op1, m_FMul(m_Value(X), m_Constant(C2)))) - Fold = ConstantExpr::getFDiv(C1, C2); + Fold = ConstantExpr::getFDiv(C1, C2, FMF); else if (match(Op1, m_FDiv(m_Value(X), m_Constant(C2)))) { // C1 / (X/C2) => (C1*C2) / X - Fold = ConstantExpr::getFMul(C1, C2); + Fold = ConstantExpr::getFMul(C1, C2, FMF); } else if (match(Op1, m_FDiv(m_Constant(C2), m_Value(X)))) { // C1 / (C2/X) => (C1/C2) * X - Fold = ConstantExpr::getFDiv(C1, C2); + Fold = ConstantExpr::getFDiv(C1, C2, FMF); CreateDiv = false; } Index: lib/Transforms/InstCombine/InstructionCombining.cpp =================================================================== --- lib/Transforms/InstCombine/InstructionCombining.cpp +++ lib/Transforms/InstCombine/InstructionCombining.cpp @@ -209,7 +209,10 @@ Value *C = I.getOperand(1); // Does "B op C" simplify? - if (Value *V = SimplifyBinOp(Opcode, B, C, DL)) { + FastMathFlags FMF; + if (isa(I)) + FMF = I.getFastMathFlags(); + if (Value *V = SimplifyFPBinOp(Opcode, B, C, FMF, DL)) { // It simplifies to V. Form "A op V". I.setOperand(0, A); I.setOperand(1, V); @@ -707,8 +710,12 @@ Constant *ConstOperand = cast(I.getOperand(ConstIsRHS)); if (Constant *SOC = dyn_cast(SO)) { - if (ConstIsRHS) - return ConstantExpr::get(I.getOpcode(), SOC, ConstOperand); + if (ConstIsRHS) { + FastMathFlags FMF; + if (isa(I)) + FMF = I.getFastMathFlags(); + return ConstantExpr::get(I.getOpcode(), SOC, ConstOperand, FMF); + } return ConstantExpr::get(I.getOpcode(), ConstOperand, SOC); } Index: lib/Transforms/Scalar/Scalarizer.cpp =================================================================== --- lib/Transforms/Scalar/Scalarizer.cpp +++ lib/Transforms/Scalar/Scalarizer.cpp @@ -95,7 +95,10 @@ BinarySplitter(BinaryOperator &bo) : BO(bo) {} Value *operator()(IRBuilder<> &Builder, Value *Op0, Value *Op1, const Twine &Name) const { - return Builder.CreateBinOp(BO.getOpcode(), Op0, Op1, Name); + Value *V = Builder.CreateBinOp(BO.getOpcode(), Op0, Op1, Name); + if (isa(V)) + cast(V)->copyFastMathFlags(BO.getFastMathFlags()); + return V; } BinaryOperator &BO; }; Index: test/CodeGen/AArch64/arm64-ccmp.ll =================================================================== --- test/CodeGen/AArch64/arm64-ccmp.ll +++ test/CodeGen/AArch64/arm64-ccmp.ll @@ -143,7 +143,7 @@ land.lhs.true: %conv = sitofp i32 %a to float - %div = fdiv float %b, %conv + %div = fdiv nexc nrnd float %b, %conv %cmp1 = fcmp oge float %div, 1.700000e+01 br i1 %cmp1, label %if.then, label %if.end Index: test/CodeGen/AArch64/arm64-dagcombiner-load-slicing.ll =================================================================== --- test/CodeGen/AArch64/arm64-dagcombiner-load-slicing.ll +++ test/CodeGen/AArch64/arm64-dagcombiner-load-slicing.ll @@ -26,11 +26,11 @@ %arrayidx2 = getelementptr inbounds %class.Complex, %class.Complex* %out, i64 %add %i.i = getelementptr inbounds %class.Complex, %class.Complex* %arrayidx2, i64 0, i32 0 %4 = load float, float* %i.i, align 4 - %add.i = fadd float %4, %2 + %add.i = fadd nexc nrnd float %4, %2 %retval.sroa.0.0.vec.insert.i = insertelement <2 x float> undef, float %add.i, i32 0 %r.i = getelementptr inbounds %class.Complex, %class.Complex* %arrayidx2, i64 0, i32 1 %5 = load float, float* %r.i, align 4 - %add5.i = fadd float %5, %3 + %add5.i = fadd nexc nrnd float %5, %3 %retval.sroa.0.4.vec.insert.i = insertelement <2 x float> %retval.sroa.0.0.vec.insert.i, float %add5.i, i32 1 %ref.tmp.sroa.0.0.cast = bitcast %class.Complex* %arrayidx to <2 x float>* store <2 x float> %retval.sroa.0.4.vec.insert.i, <2 x float>* %ref.tmp.sroa.0.0.cast, align 4 Index: test/CodeGen/AArch64/arm64-fmadd.ll =================================================================== --- test/CodeGen/AArch64/arm64-fmadd.ll +++ test/CodeGen/AArch64/arm64-fmadd.ll @@ -13,7 +13,7 @@ ; CHECK-LABEL: fnma32: ; CHECK: fnmadd s0, s0, s1, s2 %0 = tail call float @llvm.fma.f32(float %a, float %b, float %c) - %mul = fmul float %0, -1.000000e+00 + %mul = fmul nexc nrnd float %0, -1.000000e+00 ret float %mul } @@ -21,7 +21,7 @@ entry: ; CHECK-LABEL: fms32: ; CHECK: fmsub s0, s0, s1, s2 - %mul = fmul float %b, -1.000000e+00 + %mul = fmul nexc nrnd float %b, -1.000000e+00 %0 = tail call float @llvm.fma.f32(float %a, float %mul, float %c) ret float %0 } @@ -30,7 +30,7 @@ entry: ; CHECK-LABEL: fms32_com: ; CHECK: fmsub s0, s1, s0, s2 - %mul = fmul float %b, -1.000000e+00 + %mul = fmul nexc nrnd float %b, -1.000000e+00 %0 = tail call float @llvm.fma.f32(float %mul, float %a, float %c) ret float %0 } @@ -39,7 +39,7 @@ entry: ; CHECK-LABEL: fnms32: ; CHECK: fnmsub s0, s0, s1, s2 - %mul = fmul float %c, -1.000000e+00 + %mul = fmul nexc nrnd float %c, -1.000000e+00 %0 = tail call float @llvm.fma.f32(float %a, float %b, float %mul) ret float %0 } @@ -57,7 +57,7 @@ ; CHECK: fnmadd d0, d0, d1, d2 entry: %0 = tail call double @llvm.fma.f64(double %a, double %b, double %c) - %mul = fmul double %0, -1.000000e+00 + %mul = fmul nexc nrnd double %0, -1.000000e+00 ret double %mul } @@ -65,7 +65,7 @@ ; CHECK-LABEL: fms64: ; CHECK: fmsub d0, d0, d1, d2 entry: - %mul = fmul double %b, -1.000000e+00 + %mul = fmul nexc nrnd double %b, -1.000000e+00 %0 = tail call double @llvm.fma.f64(double %a, double %mul, double %c) ret double %0 } @@ -74,7 +74,7 @@ ; CHECK-LABEL: fms64_com: ; CHECK: fmsub d0, d1, d0, d2 entry: - %mul = fmul double %b, -1.000000e+00 + %mul = fmul nexc nrnd double %b, -1.000000e+00 %0 = tail call double @llvm.fma.f64(double %mul, double %a, double %c) ret double %0 } @@ -83,7 +83,7 @@ ; CHECK-LABEL: fnms64: ; CHECK: fnmsub d0, d0, d1, d2 entry: - %mul = fmul double %c, -1.000000e+00 + %mul = fmul nexc nrnd double %c, -1.000000e+00 %0 = tail call double @llvm.fma.f64(double %a, double %b, double %mul) ret double %0 } Index: test/CodeGen/AArch64/arm64-misched-basic-A53.ll =================================================================== --- test/CodeGen/AArch64/arm64-misched-basic-A53.ll +++ test/CodeGen/AArch64/arm64-misched-basic-A53.ll @@ -89,16 +89,16 @@ ; CHECK: FADDv4f32 ; CHECK: ********** INTERVALS ********** define <4 x float> @neon4xfloat(<4 x float> %A, <4 x float> %B) { - %tmp1 = fadd <4 x float> %A, %B; - %tmp2 = fadd <4 x float> %A, %tmp1; - %tmp3 = fadd <4 x float> %A, %tmp2; - %tmp4 = fadd <4 x float> %A, %tmp3; - %tmp5 = fadd <4 x float> %A, %tmp4; - %tmp6 = fadd <4 x float> %A, %tmp5; - %tmp7 = fadd <4 x float> %A, %tmp6; - %tmp8 = fadd <4 x float> %A, %tmp7; - %tmp9 = fdiv <4 x float> %A, %B; - %tmp10 = fadd <4 x float> %tmp8, %tmp9; + %tmp1 = fadd nexc nrnd <4 x float> %A, %B; + %tmp2 = fadd nexc nrnd <4 x float> %A, %tmp1; + %tmp3 = fadd nexc nrnd <4 x float> %A, %tmp2; + %tmp4 = fadd nexc nrnd <4 x float> %A, %tmp3; + %tmp5 = fadd nexc nrnd <4 x float> %A, %tmp4; + %tmp6 = fadd nexc nrnd <4 x float> %A, %tmp5; + %tmp7 = fadd nexc nrnd <4 x float> %A, %tmp6; + %tmp8 = fadd nexc nrnd <4 x float> %A, %tmp7; + %tmp9 = fdiv nexc nrnd <4 x float> %A, %B; + %tmp10 = fadd nexc nrnd <4 x float> %tmp8, %tmp9; ret <4 x float> %tmp10 } @@ -134,38 +134,38 @@ ; CHECK: ********** INTERVALS ********** define void @testResourceConflict(float* %ptr) { entry: - %add1 = fadd float undef, undef - %mul2 = fmul float undef, undef - %add3 = fadd float %mul2, undef - %mul4 = fmul float undef, %add3 - %add5 = fadd float %mul4, undef - %sub6 = fsub float 0.000000e+00, undef - %sub7 = fsub float %add5, undef - %div8 = fdiv float 1.000000e+00, undef - %mul9 = fmul float %div8, %sub7 - %mul14 = fmul float %sub6, %div8 - %mul10 = fsub float -0.000000e+00, %mul14 - %mul15 = fmul float undef, %div8 - %mul11 = fsub float -0.000000e+00, %mul15 - %mul12 = fmul float 0.000000e+00, %div8 - %mul13 = fmul float %add1, %mul9 - %mul21 = fmul float %add5, %mul11 - %add22 = fadd float %mul13, %mul21 + %add1 = fadd nexc nrnd float undef, undef + %mul2 = fmul nexc nrnd float undef, undef + %add3 = fadd nexc nrnd float %mul2, undef + %mul4 = fmul nexc nrnd float undef, %add3 + %add5 = fadd nexc nrnd float %mul4, undef + %sub6 = fsub nexc nrnd float 0.000000e+00, undef + %sub7 = fsub nexc nrnd float %add5, undef + %div8 = fdiv nexc nrnd float 1.000000e+00, undef + %mul9 = fmul nexc nrnd float %div8, %sub7 + %mul14 = fmul nexc nrnd float %sub6, %div8 + %mul10 = fsub nexc nrnd float -0.000000e+00, %mul14 + %mul15 = fmul nexc nrnd float undef, %div8 + %mul11 = fsub nexc nrnd float -0.000000e+00, %mul15 + %mul12 = fmul nexc nrnd float 0.000000e+00, %div8 + %mul13 = fmul nexc nrnd float %add1, %mul9 + %mul21 = fmul nexc nrnd float %add5, %mul11 + %add22 = fadd nexc nrnd float %mul13, %mul21 store float %add22, float* %ptr, align 4 - %mul28 = fmul float %add1, %mul10 - %mul33 = fmul float %add5, %mul12 - %add34 = fadd float %mul33, %mul28 + %mul28 = fmul nexc nrnd float %add1, %mul10 + %mul33 = fmul nexc nrnd float %add5, %mul12 + %add34 = fadd nexc nrnd float %mul33, %mul28 store float %add34, float* %ptr, align 4 - %mul240 = fmul float undef, %mul9 - %add246 = fadd float %mul240, undef + %mul240 = fmul nexc nrnd float undef, %mul9 + %add246 = fadd nexc nrnd float %mul240, undef store float %add246, float* %ptr, align 4 - %mul52 = fmul float undef, %mul10 - %mul57 = fmul float undef, %mul12 - %add58 = fadd float %mul57, %mul52 + %mul52 = fmul nexc nrnd float undef, %mul10 + %mul57 = fmul nexc nrnd float undef, %mul12 + %add58 = fadd nexc nrnd float %mul57, %mul52 store float %add58, float* %ptr, align 4 - %mul27 = fmul float 0.000000e+00, %mul9 - %mul81 = fmul float undef, %mul10 - %add82 = fadd float %mul27, %mul81 + %mul27 = fmul nexc nrnd float 0.000000e+00, %mul9 + %mul81 = fmul nexc nrnd float undef, %mul10 + %add82 = fadd nexc nrnd float %mul27, %mul81 store float %add82, float* %ptr, align 4 call void @llvm.trap() unreachable Index: test/CodeGen/AArch64/arm64-neon-2velem-high.ll =================================================================== --- test/CodeGen/AArch64/arm64-neon-2velem-high.ll +++ test/CodeGen/AArch64/arm64-neon-2velem-high.ll @@ -482,7 +482,7 @@ entry: %vecinit.i = insertelement <2 x float> undef, float %b, i32 0 %vecinit1.i = insertelement <2 x float> %vecinit.i, float %b, i32 1 - %mul.i = fmul <2 x float> %vecinit1.i, %a + %mul.i = fmul nexc nrnd <2 x float> %vecinit1.i, %a ret <2 x float> %mul.i } @@ -495,7 +495,7 @@ %vecinit1.i = insertelement <4 x float> %vecinit.i, float %b, i32 1 %vecinit2.i = insertelement <4 x float> %vecinit1.i, float %b, i32 2 %vecinit3.i = insertelement <4 x float> %vecinit2.i, float %b, i32 3 - %mul.i = fmul <4 x float> %vecinit3.i, %a + %mul.i = fmul nexc nrnd <4 x float> %vecinit3.i, %a ret <4 x float> %mul.i } @@ -506,7 +506,7 @@ entry: %vecinit.i = insertelement <2 x double> undef, double %b, i32 0 %vecinit1.i = insertelement <2 x double> %vecinit.i, double %b, i32 1 - %mul.i = fmul <2 x double> %vecinit1.i, %a + %mul.i = fmul nexc nrnd <2 x double> %vecinit1.i, %a ret <2 x double> %mul.i } @@ -541,7 +541,7 @@ entry: %vecinit.i = insertelement <2 x float> undef, float %n, i32 0 %vecinit1.i = insertelement <2 x float> %vecinit.i, float %n, i32 1 - %0 = fsub <2 x float> , %b + %0 = fsub nexc nrnd <2 x float> , %b %1 = call <2 x float> @llvm.fma.v2f32(<2 x float> %0, <2 x float> %vecinit1.i, <2 x float> %a) ret <2 x float> %1 } @@ -555,7 +555,7 @@ %vecinit1.i = insertelement <4 x float> %vecinit.i, float %n, i32 1 %vecinit2.i = insertelement <4 x float> %vecinit1.i, float %n, i32 2 %vecinit3.i = insertelement <4 x float> %vecinit2.i, float %n, i32 3 - %0 = fsub <4 x float> , %b + %0 = fsub nexc nrnd <4 x float> , %b %1 = call <4 x float> @llvm.fma.v4f32(<4 x float> %0, <4 x float> %vecinit3.i, <4 x float> %a) ret <4 x float> %1 } Index: test/CodeGen/AArch64/arm64-neon-2velem.ll =================================================================== --- test/CodeGen/AArch64/arm64-neon-2velem.ll +++ test/CodeGen/AArch64/arm64-neon-2velem.ll @@ -427,7 +427,7 @@ ; CHECK: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[1] ; CHECK-NEXT: ret entry: - %sub = fsub <2 x float> , %v + %sub = fsub nexc nrnd <2 x float> , %v %lane = shufflevector <2 x float> %sub, <2 x float> undef, <2 x i32> %0 = tail call <2 x float> @llvm.fma.v2f32(<2 x float> %lane, <2 x float> %b, <2 x float> %a) ret <2 x float> %0 @@ -438,7 +438,7 @@ ; CHECK: fmls {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[1] ; CHECK-NEXT: ret entry: - %sub = fsub <2 x float> , %v + %sub = fsub nexc nrnd <2 x float> , %v %lane = shufflevector <2 x float> %sub, <2 x float> undef, <4 x i32> %0 = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %lane, <4 x float> %b, <4 x float> %a) ret <4 x float> %0 @@ -449,7 +449,7 @@ ; CHECK: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[3] ; CHECK-NEXT: ret entry: - %sub = fsub <4 x float> , %v + %sub = fsub nexc nrnd <4 x float> , %v %lane = shufflevector <4 x float> %sub, <4 x float> undef, <2 x i32> %0 = tail call <2 x float> @llvm.fma.v2f32(<2 x float> %lane, <2 x float> %b, <2 x float> %a) ret <2 x float> %0 @@ -460,7 +460,7 @@ ; CHECK: fmls {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[3] ; CHECK-NEXT: ret entry: - %sub = fsub <4 x float> , %v + %sub = fsub nexc nrnd <4 x float> , %v %lane = shufflevector <4 x float> %sub, <4 x float> undef, <4 x i32> %0 = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %lane, <4 x float> %b, <4 x float> %a) ret <4 x float> %0 @@ -493,7 +493,7 @@ ; CHECK: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0] ; CHECK-NEXT: ret entry: - %sub = fsub <1 x double> , %v + %sub = fsub nexc nrnd <1 x double> , %v %lane = shufflevector <1 x double> %sub, <1 x double> undef, <2 x i32> zeroinitializer %0 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %lane, <2 x double> %b, <2 x double> %a) ret <2 x double> %0 @@ -504,7 +504,7 @@ ; CHECK: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.d[1] ; CHECK-NEXT: ret entry: - %sub = fsub <2 x double> , %v + %sub = fsub nexc nrnd <2 x double> , %v %lane = shufflevector <2 x double> %sub, <2 x double> undef, <2 x i32> %0 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %lane, <2 x double> %b, <2 x double> %a) ret <2 x double> %0 @@ -528,7 +528,7 @@ ; CHECK-NEXT: ret entry: %extract.rhs = extractelement <1 x double> %v, i32 0 - %extract = fsub double -0.000000e+00, %extract.rhs + %extract = fsub nexc nrnd double -0.000000e+00, %extract.rhs %0 = tail call double @llvm.fma.f64(double %b, double %extract, double %a) ret double %0 } @@ -541,7 +541,7 @@ ; CHECK-NEXT: ret entry: %extract.rhs = extractelement <2 x float> %v, i32 1 - %extract = fsub float -0.000000e+00, %extract.rhs + %extract = fsub nexc nrnd float -0.000000e+00, %extract.rhs %0 = tail call float @llvm.fma.f32(float %b, float %extract, float %a) ret float %0 } @@ -552,7 +552,7 @@ ; CHECK-NEXT: ret entry: %extract.rhs = extractelement <4 x float> %v, i32 3 - %extract = fsub float -0.000000e+00, %extract.rhs + %extract = fsub nexc nrnd float -0.000000e+00, %extract.rhs %0 = tail call float @llvm.fma.f32(float %b, float %extract, float %a) ret float %0 } @@ -563,7 +563,7 @@ ; CHECK-NEXT: ret entry: %extract.rhs = extractelement <2 x double> %v, i32 1 - %extract = fsub double -0.000000e+00, %extract.rhs + %extract = fsub nexc nrnd double -0.000000e+00, %extract.rhs %0 = tail call double @llvm.fma.f64(double %b, double %extract, double %a) ret double %0 } @@ -573,7 +573,7 @@ ; CHCK: fmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} ; CHCK-NEXT: ret entry: - %tmp0 = fsub <1 x double> , %v + %tmp0 = fsub nexc nrnd <1 x double> , %v %tmp1 = extractelement <1 x double> %tmp0, i32 0 %0 = tail call double @llvm.fma.f64(double %b, double %tmp1, double %a) ret double %0 @@ -584,7 +584,7 @@ ; CHECK: fmls {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1] ; CHECK-NEXT: ret entry: - %tmp0 = fsub <2 x float> , %v + %tmp0 = fsub nexc nrnd <2 x float> , %v %tmp1 = extractelement <2 x float> %tmp0, i32 1 %0 = tail call float @llvm.fma.f32(float %b, float %tmp1, float %a) ret float %0 @@ -595,7 +595,7 @@ ; CHECK: fmls {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3] ; CHECK-NEXT: ret entry: - %tmp0 = fsub <4 x float>, %v + %tmp0 = fsub nexc nrnd <4 x float>, %v %tmp1 = extractelement <4 x float> %tmp0, i32 3 %0 = tail call float @llvm.fma.f32(float %b, float %tmp1, float %a) ret float %0 @@ -606,7 +606,7 @@ ; CHECK: fmls {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1] ; CHECK-NEXT: ret entry: - %tmp0 = fsub <2 x double>, %v + %tmp0 = fsub nexc nrnd <2 x double>, %v %tmp1 = extractelement <2 x double> %tmp0, i32 1 %0 = tail call double @llvm.fma.f64(double %b, double %tmp1, double %a) ret double %0 @@ -1410,7 +1410,7 @@ ; CHECK-NEXT: ret entry: %shuffle = shufflevector <2 x float> %v, <2 x float> undef, <2 x i32> - %mul = fmul <2 x float> %shuffle, %a + %mul = fmul nexc nrnd <2 x float> %shuffle, %a ret <2 x float> %mul } @@ -1422,7 +1422,7 @@ %0 = bitcast <1 x double> %a to <8 x i8> %1 = bitcast <8 x i8> %0 to double %extract = extractelement <1 x double> %v, i32 0 - %2 = fmul double %1, %extract + %2 = fmul nexc nrnd double %1, %extract %3 = insertelement <1 x double> undef, double %2, i32 0 ret <1 x double> %3 } @@ -1433,7 +1433,7 @@ ; CHECK-NEXT: ret entry: %shuffle = shufflevector <2 x float> %v, <2 x float> undef, <4 x i32> - %mul = fmul <4 x float> %shuffle, %a + %mul = fmul nexc nrnd <4 x float> %shuffle, %a ret <4 x float> %mul } @@ -1443,7 +1443,7 @@ ; CHECK-NEXT: ret entry: %shuffle = shufflevector <1 x double> %v, <1 x double> undef, <2 x i32> zeroinitializer - %mul = fmul <2 x double> %shuffle, %a + %mul = fmul nexc nrnd <2 x double> %shuffle, %a ret <2 x double> %mul } @@ -1453,7 +1453,7 @@ ; CHECK-NEXT: ret entry: %shuffle = shufflevector <4 x float> %v, <4 x float> undef, <2 x i32> - %mul = fmul <2 x float> %shuffle, %a + %mul = fmul nexc nrnd <2 x float> %shuffle, %a ret <2 x float> %mul } @@ -1465,7 +1465,7 @@ %0 = bitcast <1 x double> %a to <8 x i8> %1 = bitcast <8 x i8> %0 to double %extract = extractelement <2 x double> %v, i32 1 - %2 = fmul double %1, %extract + %2 = fmul nexc nrnd double %1, %extract %3 = insertelement <1 x double> undef, double %2, i32 0 ret <1 x double> %3 } @@ -1476,7 +1476,7 @@ ; CHECK-NEXT: ret entry: %shuffle = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> - %mul = fmul <4 x float> %shuffle, %a + %mul = fmul nexc nrnd <4 x float> %shuffle, %a ret <4 x float> %mul } @@ -1486,7 +1486,7 @@ ; CHECK-NEXT: ret entry: %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> - %mul = fmul <2 x double> %shuffle, %a + %mul = fmul nexc nrnd <2 x double> %shuffle, %a ret <2 x double> %mul } @@ -1931,7 +1931,7 @@ ; CHECK: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0] ; CHECK-NEXT: ret entry: - %sub = fsub <2 x float> , %v + %sub = fsub nexc nrnd <2 x float> , %v %lane = shufflevector <2 x float> %sub, <2 x float> undef, <2 x i32> zeroinitializer %0 = tail call <2 x float> @llvm.fma.v2f32(<2 x float> %lane, <2 x float> %b, <2 x float> %a) ret <2 x float> %0 @@ -1942,7 +1942,7 @@ ; CHECK: fmls {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0] ; CHECK-NEXT: ret entry: - %sub = fsub <2 x float> , %v + %sub = fsub nexc nrnd <2 x float> , %v %lane = shufflevector <2 x float> %sub, <2 x float> undef, <4 x i32> zeroinitializer %0 = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %lane, <4 x float> %b, <4 x float> %a) ret <4 x float> %0 @@ -1953,7 +1953,7 @@ ; CHECK: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0] ; CHECK-NEXT: ret entry: - %sub = fsub <4 x float> , %v + %sub = fsub nexc nrnd <4 x float> , %v %lane = shufflevector <4 x float> %sub, <4 x float> undef, <2 x i32> zeroinitializer %0 = tail call <2 x float> @llvm.fma.v2f32(<2 x float> %lane, <2 x float> %b, <2 x float> %a) ret <2 x float> %0 @@ -1964,7 +1964,7 @@ ; CHECK: fmls {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0] ; CHECK-NEXT: ret entry: - %sub = fsub <4 x float> , %v + %sub = fsub nexc nrnd <4 x float> , %v %lane = shufflevector <4 x float> %sub, <4 x float> undef, <4 x i32> zeroinitializer %0 = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %lane, <4 x float> %b, <4 x float> %a) ret <4 x float> %0 @@ -1985,7 +1985,7 @@ ; CHECK: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0] ; CHECK-NEXT: ret entry: - %sub = fsub <2 x double> , %v + %sub = fsub nexc nrnd <2 x double> , %v %lane = shufflevector <2 x double> %sub, <2 x double> undef, <2 x i32> zeroinitializer %0 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %lane, <2 x double> %b, <2 x double> %a) ret <2 x double> %0 @@ -2789,7 +2789,7 @@ ; CHECK-NEXT: ret entry: %shuffle = shufflevector <2 x float> %v, <2 x float> undef, <2 x i32> zeroinitializer - %mul = fmul <2 x float> %shuffle, %a + %mul = fmul nexc nrnd <2 x float> %shuffle, %a ret <2 x float> %mul } @@ -2799,7 +2799,7 @@ ; CHECK-NEXT: ret entry: %shuffle = shufflevector <2 x float> %v, <2 x float> undef, <4 x i32> zeroinitializer - %mul = fmul <4 x float> %shuffle, %a + %mul = fmul nexc nrnd <4 x float> %shuffle, %a ret <4 x float> %mul } @@ -2809,7 +2809,7 @@ ; CHECK-NEXT: ret entry: %shuffle = shufflevector <4 x float> %v, <4 x float> undef, <2 x i32> zeroinitializer - %mul = fmul <2 x float> %shuffle, %a + %mul = fmul nexc nrnd <2 x float> %shuffle, %a ret <2 x float> %mul } @@ -2821,7 +2821,7 @@ %0 = bitcast <1 x double> %a to <8 x i8> %1 = bitcast <8 x i8> %0 to double %extract = extractelement <2 x double> %v, i32 0 - %2 = fmul double %1, %extract + %2 = fmul nexc nrnd double %1, %extract %3 = insertelement <1 x double> undef, double %2, i32 0 ret <1 x double> %3 } @@ -2832,7 +2832,7 @@ ; CHECK-NEXT: ret entry: %shuffle = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> zeroinitializer - %mul = fmul <4 x float> %shuffle, %a + %mul = fmul nexc nrnd <4 x float> %shuffle, %a ret <4 x float> %mul } @@ -2842,7 +2842,7 @@ ; CHECK-NEXT: ret entry: %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> zeroinitializer - %mul = fmul <2 x double> %shuffle, %a + %mul = fmul nexc nrnd <2 x double> %shuffle, %a ret <2 x double> %mul } Index: test/CodeGen/AArch64/arm64-neon-scalar-by-elem-mul.ll =================================================================== --- test/CodeGen/AArch64/arm64-neon-scalar-by-elem-mul.ll +++ test/CodeGen/AArch64/arm64-neon-scalar-by-elem-mul.ll @@ -4,7 +4,7 @@ ; CHECK-LABEL: test_fmul_lane_ss2S ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1] %tmp1 = extractelement <2 x float> %v, i32 1 - %tmp2 = fmul float %a, %tmp1; + %tmp2 = fmul nexc nrnd float %a, %tmp1; ret float %tmp2; } @@ -12,7 +12,7 @@ ; CHECK-LABEL: test_fmul_lane_ss2S_swap ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[1] %tmp1 = extractelement <2 x float> %v, i32 1 - %tmp2 = fmul float %tmp1, %a; + %tmp2 = fmul nexc nrnd float %tmp1, %a; ret float %tmp2; } @@ -21,7 +21,7 @@ ; CHECK-LABEL: test_fmul_lane_ss4S ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3] %tmp1 = extractelement <4 x float> %v, i32 3 - %tmp2 = fmul float %a, %tmp1; + %tmp2 = fmul nexc nrnd float %a, %tmp1; ret float %tmp2; } @@ -29,7 +29,7 @@ ; CHECK-LABEL: test_fmul_lane_ss4S_swap ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}}.s[3] %tmp1 = extractelement <4 x float> %v, i32 3 - %tmp2 = fmul float %tmp1, %a; + %tmp2 = fmul nexc nrnd float %tmp1, %a; ret float %tmp2; } @@ -38,7 +38,7 @@ ; CHECK-LABEL: test_fmul_lane_ddD ; CHECK: fmul {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+.d\[0]|d[0-9]+}} %tmp1 = extractelement <1 x double> %v, i32 0 - %tmp2 = fmul double %a, %tmp1; + %tmp2 = fmul nexc nrnd double %a, %tmp1; ret double %tmp2; } @@ -48,7 +48,7 @@ ; CHECK-LABEL: test_fmul_lane_dd2D ; CHECK: fmul {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1] %tmp1 = extractelement <2 x double> %v, i32 1 - %tmp2 = fmul double %a, %tmp1; + %tmp2 = fmul nexc nrnd double %a, %tmp1; ret double %tmp2; } @@ -57,7 +57,7 @@ ; CHECK-LABEL: test_fmul_lane_dd2D_swap ; CHECK: fmul {{d[0-9]+}}, {{d[0-9]+}}, {{v[0-9]+}}.d[1] %tmp1 = extractelement <2 x double> %v, i32 1 - %tmp2 = fmul double %tmp1, %a; + %tmp2 = fmul nexc nrnd double %tmp1, %a; ret double %tmp2; } Index: test/CodeGen/AArch64/arm64-vmul.ll =================================================================== --- test/CodeGen/AArch64/arm64-vmul.ll +++ test/CodeGen/AArch64/arm64-vmul.ll @@ -480,7 +480,7 @@ %tmp1 = load <2 x float>, <2 x float>* %A %tmp2 = load <2 x float>, <2 x float>* %B %tmp3 = load <2 x float>, <2 x float>* %C - %tmp4 = fsub <2 x float> , %tmp2 + %tmp4 = fsub nexc nrnd <2 x float> , %tmp2 %tmp5 = call <2 x float> @llvm.fma.v2f32(<2 x float> %tmp1, <2 x float> %tmp4, <2 x float> %tmp3) ret <2 x float> %tmp5 } @@ -491,7 +491,7 @@ %tmp1 = load <4 x float>, <4 x float>* %A %tmp2 = load <4 x float>, <4 x float>* %B %tmp3 = load <4 x float>, <4 x float>* %C - %tmp4 = fsub <4 x float> , %tmp2 + %tmp4 = fsub nexc nrnd <4 x float> , %tmp2 %tmp5 = call <4 x float> @llvm.fma.v4f32(<4 x float> %tmp1, <4 x float> %tmp4, <4 x float> %tmp3) ret <4 x float> %tmp5 } @@ -502,7 +502,7 @@ %tmp1 = load <2 x double>, <2 x double>* %A %tmp2 = load <2 x double>, <2 x double>* %B %tmp3 = load <2 x double>, <2 x double>* %C - %tmp4 = fsub <2 x double> , %tmp2 + %tmp4 = fsub nexc nrnd <2 x double> , %tmp2 %tmp5 = call <2 x double> @llvm.fma.v2f64(<2 x double> %tmp1, <2 x double> %tmp4, <2 x double> %tmp3) ret <2 x double> %tmp5 } @@ -513,7 +513,7 @@ %tmp1 = load <2 x float>, <2 x float>* %A %tmp2 = load <2 x float>, <2 x float>* %B %tmp3 = load <2 x float>, <2 x float>* %C - %tmp4 = fsub <2 x float> , %tmp2 + %tmp4 = fsub nexc nrnd <2 x float> , %tmp2 %tmp5 = call <2 x float> @llvm.fma.v2f32(<2 x float> %tmp4, <2 x float> %tmp1, <2 x float> %tmp3) ret <2 x float> %tmp5 } @@ -524,7 +524,7 @@ %tmp1 = load <4 x float>, <4 x float>* %A %tmp2 = load <4 x float>, <4 x float>* %B %tmp3 = load <4 x float>, <4 x float>* %C - %tmp4 = fsub <4 x float> , %tmp2 + %tmp4 = fsub nexc nrnd <4 x float> , %tmp2 %tmp5 = call <4 x float> @llvm.fma.v4f32(<4 x float> %tmp4, <4 x float> %tmp1, <4 x float> %tmp3) ret <4 x float> %tmp5 } @@ -535,7 +535,7 @@ %tmp1 = load <2 x double>, <2 x double>* %A %tmp2 = load <2 x double>, <2 x double>* %B %tmp3 = load <2 x double>, <2 x double>* %C - %tmp4 = fsub <2 x double> , %tmp2 + %tmp4 = fsub nexc nrnd <2 x double> , %tmp2 %tmp5 = call <2 x double> @llvm.fma.v2f64(<2 x double> %tmp4, <2 x double> %tmp1, <2 x double> %tmp3) ret <2 x double> %tmp5 } @@ -544,7 +544,7 @@ ;CHECK-LABEL: fmls_indexed_2s: ;CHECK: fmls.2s entry: - %0 = fsub <2 x float> , %c + %0 = fsub nexc nrnd <2 x float> , %c %lane = shufflevector <2 x float> %b, <2 x float> undef, <2 x i32> zeroinitializer %fmls1 = tail call <2 x float> @llvm.fma.v2f32(<2 x float> %0, <2 x float> %lane, <2 x float> %a) ret <2 x float> %fmls1 @@ -554,7 +554,7 @@ ;CHECK-LABEL: fmls_indexed_4s: ;CHECK: fmls.4s entry: - %0 = fsub <4 x float> , %c + %0 = fsub nexc nrnd <4 x float> , %c %lane = shufflevector <4 x float> %b, <4 x float> undef, <4 x i32> zeroinitializer %fmls1 = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %0, <4 x float> %lane, <4 x float> %a) ret <4 x float> %fmls1 @@ -564,7 +564,7 @@ ;CHECK-LABEL: fmls_indexed_2d: ;CHECK: fmls.2d entry: - %0 = fsub <2 x double> , %c + %0 = fsub nexc nrnd <2 x double> , %c %lane = shufflevector <2 x double> %b, <2 x double> undef, <2 x i32> zeroinitializer %fmls1 = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %0, <2 x double> %lane, <2 x double> %a) ret <2 x double> %fmls1 @@ -664,7 +664,7 @@ %tmp1 = load <2 x float>, <2 x float>* %A %tmp2 = load <2 x float>, <2 x float>* %B %tmp3 = shufflevector <2 x float> %tmp2, <2 x float> %tmp2, <2 x i32> - %tmp4 = fmul <2 x float> %tmp1, %tmp3 + %tmp4 = fmul nexc nrnd <2 x float> %tmp1, %tmp3 ret <2 x float> %tmp4 } @@ -675,7 +675,7 @@ %tmp1 = load <4 x float>, <4 x float>* %A %tmp2 = load <4 x float>, <4 x float>* %B %tmp3 = shufflevector <4 x float> %tmp2, <4 x float> %tmp2, <4 x i32> - %tmp4 = fmul <4 x float> %tmp1, %tmp3 + %tmp4 = fmul nexc nrnd <4 x float> %tmp1, %tmp3 ret <4 x float> %tmp4 } @@ -686,7 +686,7 @@ %tmp1 = load <2 x double>, <2 x double>* %A %tmp2 = load <2 x double>, <2 x double>* %B %tmp3 = shufflevector <2 x double> %tmp2, <2 x double> %tmp2, <2 x i32> - %tmp4 = fmul <2 x double> %tmp1, %tmp3 + %tmp4 = fmul nexc nrnd <2 x double> %tmp1, %tmp3 ret <2 x double> %tmp4 } @@ -695,7 +695,7 @@ ;CHECK-NOT: dup ;CHECK: fmul.s s0, s0, v1[3] %B = extractelement <4 x float> %vec, i32 3 - %res = fmul float %A, %B + %res = fmul nexc nrnd float %A, %B ret float %res } @@ -704,7 +704,7 @@ ;CHECK-NOT: dup ;CHECK: fmul.d d0, d0, v1[1] %B = extractelement <2 x double> %vec, i32 1 - %res = fmul double %A, %B + %res = fmul nexc nrnd double %A, %B ret double %res } @@ -1546,7 +1546,7 @@ ; CHECK: fmul.2d v0, v0, v1[0] %vecinit.i = insertelement <2 x double> undef, double %y, i32 0 %vecinit1.i = insertelement <2 x double> %vecinit.i, double %y, i32 1 - %mul.i = fmul <2 x double> %vecinit1.i, %x + %mul.i = fmul nexc nrnd <2 x double> %vecinit1.i, %x ret <2 x double> %mul.i } @@ -1559,7 +1559,7 @@ %vecinit1.i = insertelement <4 x float> %vecinit.i, float %y, i32 1 %vecinit2.i = insertelement <4 x float> %vecinit1.i, float %y, i32 2 %vecinit3.i = insertelement <4 x float> %vecinit2.i, float %y, i32 3 - %mul.i = fmul <4 x float> %vecinit3.i, %x + %mul.i = fmul nexc nrnd <4 x float> %vecinit3.i, %x ret <4 x float> %mul.i } @@ -1570,7 +1570,7 @@ ; CHECK: fmul.2s v0, v0, v1[0] %vecinit.i = insertelement <2 x float> undef, float %y, i32 0 %vecinit1.i = insertelement <2 x float> %vecinit.i, float %y, i32 1 - %mul.i = fmul <2 x float> %vecinit1.i, %x + %mul.i = fmul nexc nrnd <2 x float> %vecinit1.i, %x ret <2 x float> %mul.i } @@ -1900,7 +1900,7 @@ ; CHECK-LABEL: scalar_fmls_from_extract_v4f32: ; CHECK: fmls.s s0, s1, v2[3] %rhs.scal = extractelement <4 x float> %rvec, i32 3 - %rhs = fsub float -0.0, %rhs.scal + %rhs = fsub nexc nrnd float -0.0, %rhs.scal %res = call float @llvm.fma.f32(float %lhs, float %rhs, float %accum) ret float %res } @@ -1909,7 +1909,7 @@ ; CHECK-LABEL: scalar_fmls_from_extract_v2f32: ; CHECK: fmls.s s0, s1, v2[1] %rhs.scal = extractelement <2 x float> %rvec, i32 1 - %rhs = fsub float -0.0, %rhs.scal + %rhs = fsub nexc nrnd float -0.0, %rhs.scal %res = call float @llvm.fma.f32(float %lhs, float %rhs, float %accum) ret float %res } @@ -1928,7 +1928,7 @@ ; CHECK-LABEL: scalar_fmls_from_extract_v2f64: ; CHECK: fmls.d d0, d1, v2[1] %rhs.scal = extractelement <2 x double> %rvec, i32 1 - %rhs = fsub double -0.0, %rhs.scal + %rhs = fsub nexc nrnd double -0.0, %rhs.scal %res = call double @llvm.fma.f64(double %lhs, double %rhs, double %accum) ret double %res } @@ -1938,7 +1938,7 @@ define <2 x float> @fmls_with_fneg_before_extract_v2f32(<2 x float> %accum, <2 x float> %lhs, <4 x float> %rhs) { ; CHECK-LABEL: fmls_with_fneg_before_extract_v2f32: ; CHECK: fmls.2s v0, v1, v2[3] - %rhs_neg = fsub <4 x float> , %rhs + %rhs_neg = fsub nexc nrnd <4 x float> , %rhs %splat = shufflevector <4 x float> %rhs_neg, <4 x float> undef, <2 x i32> %res = call <2 x float> @llvm.fma.v2f32(<2 x float> %lhs, <2 x float> %splat, <2 x float> %accum) ret <2 x float> %res @@ -1947,7 +1947,7 @@ define <2 x float> @fmls_with_fneg_before_extract_v2f32_1(<2 x float> %accum, <2 x float> %lhs, <2 x float> %rhs) { ; CHECK-LABEL: fmls_with_fneg_before_extract_v2f32_1: ; CHECK: fmls.2s v0, v1, v2[1] - %rhs_neg = fsub <2 x float> , %rhs + %rhs_neg = fsub nexc nrnd <2 x float> , %rhs %splat = shufflevector <2 x float> %rhs_neg, <2 x float> undef, <2 x i32> %res = call <2 x float> @llvm.fma.v2f32(<2 x float> %lhs, <2 x float> %splat, <2 x float> %accum) ret <2 x float> %res @@ -1956,7 +1956,7 @@ define <4 x float> @fmls_with_fneg_before_extract_v4f32(<4 x float> %accum, <4 x float> %lhs, <4 x float> %rhs) { ; CHECK-LABEL: fmls_with_fneg_before_extract_v4f32: ; CHECK: fmls.4s v0, v1, v2[3] - %rhs_neg = fsub <4 x float> , %rhs + %rhs_neg = fsub nexc nrnd <4 x float> , %rhs %splat = shufflevector <4 x float> %rhs_neg, <4 x float> undef, <4 x i32> %res = call <4 x float> @llvm.fma.v4f32(<4 x float> %lhs, <4 x float> %splat, <4 x float> %accum) ret <4 x float> %res @@ -1965,7 +1965,7 @@ define <4 x float> @fmls_with_fneg_before_extract_v4f32_1(<4 x float> %accum, <4 x float> %lhs, <2 x float> %rhs) { ; CHECK-LABEL: fmls_with_fneg_before_extract_v4f32_1: ; CHECK: fmls.4s v0, v1, v2[1] - %rhs_neg = fsub <2 x float> , %rhs + %rhs_neg = fsub nexc nrnd <2 x float> , %rhs %splat = shufflevector <2 x float> %rhs_neg, <2 x float> undef, <4 x i32> %res = call <4 x float> @llvm.fma.v4f32(<4 x float> %lhs, <4 x float> %splat, <4 x float> %accum) ret <4 x float> %res @@ -1974,7 +1974,7 @@ define <2 x double> @fmls_with_fneg_before_extract_v2f64(<2 x double> %accum, <2 x double> %lhs, <2 x double> %rhs) { ; CHECK-LABEL: fmls_with_fneg_before_extract_v2f64: ; CHECK: fmls.2d v0, v1, v2[1] - %rhs_neg = fsub <2 x double> , %rhs + %rhs_neg = fsub nexc nrnd <2 x double> , %rhs %splat = shufflevector <2 x double> %rhs_neg, <2 x double> undef, <2 x i32> %res = call <2 x double> @llvm.fma.v2f64(<2 x double> %lhs, <2 x double> %splat, <2 x double> %accum) ret <2 x double> %res @@ -1983,14 +1983,14 @@ define <1 x double> @test_fmul_v1f64(<1 x double> %L, <1 x double> %R) nounwind { ; CHECK-LABEL: test_fmul_v1f64: ; CHECK: fmul - %prod = fmul <1 x double> %L, %R + %prod = fmul nexc nrnd <1 x double> %L, %R ret <1 x double> %prod } define <1 x double> @test_fdiv_v1f64(<1 x double> %L, <1 x double> %R) nounwind { ; CHECK-LABEL: test_fdiv_v1f64: ; CHECK-LABEL: fdiv - %prod = fdiv <1 x double> %L, %R + %prod = fdiv nexc nrnd <1 x double> %L, %R ret <1 x double> %prod } Index: test/CodeGen/AArch64/fcvt-fixed.ll =================================================================== --- test/CodeGen/AArch64/fcvt-fixed.ll +++ test/CodeGen/AArch64/fcvt-fixed.ll @@ -10,42 +10,42 @@ define void @test_fcvtzs(float %flt, double %dbl) { ; CHECK-LABEL: test_fcvtzs: - %fix1 = fmul float %flt, 128.0 + %fix1 = fmul nexc nrnd float %flt, 128.0 %cvt1 = fptosi float %fix1 to i32 ; CHECK: fcvtzs {{w[0-9]+}}, {{s[0-9]+}}, #7 store volatile i32 %cvt1, i32* @var32 - %fix2 = fmul float %flt, 4294967296.0 + %fix2 = fmul nexc nrnd float %flt, 4294967296.0 %cvt2 = fptosi float %fix2 to i32 ; CHECK: fcvtzs {{w[0-9]+}}, {{s[0-9]+}}, #32 store volatile i32 %cvt2, i32* @var32 - %fix3 = fmul float %flt, 128.0 + %fix3 = fmul nexc nrnd float %flt, 128.0 %cvt3 = fptosi float %fix3 to i64 ; CHECK: fcvtzs {{x[0-9]+}}, {{s[0-9]+}}, #7 store volatile i64 %cvt3, i64* @var64 - %fix4 = fmul float %flt, 18446744073709551616.0 + %fix4 = fmul nexc nrnd float %flt, 18446744073709551616.0 %cvt4 = fptosi float %fix4 to i64 ; CHECK: fcvtzs {{x[0-9]+}}, {{s[0-9]+}}, #64 store volatile i64 %cvt4, i64* @var64 - %fix5 = fmul double %dbl, 128.0 + %fix5 = fmul nexc nrnd double %dbl, 128.0 %cvt5 = fptosi double %fix5 to i32 ; CHECK: fcvtzs {{w[0-9]+}}, {{d[0-9]+}}, #7 store volatile i32 %cvt5, i32* @var32 - %fix6 = fmul double %dbl, 4294967296.0 + %fix6 = fmul nexc nrnd double %dbl, 4294967296.0 %cvt6 = fptosi double %fix6 to i32 ; CHECK: fcvtzs {{w[0-9]+}}, {{d[0-9]+}}, #32 store volatile i32 %cvt6, i32* @var32 - %fix7 = fmul double %dbl, 128.0 + %fix7 = fmul nexc nrnd double %dbl, 128.0 %cvt7 = fptosi double %fix7 to i64 ; CHECK: fcvtzs {{x[0-9]+}}, {{d[0-9]+}}, #7 store volatile i64 %cvt7, i64* @var64 - %fix8 = fmul double %dbl, 18446744073709551616.0 + %fix8 = fmul nexc nrnd double %dbl, 18446744073709551616.0 %cvt8 = fptosi double %fix8 to i64 ; CHECK: fcvtzs {{x[0-9]+}}, {{d[0-9]+}}, #64 store volatile i64 %cvt8, i64* @var64 @@ -56,42 +56,42 @@ define void @test_fcvtzu(float %flt, double %dbl) { ; CHECK-LABEL: test_fcvtzu: - %fix1 = fmul float %flt, 128.0 + %fix1 = fmul nexc nrnd float %flt, 128.0 %cvt1 = fptoui float %fix1 to i32 ; CHECK: fcvtzu {{w[0-9]+}}, {{s[0-9]+}}, #7 store volatile i32 %cvt1, i32* @var32 - %fix2 = fmul float %flt, 4294967296.0 + %fix2 = fmul nexc nrnd float %flt, 4294967296.0 %cvt2 = fptoui float %fix2 to i32 ; CHECK: fcvtzu {{w[0-9]+}}, {{s[0-9]+}}, #32 store volatile i32 %cvt2, i32* @var32 - %fix3 = fmul float %flt, 128.0 + %fix3 = fmul nexc nrnd float %flt, 128.0 %cvt3 = fptoui float %fix3 to i64 ; CHECK: fcvtzu {{x[0-9]+}}, {{s[0-9]+}}, #7 store volatile i64 %cvt3, i64* @var64 - %fix4 = fmul float %flt, 18446744073709551616.0 + %fix4 = fmul nexc nrnd float %flt, 18446744073709551616.0 %cvt4 = fptoui float %fix4 to i64 ; CHECK: fcvtzu {{x[0-9]+}}, {{s[0-9]+}}, #64 store volatile i64 %cvt4, i64* @var64 - %fix5 = fmul double %dbl, 128.0 + %fix5 = fmul nexc nrnd double %dbl, 128.0 %cvt5 = fptoui double %fix5 to i32 ; CHECK: fcvtzu {{w[0-9]+}}, {{d[0-9]+}}, #7 store volatile i32 %cvt5, i32* @var32 - %fix6 = fmul double %dbl, 4294967296.0 + %fix6 = fmul nexc nrnd double %dbl, 4294967296.0 %cvt6 = fptoui double %fix6 to i32 ; CHECK: fcvtzu {{w[0-9]+}}, {{d[0-9]+}}, #32 store volatile i32 %cvt6, i32* @var32 - %fix7 = fmul double %dbl, 128.0 + %fix7 = fmul nexc nrnd double %dbl, 128.0 %cvt7 = fptoui double %fix7 to i64 ; CHECK: fcvtzu {{x[0-9]+}}, {{d[0-9]+}}, #7 store volatile i64 %cvt7, i64* @var64 - %fix8 = fmul double %dbl, 18446744073709551616.0 + %fix8 = fmul nexc nrnd double %dbl, 18446744073709551616.0 %cvt8 = fptoui double %fix8 to i64 ; CHECK: fcvtzu {{x[0-9]+}}, {{d[0-9]+}}, #64 store volatile i64 %cvt8, i64* @var64 @@ -106,42 +106,42 @@ ; CHECK-LABEL: test_scvtf: %cvt1 = sitofp i32 %int to float - %fix1 = fdiv float %cvt1, 128.0 + %fix1 = fdiv nexc nrnd float %cvt1, 128.0 ; CHECK: scvtf {{s[0-9]+}}, {{w[0-9]+}}, #7 store volatile float %fix1, float* @varfloat %cvt2 = sitofp i32 %int to float - %fix2 = fdiv float %cvt2, 4294967296.0 + %fix2 = fdiv nexc nrnd float %cvt2, 4294967296.0 ; CHECK: scvtf {{s[0-9]+}}, {{w[0-9]+}}, #32 store volatile float %fix2, float* @varfloat %cvt3 = sitofp i64 %long to float - %fix3 = fdiv float %cvt3, 128.0 + %fix3 = fdiv nexc nrnd float %cvt3, 128.0 ; CHECK: scvtf {{s[0-9]+}}, {{x[0-9]+}}, #7 store volatile float %fix3, float* @varfloat %cvt4 = sitofp i64 %long to float - %fix4 = fdiv float %cvt4, 18446744073709551616.0 + %fix4 = fdiv nexc nrnd float %cvt4, 18446744073709551616.0 ; CHECK: scvtf {{s[0-9]+}}, {{x[0-9]+}}, #64 store volatile float %fix4, float* @varfloat %cvt5 = sitofp i32 %int to double - %fix5 = fdiv double %cvt5, 128.0 + %fix5 = fdiv nexc nrnd double %cvt5, 128.0 ; CHECK: scvtf {{d[0-9]+}}, {{w[0-9]+}}, #7 store volatile double %fix5, double* @vardouble %cvt6 = sitofp i32 %int to double - %fix6 = fdiv double %cvt6, 4294967296.0 + %fix6 = fdiv nexc nrnd double %cvt6, 4294967296.0 ; CHECK: scvtf {{d[0-9]+}}, {{w[0-9]+}}, #32 store volatile double %fix6, double* @vardouble %cvt7 = sitofp i64 %long to double - %fix7 = fdiv double %cvt7, 128.0 + %fix7 = fdiv nexc nrnd double %cvt7, 128.0 ; CHECK: scvtf {{d[0-9]+}}, {{x[0-9]+}}, #7 store volatile double %fix7, double* @vardouble %cvt8 = sitofp i64 %long to double - %fix8 = fdiv double %cvt8, 18446744073709551616.0 + %fix8 = fdiv nexc nrnd double %cvt8, 18446744073709551616.0 ; CHECK: scvtf {{d[0-9]+}}, {{x[0-9]+}}, #64 store volatile double %fix8, double* @vardouble @@ -152,42 +152,42 @@ ; CHECK-LABEL: test_ucvtf: %cvt1 = uitofp i32 %int to float - %fix1 = fdiv float %cvt1, 128.0 + %fix1 = fdiv nexc nrnd float %cvt1, 128.0 ; CHECK: ucvtf {{s[0-9]+}}, {{w[0-9]+}}, #7 store volatile float %fix1, float* @varfloat %cvt2 = uitofp i32 %int to float - %fix2 = fdiv float %cvt2, 4294967296.0 + %fix2 = fdiv nexc nrnd float %cvt2, 4294967296.0 ; CHECK: ucvtf {{s[0-9]+}}, {{w[0-9]+}}, #32 store volatile float %fix2, float* @varfloat %cvt3 = uitofp i64 %long to float - %fix3 = fdiv float %cvt3, 128.0 + %fix3 = fdiv nexc nrnd float %cvt3, 128.0 ; CHECK: ucvtf {{s[0-9]+}}, {{x[0-9]+}}, #7 store volatile float %fix3, float* @varfloat %cvt4 = uitofp i64 %long to float - %fix4 = fdiv float %cvt4, 18446744073709551616.0 + %fix4 = fdiv nexc nrnd float %cvt4, 18446744073709551616.0 ; CHECK: ucvtf {{s[0-9]+}}, {{x[0-9]+}}, #64 store volatile float %fix4, float* @varfloat %cvt5 = uitofp i32 %int to double - %fix5 = fdiv double %cvt5, 128.0 + %fix5 = fdiv nexc nrnd double %cvt5, 128.0 ; CHECK: ucvtf {{d[0-9]+}}, {{w[0-9]+}}, #7 store volatile double %fix5, double* @vardouble %cvt6 = uitofp i32 %int to double - %fix6 = fdiv double %cvt6, 4294967296.0 + %fix6 = fdiv nexc nrnd double %cvt6, 4294967296.0 ; CHECK: ucvtf {{d[0-9]+}}, {{w[0-9]+}}, #32 store volatile double %fix6, double* @vardouble %cvt7 = uitofp i64 %long to double - %fix7 = fdiv double %cvt7, 128.0 + %fix7 = fdiv nexc nrnd double %cvt7, 128.0 ; CHECK: ucvtf {{d[0-9]+}}, {{x[0-9]+}}, #7 store volatile double %fix7, double* @vardouble %cvt8 = uitofp i64 %long to double - %fix8 = fdiv double %cvt8, 18446744073709551616.0 + %fix8 = fdiv nexc nrnd double %cvt8, 18446744073709551616.0 ; CHECK: ucvtf {{d[0-9]+}}, {{x[0-9]+}}, #64 store volatile double %fix8, double* @vardouble Index: test/CodeGen/AArch64/fcvt_combine.ll =================================================================== --- test/CodeGen/AArch64/fcvt_combine.ll +++ test/CodeGen/AArch64/fcvt_combine.ll @@ -5,7 +5,7 @@ ; CHECK: fcvtzs.2s v0, v0, #4 ; CHECK: ret define <2 x i32> @test1(<2 x float> %f) { - %mul.i = fmul <2 x float> %f, + %mul.i = fmul nexc nrnd <2 x float> %f, %vcvt.i = fptosi <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -15,7 +15,7 @@ ; CHECK: fcvtzs.4s v0, v0, #3 ; CHECK: ret define <4 x i32> @test2(<4 x float> %f) { - %mul.i = fmul <4 x float> %f, + %mul.i = fmul nexc nrnd <4 x float> %f, %vcvt.i = fptosi <4 x float> %mul.i to <4 x i32> ret <4 x i32> %vcvt.i } @@ -25,7 +25,7 @@ ; CHECK: fcvtzs.2d v0, v0, #5 ; CHECK: ret define <2 x i64> @test3(<2 x double> %d) { - %mul.i = fmul <2 x double> %d, + %mul.i = fmul nexc nrnd <2 x double> %d, %vcvt.i = fptosi <2 x double> %mul.i to <2 x i64> ret <2 x i64> %vcvt.i } @@ -37,7 +37,7 @@ ; CHECK: xtn.2s ; CHECK: ret define <2 x i32> @test4(<2 x double> %d) { - %mul.i = fmul <2 x double> %d, + %mul.i = fmul nexc nrnd <2 x double> %d, %vcvt.i = fptosi <2 x double> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -48,7 +48,7 @@ ; CHECK: fcvtzs.2s v0, v0, #4 ; CHECK: ret define <2 x i16> @test5(<2 x float> %f) { - %mul.i = fmul <2 x float> %f, + %mul.i = fmul nexc nrnd <2 x float> %f, %vcvt.i = fptosi <2 x float> %mul.i to <2 x i16> ret <2 x i16> %vcvt.i } @@ -61,7 +61,7 @@ ; CHECK: fcvtzs.2d v0, v0 ; CHECK: ret define <2 x i64> @test6(<2 x float> %f) { - %mul.i = fmul <2 x float> %f, + %mul.i = fmul nexc nrnd <2 x float> %f, %vcvt.i = fptosi <2 x float> %mul.i to <2 x i64> ret <2 x i64> %vcvt.i } @@ -72,7 +72,7 @@ ; CHECK: fcvtzu.2s v0, v0, #4 ; CHECK: ret define <2 x i32> @test7(<2 x float> %f) { - %mul.i = fmul <2 x float> %f, + %mul.i = fmul nexc nrnd <2 x float> %f, %vcvt.i = fptoui <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -84,7 +84,7 @@ ; CHECK: fcvtzu.2s v0, v0 ; CHECK: ret define <2 x i32> @test8(<2 x float> %f) { - %mul.i = fmul <2 x float> %f, + %mul.i = fmul nexc nrnd <2 x float> %f, %vcvt.i = fptoui <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -95,7 +95,7 @@ ; CHECK: fcvtzu.2s v0, v0 ; CHECK: ret define <2 x i32> @test9(<2 x float> %f) { - %mul.i = fmul <2 x float> %f, + %mul.i = fmul nexc nrnd <2 x float> %f, %vcvt.i = fptoui <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -106,7 +106,7 @@ ; CHECK: fcvtzu.2s v{{[0-9]+}}, v{{[0-9]+}} ; CHECK: ret define <2 x i32> @test10(<2 x float> %f) { - %mul.i = fmul <2 x float> %f, + %mul.i = fmul nexc nrnd <2 x float> %f, %vcvt.i = fptoui <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -116,7 +116,7 @@ ; CHECK: fcvtzu.2s v0, v0, #3 ; CHECK: ret define <2 x i32> @test11(<2 x float> %f) { - %mul.i = fmul <2 x float> %f, + %mul.i = fmul nexc nrnd <2 x float> %f, %vcvt.i = fptoui <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -127,7 +127,7 @@ ; CHECK: fcvtzs.2s v0, v0 ; CHECK: ret define <2 x i32> @test12(<2 x float> %f) { - %mul.i = fmul <2 x float> %f, + %mul.i = fmul nexc nrnd <2 x float> %f, %vcvt.i = fptosi <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -138,7 +138,7 @@ ; CHECK: fcvtzs.2s v0, v0 ; CHECK: ret define <2 x i32> @test13(<2 x float> %f) { - %mul.i = fmul <2 x float> %f, + %mul.i = fmul nexc nrnd <2 x float> %f, %vcvt.i = fptosi <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -148,7 +148,7 @@ ; CHECK: fcvtzs.2s v0, v0, #32 ; CHECK: ret define <2 x i32> @test14(<2 x float> %f) { - %mul.i = fmul <2 x float> %f, + %mul.i = fmul nexc nrnd <2 x float> %f, %vcvt.i = fptosi <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } Index: test/CodeGen/AArch64/fdiv-combine.ll =================================================================== --- test/CodeGen/AArch64/fdiv-combine.ll +++ test/CodeGen/AArch64/fdiv-combine.ll @@ -11,9 +11,9 @@ ; CHECK: fmul ; CHECK: fmul ; CHECK: fmul - %div = fdiv float %a, %D - %div1 = fdiv float %b, %D - %div2 = fdiv float %c, %D + %div = fdiv nexc nrnd float %a, %D + %div1 = fdiv nexc nrnd float %b, %D + %div2 = fdiv nexc nrnd float %c, %D tail call void @foo_3f(float %div, float %div1, float %div2) ret void } @@ -25,9 +25,9 @@ ; CHECK: fmul ; CHECK: fmul ; CHECK: fmul - %div = fdiv double %a, %D - %div1 = fdiv double %b, %D - %div2 = fdiv double %c, %D + %div = fdiv nexc nrnd double %a, %D + %div1 = fdiv nexc nrnd double %b, %D + %div2 = fdiv nexc nrnd double %c, %D tail call void @foo_3d(double %div, double %div1, double %div2) ret void } @@ -39,9 +39,9 @@ ; CHECK: fmul ; CHECK: fmul ; CHECK: fmul - %div = fdiv <4 x float> %a, %D - %div1 = fdiv <4 x float> %b, %D - %div2 = fdiv <4 x float> %c, %D + %div = fdiv nexc nrnd <4 x float> %a, %D + %div1 = fdiv nexc nrnd <4 x float> %b, %D + %div2 = fdiv nexc nrnd <4 x float> %c, %D tail call void @foo_3_4xf(<4 x float> %div, <4 x float> %div1, <4 x float> %div2) ret void } @@ -53,9 +53,9 @@ ; CHECK: fmul ; CHECK: fmul ; CHECK: fmul - %div = fdiv <2 x double> %a, %D - %div1 = fdiv <2 x double> %b, %D - %div2 = fdiv <2 x double> %c, %D + %div = fdiv nexc nrnd <2 x double> %a, %D + %div1 = fdiv nexc nrnd <2 x double> %b, %D + %div2 = fdiv nexc nrnd <2 x double> %c, %D tail call void @foo_3_2xd(<2 x double> %div, <2 x double> %div1, <2 x double> %div2) ret void } @@ -67,8 +67,8 @@ ; CHECK: fdiv ; CHECK: fdiv ; CHECK-NEXT-NOT: fmul - %div = fdiv float %a, %D - %div1 = fdiv float %b, %D + %div = fdiv nexc nrnd float %a, %D + %div1 = fdiv nexc nrnd float %b, %D tail call void @foo_2f(float %div, float %div1) ret void } @@ -78,8 +78,8 @@ ; CHECK: fdiv ; CHECK: fdiv ; CHECK-NEXT-NOT: fmul - %div = fdiv double %a, %D - %div1 = fdiv double %b, %D + %div = fdiv nexc nrnd double %a, %D + %div1 = fdiv nexc nrnd double %b, %D tail call void @foo_2d(double %div, double %div1) ret void } Index: test/CodeGen/AArch64/fdiv_combine.ll =================================================================== --- test/CodeGen/AArch64/fdiv_combine.ll +++ test/CodeGen/AArch64/fdiv_combine.ll @@ -7,7 +7,7 @@ define <2 x float> @test1(<2 x i32> %in) { entry: %vcvt.i = sitofp <2 x i32> %in to <2 x float> - %div.i = fdiv <2 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <2 x float> %vcvt.i, ret <2 x float> %div.i } @@ -18,7 +18,7 @@ define <2 x float> @test2(<2 x i32> %in) { entry: %vcvt.i = uitofp <2 x i32> %in to <2 x float> - %div.i = fdiv <2 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <2 x float> %vcvt.i, ret <2 x float> %div.i } @@ -31,7 +31,7 @@ define <2 x float> @test3(<2 x i32> %in) { entry: %vcvt.i = sitofp <2 x i32> %in to <2 x float> - %div.i = fdiv <2 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <2 x float> %vcvt.i, ret <2 x float> %div.i } @@ -44,7 +44,7 @@ define <2 x float> @test4(<2 x i32> %in) { entry: %vcvt.i = sitofp <2 x i32> %in to <2 x float> - %div.i = fdiv <2 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <2 x float> %vcvt.i, ret <2 x float> %div.i } @@ -55,7 +55,7 @@ define <2 x float> @test5(<2 x i32> %in) { entry: %vcvt.i = sitofp <2 x i32> %in to <2 x float> - %div.i = fdiv <2 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <2 x float> %vcvt.i, ret <2 x float> %div.i } @@ -66,7 +66,7 @@ define <4 x float> @test6(<4 x i32> %in) { entry: %vcvt.i = sitofp <4 x i32> %in to <4 x float> - %div.i = fdiv <4 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <4 x float> %vcvt.i, ret <4 x float> %div.i } @@ -77,7 +77,7 @@ ; CHECK: ret define <4 x float> @test7(<4 x i16> %in) { %conv = uitofp <4 x i16> %in to <4 x float> - %shift = fdiv <4 x float> %conv, + %shift = fdiv nexc nrnd <4 x float> %conv, ret <4 x float> %shift } @@ -88,7 +88,7 @@ ; CHECK: ret define <4 x float> @test8(<4 x i16> %in) { %conv = sitofp <4 x i16> %in to <4 x float> - %shift = fdiv <4 x float> %conv, + %shift = fdiv nexc nrnd <4 x float> %conv, ret <4 x float> %shift } @@ -101,7 +101,7 @@ ; CHECK: ret define <2 x float> @test9(<2 x i64> %in) { %conv = uitofp <2 x i64> %in to <2 x float> - %shift = fdiv <2 x float> %conv, + %shift = fdiv nexc nrnd <2 x float> %conv, ret <2 x float> %shift } @@ -110,6 +110,6 @@ ; CHECK: ret define <2 x double> @test10(<2 x i64> %in) { %conv = uitofp <2 x i64> %in to <2 x double> - %shift = fdiv <2 x double> %conv, + %shift = fdiv nexc nrnd <2 x double> %conv, ret <2 x double> %shift } Index: test/CodeGen/AArch64/floatdp_2source.ll =================================================================== --- test/CodeGen/AArch64/floatdp_2source.ll +++ test/CodeGen/AArch64/floatdp_2source.ll @@ -7,23 +7,23 @@ ; CHECK-LABEL: testfloat: %val1 = load float, float* @varfloat - %val2 = fadd float %val1, %val1 + %val2 = fadd nexc nrnd float %val1, %val1 ; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} - %val3 = fmul float %val2, %val1 + %val3 = fmul nexc nrnd float %val2, %val1 ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} - %val4 = fdiv float %val3, %val1 + %val4 = fdiv nexc nrnd float %val3, %val1 ; CHECK: fdiv {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} - %val5 = fsub float %val4, %val2 + %val5 = fsub nexc nrnd float %val4, %val2 ; CHECK: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} store volatile float %val5, float* @varfloat ; These will be enabled with the implementation of floating-point litpool entries. - %val6 = fmul float %val1, %val2 - %val7 = fsub float -0.0, %val6 + %val6 = fmul nexc nrnd float %val1, %val2 + %val7 = fsub nexc nrnd float -0.0, %val6 ; CHECK: fnmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} store volatile float %val7, float* @varfloat @@ -35,23 +35,23 @@ ; CHECK-LABEL: testdouble: %val1 = load double, double* @vardouble - %val2 = fadd double %val1, %val1 + %val2 = fadd nexc nrnd double %val1, %val1 ; CHECK: fadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} - %val3 = fmul double %val2, %val1 + %val3 = fmul nexc nrnd double %val2, %val1 ; CHECK: fmul {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} - %val4 = fdiv double %val3, %val1 + %val4 = fdiv nexc nrnd double %val3, %val1 ; CHECK: fdiv {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} - %val5 = fsub double %val4, %val2 + %val5 = fsub nexc nrnd double %val4, %val2 ; CHECK: fsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} store volatile double %val5, double* @vardouble ; These will be enabled with the implementation of doubleing-point litpool entries. - %val6 = fmul double %val1, %val2 - %val7 = fsub double -0.0, %val6 + %val6 = fmul nexc nrnd double %val1, %val2 + %val7 = fsub nexc nrnd double -0.0, %val6 ; CHECK: fnmul {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} store volatile double %val7, double* @vardouble Index: test/CodeGen/AArch64/fp-dp3.ll =================================================================== --- test/CodeGen/AArch64/fp-dp3.ll +++ test/CodeGen/AArch64/fp-dp3.ll @@ -16,7 +16,7 @@ define float @test_fmsub(float %a, float %b, float %c) { ; CHECK-LABEL: test_fmsub: ; CHECK-NOFAST-LABEL: test_fmsub: - %nega = fsub float -0.0, %a + %nega = fsub nexc nrnd float -0.0, %a %val = call float @llvm.fma.f32(float %nega, float %b, float %c) ; CHECK: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK-NOFAST: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} @@ -26,8 +26,8 @@ define float @test_fnmadd(float %a, float %b, float %c) { ; CHECK-LABEL: test_fnmadd: ; CHECK-NOFAST-LABEL: test_fnmadd: - %nega = fsub float -0.0, %a - %negc = fsub float -0.0, %c + %nega = fsub nexc nrnd float -0.0, %a + %negc = fsub nexc nrnd float -0.0, %c %val = call float @llvm.fma.f32(float %nega, float %b, float %negc) ; CHECK: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK-NOFAST: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} @@ -37,7 +37,7 @@ define float @test_fnmsub(float %a, float %b, float %c) { ; CHECK-LABEL: test_fnmsub: ; CHECK-NOFAST-LABEL: test_fnmsub: - %negc = fsub float -0.0, %c + %negc = fsub nexc nrnd float -0.0, %c %val = call float @llvm.fma.f32(float %a, float %b, float %negc) ; CHECK: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK-NOFAST: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} @@ -56,7 +56,7 @@ define double @testd_fmsub(double %a, double %b, double %c) { ; CHECK-LABEL: testd_fmsub: ; CHECK-NOFAST-LABEL: testd_fmsub: - %nega = fsub double -0.0, %a + %nega = fsub nexc nrnd double -0.0, %a %val = call double @llvm.fma.f64(double %nega, double %b, double %c) ; CHECK: fmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} ; CHECK-NOFAST: fmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} @@ -66,8 +66,8 @@ define double @testd_fnmadd(double %a, double %b, double %c) { ; CHECK-LABEL: testd_fnmadd: ; CHECK-NOFAST-LABEL: testd_fnmadd: - %nega = fsub double -0.0, %a - %negc = fsub double -0.0, %c + %nega = fsub nexc nrnd double -0.0, %a + %negc = fsub nexc nrnd double -0.0, %c %val = call double @llvm.fma.f64(double %nega, double %b, double %negc) ; CHECK: fnmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} ; CHECK-NOFAST: fnmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} @@ -77,7 +77,7 @@ define double @testd_fnmsub(double %a, double %b, double %c) { ; CHECK-LABEL: testd_fnmsub: ; CHECK-NOFAST-LABEL: testd_fnmsub: - %negc = fsub double -0.0, %c + %negc = fsub nexc nrnd double -0.0, %c %val = call double @llvm.fma.f64(double %a, double %b, double %negc) ; CHECK: fnmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} ; CHECK-NOFAST: fnmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} @@ -87,8 +87,8 @@ define float @test_fmadd_unfused(float %a, float %b, float %c) { ; CHECK-LABEL: test_fmadd_unfused: ; CHECK-NOFAST-LABEL: test_fmadd_unfused: - %prod = fmul float %b, %c - %sum = fadd float %a, %prod + %prod = fmul nexc nrnd float %b, %c + %sum = fadd nexc nrnd float %a, %prod ; CHECK: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK-NOFAST-NOT: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} @@ -99,8 +99,8 @@ define float @test_fmsub_unfused(float %a, float %b, float %c) { ; CHECK-LABEL: test_fmsub_unfused: ; CHECK-NOFAST-LABEL: test_fmsub_unfused: - %prod = fmul float %b, %c - %diff = fsub float %a, %prod + %prod = fmul nexc nrnd float %b, %c + %diff = fsub nexc nrnd float %a, %prod ; CHECK: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK-NOFAST-NOT: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} @@ -111,9 +111,9 @@ define float @test_fnmadd_unfused(float %a, float %b, float %c) { ; CHECK-LABEL: test_fnmadd_unfused: ; CHECK-NOFAST-LABEL: test_fnmadd_unfused: - %nega = fsub float -0.0, %a - %prod = fmul float %b, %c - %diff = fsub float %nega, %prod + %nega = fsub nexc nrnd float -0.0, %a + %prod = fmul nexc nrnd float %b, %c + %diff = fsub nexc nrnd float %nega, %prod ; CHECK: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK-NOFAST-NOT: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} @@ -125,9 +125,9 @@ define float @test_fnmsub_unfused(float %a, float %b, float %c) { ; CHECK-LABEL: test_fnmsub_unfused: ; CHECK-NOFAST-LABEL: test_fnmsub_unfused: - %nega = fsub float -0.0, %a - %prod = fmul float %b, %c - %sum = fadd float %nega, %prod + %nega = fsub nexc nrnd float -0.0, %a + %prod = fmul nexc nrnd float %b, %c + %sum = fadd nexc nrnd float %nega, %prod ; CHECK: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK-NOFAST-NOT: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} @@ -139,9 +139,9 @@ define float @test_fmadd_unfused_su(float %a, float %b, float %c) { ; CHECK-LABEL: test_fmadd_unfused_su: - %prod = fmul float %b, %c - %sum = fadd float %a, %prod - %res = fadd float %sum, %prod + %prod = fmul nexc nrnd float %b, %c + %sum = fadd nexc nrnd float %a, %prod + %res = fadd nexc nrnd float %sum, %prod ; CHECK-NOT: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} @@ -151,9 +151,9 @@ define float @test_fmsub_unfused_su(float %a, float %b, float %c) { ; CHECK-LABEL: test_fmsub_unfused_su: - %prod = fmul float %b, %c - %diff = fsub float %a, %prod - %res = fsub float %diff, %prod + %prod = fmul nexc nrnd float %b, %c + %diff = fsub nexc nrnd float %a, %prod + %res = fsub nexc nrnd float %diff, %prod ; CHECK-NOT: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} ; CHECK: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} Index: test/CodeGen/AArch64/neon-diagnostics.ll =================================================================== --- test/CodeGen/AArch64/neon-diagnostics.ll +++ test/CodeGen/AArch64/neon-diagnostics.ll @@ -6,8 +6,8 @@ ; CHECK: fadd {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s entry: %shuffle = shufflevector <2 x float> %v, <2 x float> undef, <2 x i32> - %mul = fmul <2 x float> %shuffle, %b - %add = fadd <2 x float> %mul, %a + %mul = fmul nexc nrnd <2 x float> %shuffle, %b + %add = fadd nexc nrnd <2 x float> %mul, %a ret <2 x float> %add } Index: test/CodeGen/AArch64/neon-fma.ll =================================================================== --- test/CodeGen/AArch64/neon-fma.ll +++ test/CodeGen/AArch64/neon-fma.ll @@ -2,44 +2,44 @@ define <2 x float> @fmla2xfloat(<2 x float> %A, <2 x float> %B, <2 x float> %C) { ;CHECK: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s - %tmp1 = fmul <2 x float> %A, %B; - %tmp2 = fadd <2 x float> %C, %tmp1; + %tmp1 = fmul nexc nrnd <2 x float> %A, %B; + %tmp2 = fadd nexc nrnd <2 x float> %C, %tmp1; ret <2 x float> %tmp2 } define <4 x float> @fmla4xfloat(<4 x float> %A, <4 x float> %B, <4 x float> %C) { ;CHECK: fmla {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s - %tmp1 = fmul <4 x float> %A, %B; - %tmp2 = fadd <4 x float> %C, %tmp1; + %tmp1 = fmul nexc nrnd <4 x float> %A, %B; + %tmp2 = fadd nexc nrnd <4 x float> %C, %tmp1; ret <4 x float> %tmp2 } define <2 x double> @fmla2xdouble(<2 x double> %A, <2 x double> %B, <2 x double> %C) { ;CHECK: fmla {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d - %tmp1 = fmul <2 x double> %A, %B; - %tmp2 = fadd <2 x double> %C, %tmp1; + %tmp1 = fmul nexc nrnd <2 x double> %A, %B; + %tmp2 = fadd nexc nrnd <2 x double> %C, %tmp1; ret <2 x double> %tmp2 } define <2 x float> @fmls2xfloat(<2 x float> %A, <2 x float> %B, <2 x float> %C) { ;CHECK: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s - %tmp1 = fmul <2 x float> %A, %B; - %tmp2 = fsub <2 x float> %C, %tmp1; + %tmp1 = fmul nexc nrnd <2 x float> %A, %B; + %tmp2 = fsub nexc nrnd <2 x float> %C, %tmp1; ret <2 x float> %tmp2 } define <4 x float> @fmls4xfloat(<4 x float> %A, <4 x float> %B, <4 x float> %C) { ;CHECK: fmls {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s - %tmp1 = fmul <4 x float> %A, %B; - %tmp2 = fsub <4 x float> %C, %tmp1; + %tmp1 = fmul nexc nrnd <4 x float> %A, %B; + %tmp2 = fsub nexc nrnd <4 x float> %C, %tmp1; ret <4 x float> %tmp2 } define <2 x double> @fmls2xdouble(<2 x double> %A, <2 x double> %B, <2 x double> %C) { ;CHECK: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d - %tmp1 = fmul <2 x double> %A, %B; - %tmp2 = fsub <2 x double> %C, %tmp1; + %tmp1 = fmul nexc nrnd <2 x double> %A, %B; + %tmp2 = fsub nexc nrnd <2 x double> %C, %tmp1; ret <2 x double> %tmp2 } @@ -70,21 +70,21 @@ define <2 x float> @fmls2xfloat_fused(<2 x float> %A, <2 x float> %B, <2 x float> %C) { ;CHECK: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s - %negA = fsub <2 x float> , %A + %negA = fsub nexc nrnd <2 x float> , %A %val = call <2 x float> @llvm.fma.v2f32(<2 x float> %negA, <2 x float> %B, <2 x float> %C) ret <2 x float> %val } define <4 x float> @fmls4xfloat_fused(<4 x float> %A, <4 x float> %B, <4 x float> %C) { ;CHECK: fmls {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s - %negA = fsub <4 x float> , %A + %negA = fsub nexc nrnd <4 x float> , %A %val = call <4 x float> @llvm.fma.v4f32(<4 x float> %negA, <4 x float> %B, <4 x float> %C) ret <4 x float> %val } define <2 x double> @fmls2xdouble_fused(<2 x double> %A, <2 x double> %B, <2 x double> %C) { ;CHECK: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d - %negA = fsub <2 x double> , %A + %negA = fsub nexc nrnd <2 x double> , %A %val = call <2 x double> @llvm.fma.v2f64(<2 x double> %negA, <2 x double> %B, <2 x double> %C) ret <2 x double> %val } @@ -116,17 +116,17 @@ define <2 x float> @fmla2xfloati_su(<2 x float> %A, <2 x float> %B, <2 x float> %C) { ;CHECK-NOT: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s - %tmp1 = fmul <2 x float> %A, %B; - %tmp2 = fadd <2 x float> %C, %tmp1; - %tmp3 = fadd <2 x float> %tmp2, %tmp1; + %tmp1 = fmul nexc nrnd <2 x float> %A, %B; + %tmp2 = fadd nexc nrnd <2 x float> %C, %tmp1; + %tmp3 = fadd nexc nrnd <2 x float> %tmp2, %tmp1; ret <2 x float> %tmp3 } define <2 x double> @fmls2xdouble_su(<2 x double> %A, <2 x double> %B, <2 x double> %C) { ;CHECK-NOT: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d - %tmp1 = fmul <2 x double> %A, %B; - %tmp2 = fsub <2 x double> %C, %tmp1; - %tmp3 = fsub <2 x double> %tmp2, %tmp1; + %tmp1 = fmul nexc nrnd <2 x double> %A, %B; + %tmp2 = fsub nexc nrnd <2 x double> %C, %tmp1; + %tmp3 = fsub nexc nrnd <2 x double> %tmp2, %tmp1; ret <2 x double> %tmp3 } Index: test/CodeGen/AArch64/vcvt-oversize.ll =================================================================== --- test/CodeGen/AArch64/vcvt-oversize.ll +++ test/CodeGen/AArch64/vcvt-oversize.ll @@ -10,7 +10,7 @@ ; CHECK-DAG: xtn2 v[[TMP]].8h, v[[MSB]].4s ; CHECK-DAG: xtn v0.8b, v[[TMP]].8h %l = load <8 x float>, <8 x float>* %in - %scale = fmul <8 x float> %l, + %scale = fmul nexc nrnd <8 x float> %l, %conv = fptoui <8 x float> %scale to <8 x i8> ret <8 x i8> %conv } Index: test/CodeGen/AMDGPU/big_alu.ll =================================================================== --- test/CodeGen/AMDGPU/big_alu.ll +++ test/CodeGen/AMDGPU/big_alu.ll @@ -101,9 +101,9 @@ %89 = insertelement <4 x float> %88, float 0.000000e+00, i32 3 %90 = call float @llvm.AMDGPU.dp4(<4 x float> %85, <4 x float> %89) %91 = call float @llvm.AMDGPU.rsq.f32(float %90) - %92 = fmul float %30, %91 - %93 = fmul float %31, %91 - %94 = fmul float %32, %91 + %92 = fmul nexc nrnd float %30, %91 + %93 = fmul nexc nrnd float %31, %91 + %94 = fmul nexc nrnd float %32, %91 %95 = insertelement <4 x float> undef, float %92, i32 0 %96 = insertelement <4 x float> %95, float %93, i32 1 %97 = insertelement <4 x float> %96, float %94, i32 2 @@ -122,9 +122,9 @@ %110 = insertelement <4 x float> %109, float %42, i32 2 %111 = insertelement <4 x float> %110, float 0.000000e+00, i32 3 %112 = call float @llvm.AMDGPU.dp4(<4 x float> %107, <4 x float> %111) - %113 = fsub float -0.000000e+00, %92 - %114 = fsub float -0.000000e+00, %93 - %115 = fsub float -0.000000e+00, %94 + %113 = fsub nexc nrnd float -0.000000e+00, %92 + %114 = fsub nexc nrnd float -0.000000e+00, %93 + %115 = fsub nexc nrnd float -0.000000e+00, %94 %116 = insertelement <4 x float> undef, float %34, i32 0 %117 = insertelement <4 x float> %116, float %35, i32 1 %118 = insertelement <4 x float> %117, float %36, i32 2 @@ -134,15 +134,15 @@ %122 = insertelement <4 x float> %121, float %115, i32 2 %123 = insertelement <4 x float> %122, float 0.000000e+00, i32 3 %124 = call float @llvm.AMDGPU.dp4(<4 x float> %119, <4 x float> %123) - %125 = fdiv float 1.000000e+00, %124 + %125 = fdiv nexc nrnd float 1.000000e+00, %124 %126 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 5) %127 = extractelement <4 x float> %126, i32 0 - %128 = fmul float %127, %125 - %129 = fmul float %103, %128 - %130 = fmul float %112, %128 + %128 = fmul nexc nrnd float %127, %125 + %129 = fmul nexc nrnd float %103, %128 + %130 = fmul nexc nrnd float %112, %128 %131 = bitcast float %. to i32 %132 = sitofp i32 %131 to float - %133 = fdiv float 1.000000e+00, %132 + %133 = fdiv nexc nrnd float 1.000000e+00, %132 %134 = bitcast float %. to i32 %135 = add i32 %134, -1 %136 = bitcast i32 %135 to float @@ -153,9 +153,9 @@ %temp68.1 = phi float [ %600, %ENDIF154 ], [ 0.000000e+00, %main_body ] %temp69.0 = phi float [ %602, %ENDIF154 ], [ 0.000000e+00, %main_body ] %temp70.0 = phi float [ %604, %ENDIF154 ], [ 1.000000e+00, %main_body ] - %138 = fmul float %26, 0x3F847AE140000000 - %139 = fmul float %27, 0x3F847AE140000000 - %140 = fmul float %28, 0x3F847AE140000000 + %138 = fmul nexc nrnd float %26, 0x3F847AE140000000 + %139 = fmul nexc nrnd float %27, 0x3F847AE140000000 + %140 = fmul nexc nrnd float %28, 0x3F847AE140000000 %141 = insertelement <4 x float> undef, float %138, i32 0 %142 = insertelement <4 x float> %141, float %139, i32 1 %143 = insertelement <4 x float> %142, float %140, i32 2 @@ -173,9 +173,9 @@ %155 = extractelement <4 x float> %153, i32 1 %156 = extractelement <4 x float> %153, i32 2 %157 = extractelement <4 x float> %153, i32 3 - %158 = fmul float %26, 0x3F45A07B40000000 - %159 = fmul float %27, 0x3F45A07B40000000 - %160 = fmul float %28, 0x3F45A07B40000000 + %158 = fmul nexc nrnd float %26, 0x3F45A07B40000000 + %159 = fmul nexc nrnd float %27, 0x3F45A07B40000000 + %160 = fmul nexc nrnd float %28, 0x3F45A07B40000000 %161 = insertelement <4 x float> undef, float %158, i32 0 %162 = insertelement <4 x float> %161, float %159, i32 1 %163 = insertelement <4 x float> %162, float %160, i32 2 @@ -193,57 +193,57 @@ %175 = extractelement <4 x float> %173, i32 1 %176 = extractelement <4 x float> %173, i32 2 %177 = extractelement <4 x float> %173, i32 3 - %178 = fmul float %176, 3.000000e+03 - %179 = fadd float %178, %28 - %180 = fdiv float 1.000000e+00, %33 - %181 = fmul float %32, %180 + %178 = fmul nexc nrnd float %176, 3.000000e+03 + %179 = fadd nexc nrnd float %178, %28 + %180 = fdiv nexc nrnd float 1.000000e+00, %33 + %181 = fmul nexc nrnd float %32, %180 %182 = call float @fabs(float %181) - %183 = fmul float %174, 0x3FD99999A0000000 - %184 = fadd float %183, 0x3FAEB851E0000000 - %185 = fmul float %175, 0x3FE3333340000000 - %186 = fadd float %185, %184 - %187 = fmul float %176, 2.000000e+00 - %188 = fadd float %187, %186 - %189 = fmul float %177, 4.000000e+00 - %190 = fadd float %189, %188 - %191 = fmul float %154, 0x3FB99999A0000000 - %192 = fadd float %191, %190 - %193 = fmul float %155, 0x3FD99999A0000000 - %194 = fadd float %193, %192 - %195 = fmul float %156, 0x3FE99999A0000000 - %196 = fadd float %195, %194 - %197 = fmul float %157, 0x4000CCCCC0000000 - %198 = fadd float %197, %196 - %199 = fmul float 0xBE5EFB4CC0000000, %182 - %200 = fmul float %199, %182 + %183 = fmul nexc nrnd float %174, 0x3FD99999A0000000 + %184 = fadd nexc nrnd float %183, 0x3FAEB851E0000000 + %185 = fmul nexc nrnd float %175, 0x3FE3333340000000 + %186 = fadd nexc nrnd float %185, %184 + %187 = fmul nexc nrnd float %176, 2.000000e+00 + %188 = fadd nexc nrnd float %187, %186 + %189 = fmul nexc nrnd float %177, 4.000000e+00 + %190 = fadd nexc nrnd float %189, %188 + %191 = fmul nexc nrnd float %154, 0x3FB99999A0000000 + %192 = fadd nexc nrnd float %191, %190 + %193 = fmul nexc nrnd float %155, 0x3FD99999A0000000 + %194 = fadd nexc nrnd float %193, %192 + %195 = fmul nexc nrnd float %156, 0x3FE99999A0000000 + %196 = fadd nexc nrnd float %195, %194 + %197 = fmul nexc nrnd float %157, 0x4000CCCCC0000000 + %198 = fadd nexc nrnd float %197, %196 + %199 = fmul nexc nrnd float 0xBE5EFB4CC0000000, %182 + %200 = fmul nexc nrnd float %199, %182 %201 = call float @llvm.AMDIL.exp.(float %200) %202 = call float @llvm.AMDGPU.lrp(float %201, float %198, float 0x3FA99999A0000000) - %203 = fadd float %202, 0x3FF4CCCCC0000000 - %204 = fmul float %203, 0x3FE1C71C80000000 + %203 = fadd nexc nrnd float %202, 0x3FF4CCCCC0000000 + %204 = fmul nexc nrnd float %203, 0x3FE1C71C80000000 %205 = call float @llvm.AMDIL.clamp.(float %204, float 0.000000e+00, float 1.000000e+00) - %206 = fadd float %202, 0x3FF4CCCCC0000000 - %207 = fmul float %206, 0x3FE1C71C80000000 + %206 = fadd nexc nrnd float %202, 0x3FF4CCCCC0000000 + %207 = fmul nexc nrnd float %206, 0x3FE1C71C80000000 %208 = call float @llvm.AMDIL.clamp.(float %207, float 0.000000e+00, float 1.000000e+00) - %209 = fadd float %202, 2.000000e+00 - %210 = fmul float %209, 0x3FD611A7A0000000 + %209 = fadd nexc nrnd float %202, 2.000000e+00 + %210 = fmul nexc nrnd float %209, 0x3FD611A7A0000000 %211 = call float @llvm.AMDIL.clamp.(float %210, float 0.000000e+00, float 1.000000e+00) - %212 = fmul float 2.000000e+00, %205 - %213 = fsub float -0.000000e+00, %212 - %214 = fadd float 3.000000e+00, %213 - %215 = fmul float %205, %214 - %216 = fmul float %205, %215 - %217 = fmul float 2.000000e+00, %208 - %218 = fsub float -0.000000e+00, %217 - %219 = fadd float 3.000000e+00, %218 - %220 = fmul float %208, %219 - %221 = fmul float %208, %220 - %222 = fmul float 2.000000e+00, %211 - %223 = fsub float -0.000000e+00, %222 - %224 = fadd float 3.000000e+00, %223 - %225 = fmul float %211, %224 - %226 = fmul float %211, %225 - %227 = fmul float %26, 0x3F368B5CC0000000 - %228 = fmul float %27, 0x3F368B5CC0000000 + %212 = fmul nexc nrnd float 2.000000e+00, %205 + %213 = fsub nexc nrnd float -0.000000e+00, %212 + %214 = fadd nexc nrnd float 3.000000e+00, %213 + %215 = fmul nexc nrnd float %205, %214 + %216 = fmul nexc nrnd float %205, %215 + %217 = fmul nexc nrnd float 2.000000e+00, %208 + %218 = fsub nexc nrnd float -0.000000e+00, %217 + %219 = fadd nexc nrnd float 3.000000e+00, %218 + %220 = fmul nexc nrnd float %208, %219 + %221 = fmul nexc nrnd float %208, %220 + %222 = fmul nexc nrnd float 2.000000e+00, %211 + %223 = fsub nexc nrnd float -0.000000e+00, %222 + %224 = fadd nexc nrnd float 3.000000e+00, %223 + %225 = fmul nexc nrnd float %211, %224 + %226 = fmul nexc nrnd float %211, %225 + %227 = fmul nexc nrnd float %26, 0x3F368B5CC0000000 + %228 = fmul nexc nrnd float %27, 0x3F368B5CC0000000 %229 = insertelement <4 x float> undef, float %227, i32 0 %230 = insertelement <4 x float> %229, float %228, i32 1 %231 = insertelement <4 x float> %230, float 0.000000e+00, i32 2 @@ -270,36 +270,36 @@ %252 = extractelement <4 x float> %250, i32 1 %253 = extractelement <4 x float> %250, i32 2 %254 = extractelement <4 x float> %250, i32 3 - %255 = fmul float %251, %216 - %256 = fmul float %252, %221 - %257 = fmul float %253, %226 - %258 = fmul float %254, 0.000000e+00 - %259 = fadd float %202, 0x3FF4CCCCC0000000 - %260 = fmul float %259, 0x3FE1C71C80000000 + %255 = fmul nexc nrnd float %251, %216 + %256 = fmul nexc nrnd float %252, %221 + %257 = fmul nexc nrnd float %253, %226 + %258 = fmul nexc nrnd float %254, 0.000000e+00 + %259 = fadd nexc nrnd float %202, 0x3FF4CCCCC0000000 + %260 = fmul nexc nrnd float %259, 0x3FE1C71C80000000 %261 = call float @llvm.AMDIL.clamp.(float %260, float 0.000000e+00, float 1.000000e+00) - %262 = fadd float %202, 0x3FF4CCCCC0000000 - %263 = fmul float %262, 0x3FE1C71C80000000 + %262 = fadd nexc nrnd float %202, 0x3FF4CCCCC0000000 + %263 = fmul nexc nrnd float %262, 0x3FE1C71C80000000 %264 = call float @llvm.AMDIL.clamp.(float %263, float 0.000000e+00, float 1.000000e+00) - %265 = fadd float %202, 2.000000e+00 - %266 = fmul float %265, 0x3FD611A7A0000000 + %265 = fadd nexc nrnd float %202, 2.000000e+00 + %266 = fmul nexc nrnd float %265, 0x3FD611A7A0000000 %267 = call float @llvm.AMDIL.clamp.(float %266, float 0.000000e+00, float 1.000000e+00) - %268 = fmul float 2.000000e+00, %261 - %269 = fsub float -0.000000e+00, %268 - %270 = fadd float 3.000000e+00, %269 - %271 = fmul float %261, %270 - %272 = fmul float %261, %271 - %273 = fmul float 2.000000e+00, %264 - %274 = fsub float -0.000000e+00, %273 - %275 = fadd float 3.000000e+00, %274 - %276 = fmul float %264, %275 - %277 = fmul float %264, %276 - %278 = fmul float 2.000000e+00, %267 - %279 = fsub float -0.000000e+00, %278 - %280 = fadd float 3.000000e+00, %279 - %281 = fmul float %267, %280 - %282 = fmul float %267, %281 - %283 = fmul float %26, 0x3F22DFD6A0000000 - %284 = fmul float %27, 0x3F22DFD6A0000000 + %268 = fmul nexc nrnd float 2.000000e+00, %261 + %269 = fsub nexc nrnd float -0.000000e+00, %268 + %270 = fadd nexc nrnd float 3.000000e+00, %269 + %271 = fmul nexc nrnd float %261, %270 + %272 = fmul nexc nrnd float %261, %271 + %273 = fmul nexc nrnd float 2.000000e+00, %264 + %274 = fsub nexc nrnd float -0.000000e+00, %273 + %275 = fadd nexc nrnd float 3.000000e+00, %274 + %276 = fmul nexc nrnd float %264, %275 + %277 = fmul nexc nrnd float %264, %276 + %278 = fmul nexc nrnd float 2.000000e+00, %267 + %279 = fsub nexc nrnd float -0.000000e+00, %278 + %280 = fadd nexc nrnd float 3.000000e+00, %279 + %281 = fmul nexc nrnd float %267, %280 + %282 = fmul nexc nrnd float %267, %281 + %283 = fmul nexc nrnd float %26, 0x3F22DFD6A0000000 + %284 = fmul nexc nrnd float %27, 0x3F22DFD6A0000000 %285 = insertelement <4 x float> undef, float %283, i32 0 %286 = insertelement <4 x float> %285, float %284, i32 1 %287 = insertelement <4 x float> %286, float 0.000000e+00, i32 2 @@ -315,25 +315,25 @@ %297 = extractelement <4 x float> %295, i32 1 %298 = extractelement <4 x float> %295, i32 2 %299 = extractelement <4 x float> %295, i32 3 - %300 = fmul float %296, %272 - %301 = fmul float %297, %277 - %302 = fmul float %298, %282 - %303 = fmul float %299, 0.000000e+00 - %304 = fmul float %temp68.1, %37 - %305 = fmul float %temp68.1, %38 - %306 = fmul float %temp68.1, %39 - %307 = fmul float %temp69.0, %40 - %308 = fadd float %307, %304 - %309 = fmul float %temp69.0, %41 - %310 = fadd float %309, %305 - %311 = fmul float %temp69.0, %42 - %312 = fadd float %311, %306 - %313 = fmul float %temp70.0, %34 - %314 = fadd float %313, %308 - %315 = fmul float %temp70.0, %35 - %316 = fadd float %315, %310 - %317 = fmul float %temp70.0, %36 - %318 = fadd float %317, %312 + %300 = fmul nexc nrnd float %296, %272 + %301 = fmul nexc nrnd float %297, %277 + %302 = fmul nexc nrnd float %298, %282 + %303 = fmul nexc nrnd float %299, 0.000000e+00 + %304 = fmul nexc nrnd float %temp68.1, %37 + %305 = fmul nexc nrnd float %temp68.1, %38 + %306 = fmul nexc nrnd float %temp68.1, %39 + %307 = fmul nexc nrnd float %temp69.0, %40 + %308 = fadd nexc nrnd float %307, %304 + %309 = fmul nexc nrnd float %temp69.0, %41 + %310 = fadd nexc nrnd float %309, %305 + %311 = fmul nexc nrnd float %temp69.0, %42 + %312 = fadd nexc nrnd float %311, %306 + %313 = fmul nexc nrnd float %temp70.0, %34 + %314 = fadd nexc nrnd float %313, %308 + %315 = fmul nexc nrnd float %temp70.0, %35 + %316 = fadd nexc nrnd float %315, %310 + %317 = fmul nexc nrnd float %temp70.0, %36 + %318 = fadd nexc nrnd float %317, %312 %319 = insertelement <4 x float> undef, float %314, i32 0 %320 = insertelement <4 x float> %319, float %316, i32 1 %321 = insertelement <4 x float> %320, float %318, i32 2 @@ -344,29 +344,29 @@ %326 = insertelement <4 x float> %325, float 0.000000e+00, i32 3 %327 = call float @llvm.AMDGPU.dp4(<4 x float> %322, <4 x float> %326) %328 = call float @llvm.AMDGPU.rsq.f32(float %327) - %329 = fmul float %314, %328 - %330 = fmul float %316, %328 - %331 = fmul float %318, %328 + %329 = fmul nexc nrnd float %314, %328 + %330 = fmul nexc nrnd float %316, %328 + %331 = fmul nexc nrnd float %318, %328 %332 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 6) %333 = extractelement <4 x float> %332, i32 0 - %334 = fsub float -0.000000e+00, %333 - %335 = fadd float 1.000000e+00, %334 + %334 = fsub nexc nrnd float -0.000000e+00, %333 + %335 = fadd nexc nrnd float 1.000000e+00, %334 %336 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 7) %337 = extractelement <4 x float> %336, i32 0 - %338 = fsub float -0.000000e+00, %337 - %339 = fadd float 1.000000e+00, %338 + %338 = fsub nexc nrnd float -0.000000e+00, %337 + %339 = fadd nexc nrnd float 1.000000e+00, %338 %340 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 8) %341 = extractelement <4 x float> %340, i32 0 - %342 = fsub float -0.000000e+00, %341 - %343 = fadd float 1.000000e+00, %342 - %344 = fsub float -0.000000e+00, %335 - %345 = fadd float %202, %344 - %346 = fsub float -0.000000e+00, %339 - %347 = fadd float %202, %346 - %348 = fadd float %347, 0xBFE3333340000000 - %349 = fsub float -0.000000e+00, %202 - %350 = fsub float -0.000000e+00, %343 - %351 = fadd float %349, %350 + %342 = fsub nexc nrnd float -0.000000e+00, %341 + %343 = fadd nexc nrnd float 1.000000e+00, %342 + %344 = fsub nexc nrnd float -0.000000e+00, %335 + %345 = fadd nexc nrnd float %202, %344 + %346 = fsub nexc nrnd float -0.000000e+00, %339 + %347 = fadd nexc nrnd float %202, %346 + %348 = fadd nexc nrnd float %347, 0xBFE3333340000000 + %349 = fsub nexc nrnd float -0.000000e+00, %202 + %350 = fsub nexc nrnd float -0.000000e+00, %343 + %351 = fadd nexc nrnd float %349, %350 %352 = insertelement <4 x float> undef, float %43, i32 0 %353 = insertelement <4 x float> %352, float %44, i32 1 %354 = insertelement <4 x float> %353, float %45, i32 2 @@ -377,22 +377,22 @@ %359 = insertelement <4 x float> %358, float 0.000000e+00, i32 3 %360 = call float @llvm.AMDGPU.dp4(<4 x float> %355, <4 x float> %359) %361 = call float @llvm.AMDGPU.rsq.f32(float %360) - %362 = fmul float %45, %361 + %362 = fmul nexc nrnd float %45, %361 %363 = call float @fabs(float %362) - %364 = fmul float %176, 0x3FECCCCCC0000000 - %365 = fadd float %364, %363 - %366 = fadd float %365, 0xBFEFAE1480000000 - %367 = fmul float %366, 0xC023FFFFC0000000 + %364 = fmul nexc nrnd float %176, 0x3FECCCCCC0000000 + %365 = fadd nexc nrnd float %364, %363 + %366 = fadd nexc nrnd float %365, 0xBFEFAE1480000000 + %367 = fmul nexc nrnd float %366, 0xC023FFFFC0000000 %368 = call float @llvm.AMDIL.clamp.(float %367, float 0.000000e+00, float 1.000000e+00) - %369 = fsub float -0.000000e+00, %335 - %370 = fadd float %202, %369 - %371 = fadd float %370, 0x3FBEB851E0000000 - %372 = fsub float -0.000000e+00, %339 - %373 = fadd float %202, %372 - %374 = fadd float %373, 0xBFE0A3D700000000 - %375 = fsub float -0.000000e+00, %202 - %376 = fsub float -0.000000e+00, %343 - %377 = fadd float %375, %376 + %369 = fsub nexc nrnd float -0.000000e+00, %335 + %370 = fadd nexc nrnd float %202, %369 + %371 = fadd nexc nrnd float %370, 0x3FBEB851E0000000 + %372 = fsub nexc nrnd float -0.000000e+00, %339 + %373 = fadd nexc nrnd float %202, %372 + %374 = fadd nexc nrnd float %373, 0xBFE0A3D700000000 + %375 = fsub nexc nrnd float -0.000000e+00, %202 + %376 = fsub nexc nrnd float -0.000000e+00, %343 + %377 = fadd nexc nrnd float %375, %376 %378 = insertelement <4 x float> undef, float %43, i32 0 %379 = insertelement <4 x float> %378, float %44, i32 1 %380 = insertelement <4 x float> %379, float %45, i32 2 @@ -403,27 +403,27 @@ %385 = insertelement <4 x float> %384, float 0.000000e+00, i32 3 %386 = call float @llvm.AMDGPU.dp4(<4 x float> %381, <4 x float> %385) %387 = call float @llvm.AMDGPU.rsq.f32(float %386) - %388 = fmul float %45, %387 + %388 = fmul nexc nrnd float %45, %387 %389 = call float @fabs(float %388) - %390 = fmul float %176, 0x3FF51EB860000000 - %391 = fadd float %390, %389 - %392 = fadd float %391, 0xBFEFAE1480000000 - %393 = fmul float %392, 0xC0490001A0000000 + %390 = fmul nexc nrnd float %176, 0x3FF51EB860000000 + %391 = fadd nexc nrnd float %390, %389 + %392 = fadd nexc nrnd float %391, 0xBFEFAE1480000000 + %393 = fmul nexc nrnd float %392, 0xC0490001A0000000 %394 = call float @llvm.AMDIL.clamp.(float %393, float 0.000000e+00, float 1.000000e+00) - %395 = fmul float 2.000000e+00, %368 - %396 = fsub float -0.000000e+00, %395 - %397 = fadd float 3.000000e+00, %396 - %398 = fmul float %368, %397 - %399 = fmul float %368, %398 + %395 = fmul nexc nrnd float 2.000000e+00, %368 + %396 = fsub nexc nrnd float -0.000000e+00, %395 + %397 = fadd nexc nrnd float 3.000000e+00, %396 + %398 = fmul nexc nrnd float %368, %397 + %399 = fmul nexc nrnd float %368, %398 %400 = call float @llvm.AMDGPU.lrp(float %399, float %255, float %345) %401 = call float @llvm.AMDGPU.lrp(float %399, float %256, float %348) %402 = call float @llvm.AMDGPU.lrp(float %399, float %257, float %351) %403 = call float @llvm.AMDGPU.lrp(float %399, float %258, float 0.000000e+00) - %404 = fmul float 2.000000e+00, %394 - %405 = fsub float -0.000000e+00, %404 - %406 = fadd float 3.000000e+00, %405 - %407 = fmul float %394, %406 - %408 = fmul float %394, %407 + %404 = fmul nexc nrnd float 2.000000e+00, %394 + %405 = fsub nexc nrnd float -0.000000e+00, %404 + %406 = fadd nexc nrnd float 3.000000e+00, %405 + %407 = fmul nexc nrnd float %394, %406 + %408 = fmul nexc nrnd float %394, %407 %409 = call float @llvm.AMDGPU.lrp(float %408, float %255, float %371) %410 = call float @llvm.AMDGPU.lrp(float %408, float %256, float %374) %411 = call float @llvm.AMDGPU.lrp(float %408, float %257, float %377) @@ -448,11 +448,11 @@ br i1 %423, label %IF140, label %ENDIF139 IF140: ; preds = %LOOP - %424 = fmul float %133, 5.000000e-01 - %425 = fmul float %129, %temp92.0 - %426 = fadd float %425, %22 - %427 = fmul float %130, %temp92.0 - %428 = fadd float %427, %23 + %424 = fmul nexc nrnd float %133, 5.000000e-01 + %425 = fmul nexc nrnd float %129, %temp92.0 + %426 = fadd nexc nrnd float %425, %22 + %427 = fmul nexc nrnd float %130, %temp92.0 + %428 = fadd nexc nrnd float %427, %23 %429 = insertelement <4 x float> undef, float %426, i32 0 %430 = insertelement <4 x float> %429, float %428, i32 1 %431 = insertelement <4 x float> %430, float 0.000000e+00, i32 2 @@ -473,11 +473,11 @@ br i1 %445, label %IF146, label %ENDIF145 ENDIF139: ; preds = %LOOP - %446 = fadd float %temp88.0, %133 - %447 = fmul float %129, %446 - %448 = fadd float %447, %22 - %449 = fmul float %130, %446 - %450 = fadd float %449, %23 + %446 = fadd nexc nrnd float %temp88.0, %133 + %447 = fmul nexc nrnd float %129, %446 + %448 = fadd nexc nrnd float %447, %22 + %449 = fmul nexc nrnd float %130, %446 + %450 = fadd nexc nrnd float %449, %23 %451 = insertelement <4 x float> undef, float %448, i32 0 %452 = insertelement <4 x float> %451, float %450, i32 1 %453 = insertelement <4 x float> %452, float 0.000000e+00, i32 2 @@ -509,19 +509,19 @@ br label %LOOP IF146: ; preds = %IF140 - %478 = fmul float 2.000000e+00, %424 - %479 = fsub float -0.000000e+00, %478 - %480 = fadd float %temp92.0, %479 + %478 = fmul nexc nrnd float 2.000000e+00, %424 + %479 = fsub nexc nrnd float -0.000000e+00, %478 + %480 = fadd nexc nrnd float %temp92.0, %479 br label %ENDIF145 ENDIF145: ; preds = %IF140, %IF146 %temp88.1 = phi float [ %480, %IF146 ], [ %temp92.0, %IF140 ] - %481 = fadd float %temp88.1, %424 - %482 = fmul float %424, 5.000000e-01 - %483 = fmul float %129, %481 - %484 = fadd float %483, %22 - %485 = fmul float %130, %481 - %486 = fadd float %485, %23 + %481 = fadd nexc nrnd float %temp88.1, %424 + %482 = fmul nexc nrnd float %424, 5.000000e-01 + %483 = fmul nexc nrnd float %129, %481 + %484 = fadd nexc nrnd float %483, %22 + %485 = fmul nexc nrnd float %130, %481 + %486 = fadd nexc nrnd float %485, %23 %487 = insertelement <4 x float> undef, float %484, i32 0 %488 = insertelement <4 x float> %487, float %486, i32 1 %489 = insertelement <4 x float> %488, float 0.000000e+00, i32 2 @@ -542,20 +542,20 @@ br i1 %503, label %IF149, label %ENDIF148 IF149: ; preds = %ENDIF145 - %504 = fmul float 2.000000e+00, %482 - %505 = fsub float -0.000000e+00, %504 - %506 = fadd float %481, %505 + %504 = fmul nexc nrnd float 2.000000e+00, %482 + %505 = fsub nexc nrnd float -0.000000e+00, %504 + %506 = fadd nexc nrnd float %481, %505 br label %ENDIF148 ENDIF148: ; preds = %ENDIF145, %IF149 %temp88.2 = phi float [ %506, %IF149 ], [ %481, %ENDIF145 ] %temp92.2 = phi float [ %481, %IF149 ], [ %temp92.0, %ENDIF145 ] - %507 = fadd float %temp88.2, %482 - %508 = fmul float %482, 5.000000e-01 - %509 = fmul float %129, %507 - %510 = fadd float %509, %22 - %511 = fmul float %130, %507 - %512 = fadd float %511, %23 + %507 = fadd nexc nrnd float %temp88.2, %482 + %508 = fmul nexc nrnd float %482, 5.000000e-01 + %509 = fmul nexc nrnd float %129, %507 + %510 = fadd nexc nrnd float %509, %22 + %511 = fmul nexc nrnd float %130, %507 + %512 = fadd nexc nrnd float %511, %23 %513 = insertelement <4 x float> undef, float %510, i32 0 %514 = insertelement <4 x float> %513, float %512, i32 1 %515 = insertelement <4 x float> %514, float 0.000000e+00, i32 2 @@ -576,20 +576,20 @@ br i1 %529, label %IF152, label %ENDIF151 IF152: ; preds = %ENDIF148 - %530 = fmul float 2.000000e+00, %508 - %531 = fsub float -0.000000e+00, %530 - %532 = fadd float %507, %531 + %530 = fmul nexc nrnd float 2.000000e+00, %508 + %531 = fsub nexc nrnd float -0.000000e+00, %530 + %532 = fadd nexc nrnd float %507, %531 br label %ENDIF151 ENDIF151: ; preds = %ENDIF148, %IF152 %temp88.3 = phi float [ %532, %IF152 ], [ %507, %ENDIF148 ] %temp92.3 = phi float [ %507, %IF152 ], [ %temp92.2, %ENDIF148 ] - %533 = fadd float %temp88.3, %508 - %534 = fmul float %508, 5.000000e-01 - %535 = fmul float %129, %533 - %536 = fadd float %535, %22 - %537 = fmul float %130, %533 - %538 = fadd float %537, %23 + %533 = fadd nexc nrnd float %temp88.3, %508 + %534 = fmul nexc nrnd float %508, 5.000000e-01 + %535 = fmul nexc nrnd float %129, %533 + %536 = fadd nexc nrnd float %535, %22 + %537 = fmul nexc nrnd float %130, %533 + %538 = fadd nexc nrnd float %537, %23 %539 = insertelement <4 x float> undef, float %536, i32 0 %540 = insertelement <4 x float> %539, float %538, i32 1 %541 = insertelement <4 x float> %540, float 0.000000e+00, i32 2 @@ -610,19 +610,19 @@ br i1 %555, label %IF155, label %ENDIF154 IF155: ; preds = %ENDIF151 - %556 = fmul float 2.000000e+00, %534 - %557 = fsub float -0.000000e+00, %556 - %558 = fadd float %533, %557 + %556 = fmul nexc nrnd float 2.000000e+00, %534 + %557 = fsub nexc nrnd float -0.000000e+00, %556 + %558 = fadd nexc nrnd float %533, %557 br label %ENDIF154 ENDIF154: ; preds = %ENDIF151, %IF155 %temp88.4 = phi float [ %558, %IF155 ], [ %533, %ENDIF151 ] %temp92.4 = phi float [ %533, %IF155 ], [ %temp92.3, %ENDIF151 ] - %559 = fadd float %temp88.4, %534 - %560 = fmul float %129, %559 - %561 = fadd float %560, %22 - %562 = fmul float %130, %559 - %563 = fadd float %562, %23 + %559 = fadd nexc nrnd float %temp88.4, %534 + %560 = fmul nexc nrnd float %129, %559 + %561 = fadd nexc nrnd float %560, %22 + %562 = fmul nexc nrnd float %130, %559 + %563 = fadd nexc nrnd float %562, %23 %564 = insertelement <4 x float> undef, float %561, i32 0 %565 = insertelement <4 x float> %564, float %563, i32 1 %566 = insertelement <4 x float> %565, float 0.000000e+00, i32 2 @@ -641,10 +641,10 @@ %579 = bitcast float %578 to i32 %580 = icmp ne i32 %579, 0 %.temp92.4 = select i1 %580, float %559, float %temp92.4 - %581 = fmul float %129, %.temp92.4 - %582 = fadd float %581, %22 - %583 = fmul float %130, %.temp92.4 - %584 = fadd float %583, %23 + %581 = fmul nexc nrnd float %129, %.temp92.4 + %582 = fadd nexc nrnd float %581, %22 + %583 = fmul nexc nrnd float %130, %.temp92.4 + %584 = fadd nexc nrnd float %583, %23 %585 = insertelement <4 x float> undef, float %582, i32 0 %586 = insertelement <4 x float> %585, float %584, i32 1 %587 = insertelement <4 x float> %586, float 0.000000e+00, i32 2 @@ -659,16 +659,16 @@ %596 = extractelement <4 x float> %595, i32 0 %597 = extractelement <4 x float> %595, i32 1 %598 = extractelement <4 x float> %595, i32 2 - %599 = fmul float %596, 2.000000e+00 - %600 = fadd float %599, -1.000000e+00 - %601 = fmul float %597, 2.000000e+00 - %602 = fadd float %601, -1.000000e+00 - %603 = fmul float %598, 2.000000e+00 - %604 = fadd float %603, -1.000000e+00 + %599 = fmul nexc nrnd float %596, 2.000000e+00 + %600 = fadd nexc nrnd float %599, -1.000000e+00 + %601 = fmul nexc nrnd float %597, 2.000000e+00 + %602 = fadd nexc nrnd float %601, -1.000000e+00 + %603 = fmul nexc nrnd float %598, 2.000000e+00 + %604 = fadd nexc nrnd float %603, -1.000000e+00 br label %ENDIF136 IF161: ; preds = %ENDIF136 - %605 = fmul float %202, 0x3FB99999A0000000 + %605 = fmul nexc nrnd float %202, 0x3FB99999A0000000 %606 = fcmp uge float 0x3FE4CCCCC0000000, %605 %607 = select i1 %606, float 0x3FE4CCCCC0000000, float %605 %608 = fcmp uge float %607, 5.000000e-01 @@ -688,9 +688,9 @@ %622 = call float @llvm.AMDGPU.dp4(<4 x float> %617, <4 x float> %621) %623 = fcmp uge float 0x3FE6666660000000, %622 %624 = select i1 %623, float 0x3FE6666660000000, float %622 - %625 = fmul float %8, %624 - %626 = fmul float %13, %624 - %627 = fmul float %18, %624 + %625 = fmul nexc nrnd float %8, %624 + %626 = fmul nexc nrnd float %13, %624 + %627 = fmul nexc nrnd float %18, %624 %628 = insertelement <4 x float> undef, float %34, i32 0 %629 = insertelement <4 x float> %628, float %35, i32 1 %630 = insertelement <4 x float> %629, float %36, i32 2 @@ -702,9 +702,9 @@ %636 = call float @llvm.AMDGPU.dp4(<4 x float> %631, <4 x float> %635) %637 = fcmp uge float 0x3FECCCCCC0000000, %636 %638 = select i1 %637, float 0x3FECCCCCC0000000, float %636 - %639 = fmul float %625, %638 - %640 = fmul float %626, %638 - %641 = fmul float %627, %638 + %639 = fmul nexc nrnd float %625, %638 + %640 = fmul nexc nrnd float %626, %638 + %641 = fmul nexc nrnd float %627, %638 br label %ENDIF160 ENDIF160: ; preds = %ENDIF136, %IF161 @@ -730,7 +730,7 @@ br i1 %653, label %IF164, label %ENDIF163 IF164: ; preds = %ENDIF160 - %654 = fmul float %202, 5.000000e-01 + %654 = fmul nexc nrnd float %202, 5.000000e-01 %655 = fcmp uge float 0x3FE4CCCCC0000000, %654 %656 = select i1 %655, float 0x3FE4CCCCC0000000, float %654 %657 = fcmp uge float %656, 0x3FD6666660000000 @@ -750,9 +750,9 @@ %671 = call float @llvm.AMDGPU.dp4(<4 x float> %666, <4 x float> %670) %672 = fcmp uge float 0x3FE6666660000000, %671 %673 = select i1 %672, float 0x3FE6666660000000, float %671 - %674 = fmul float %8, %673 - %675 = fmul float %13, %673 - %676 = fmul float %18, %673 + %674 = fmul nexc nrnd float %8, %673 + %675 = fmul nexc nrnd float %13, %673 + %676 = fmul nexc nrnd float %18, %673 %677 = insertelement <4 x float> undef, float %34, i32 0 %678 = insertelement <4 x float> %677, float %35, i32 1 %679 = insertelement <4 x float> %678, float %36, i32 2 @@ -764,9 +764,9 @@ %685 = call float @llvm.AMDGPU.dp4(<4 x float> %680, <4 x float> %684) %686 = fcmp uge float 0x3FECCCCCC0000000, %685 %687 = select i1 %686, float 0x3FECCCCCC0000000, float %685 - %688 = fmul float %674, %687 - %689 = fmul float %675, %687 - %690 = fmul float %676, %687 + %688 = fmul nexc nrnd float %674, %687 + %689 = fmul nexc nrnd float %675, %687 + %690 = fmul nexc nrnd float %676, %687 br label %ENDIF163 ENDIF163: ; preds = %ENDIF160, %IF164 @@ -792,7 +792,7 @@ br i1 %702, label %IF167, label %ENDIF166 IF167: ; preds = %ENDIF163 - %703 = fmul float %202, 5.000000e-01 + %703 = fmul nexc nrnd float %202, 5.000000e-01 %704 = fcmp uge float 0x3FE4CCCCC0000000, %703 %705 = select i1 %704, float 0x3FE4CCCCC0000000, float %703 %706 = fcmp uge float %705, 0x3FD3333340000000 @@ -812,9 +812,9 @@ %720 = call float @llvm.AMDGPU.dp4(<4 x float> %715, <4 x float> %719) %721 = fcmp uge float 0x3FEB333340000000, %720 %722 = select i1 %721, float 0x3FEB333340000000, float %720 - %723 = fmul float %8, %722 - %724 = fmul float %13, %722 - %725 = fmul float %18, %722 + %723 = fmul nexc nrnd float %8, %722 + %724 = fmul nexc nrnd float %13, %722 + %725 = fmul nexc nrnd float %18, %722 %726 = insertelement <4 x float> undef, float %34, i32 0 %727 = insertelement <4 x float> %726, float %35, i32 1 %728 = insertelement <4 x float> %727, float %36, i32 2 @@ -826,9 +826,9 @@ %734 = call float @llvm.AMDGPU.dp4(<4 x float> %729, <4 x float> %733) %735 = fcmp uge float 0x3FECCCCCC0000000, %734 %736 = select i1 %735, float 0x3FECCCCCC0000000, float %734 - %737 = fmul float %723, %736 - %738 = fmul float %724, %736 - %739 = fmul float %725, %736 + %737 = fmul nexc nrnd float %723, %736 + %738 = fmul nexc nrnd float %724, %736 + %739 = fmul nexc nrnd float %725, %736 br label %ENDIF166 ENDIF166: ; preds = %ENDIF163, %IF167 @@ -854,7 +854,7 @@ br i1 %751, label %IF170, label %ENDIF169 IF170: ; preds = %ENDIF166 - %752 = fmul float %202, 5.000000e-01 + %752 = fmul nexc nrnd float %202, 5.000000e-01 %753 = fcmp uge float 0x3FE4CCCCC0000000, %752 %754 = select i1 %753, float 0x3FE4CCCCC0000000, float %752 %755 = fcmp uge float %754, 0x3FC99999A0000000 @@ -874,9 +874,9 @@ %769 = call float @llvm.AMDGPU.dp4(<4 x float> %764, <4 x float> %768) %770 = fcmp uge float 0x3FEB333340000000, %769 %771 = select i1 %770, float 0x3FEB333340000000, float %769 - %772 = fmul float %8, %771 - %773 = fmul float %13, %771 - %774 = fmul float %18, %771 + %772 = fmul nexc nrnd float %8, %771 + %773 = fmul nexc nrnd float %13, %771 + %774 = fmul nexc nrnd float %18, %771 %775 = insertelement <4 x float> undef, float %34, i32 0 %776 = insertelement <4 x float> %775, float %35, i32 1 %777 = insertelement <4 x float> %776, float %36, i32 2 @@ -888,9 +888,9 @@ %783 = call float @llvm.AMDGPU.dp4(<4 x float> %778, <4 x float> %782) %784 = fcmp uge float 0x3FECCCCCC0000000, %783 %785 = select i1 %784, float 0x3FECCCCCC0000000, float %783 - %786 = fmul float %772, %785 - %787 = fmul float %773, %785 - %788 = fmul float %774, %785 + %786 = fmul nexc nrnd float %772, %785 + %787 = fmul nexc nrnd float %773, %785 + %788 = fmul nexc nrnd float %774, %785 br label %ENDIF169 ENDIF169: ; preds = %ENDIF166, %IF170 @@ -916,7 +916,7 @@ br i1 %800, label %IF173, label %ENDIF172 IF173: ; preds = %ENDIF169 - %801 = fmul float %202, 5.000000e-01 + %801 = fmul nexc nrnd float %202, 5.000000e-01 %802 = fcmp uge float 0x3FE4CCCCC0000000, %801 %803 = select i1 %802, float 0x3FE4CCCCC0000000, float %801 %804 = fcmp uge float %803, 0x3FB99999A0000000 @@ -936,9 +936,9 @@ %818 = call float @llvm.AMDGPU.dp4(<4 x float> %813, <4 x float> %817) %819 = fcmp uge float 0x3FEB333340000000, %818 %820 = select i1 %819, float 0x3FEB333340000000, float %818 - %821 = fmul float %8, %820 - %822 = fmul float %13, %820 - %823 = fmul float %18, %820 + %821 = fmul nexc nrnd float %8, %820 + %822 = fmul nexc nrnd float %13, %820 + %823 = fmul nexc nrnd float %18, %820 %824 = insertelement <4 x float> undef, float %34, i32 0 %825 = insertelement <4 x float> %824, float %35, i32 1 %826 = insertelement <4 x float> %825, float %36, i32 2 @@ -950,9 +950,9 @@ %832 = call float @llvm.AMDGPU.dp4(<4 x float> %827, <4 x float> %831) %833 = fcmp uge float 0x3FECCCCCC0000000, %832 %834 = select i1 %833, float 0x3FECCCCCC0000000, float %832 - %835 = fmul float %821, %834 - %836 = fmul float %822, %834 - %837 = fmul float %823, %834 + %835 = fmul nexc nrnd float %821, %834 + %836 = fmul nexc nrnd float %822, %834 + %837 = fmul nexc nrnd float %823, %834 br label %ENDIF172 ENDIF172: ; preds = %ENDIF169, %IF173 @@ -971,7 +971,7 @@ br i1 %842, label %IF176, label %ENDIF175 IF176: ; preds = %ENDIF172 - %843 = fmul float %202, 0x3FB99999A0000000 + %843 = fmul nexc nrnd float %202, 0x3FB99999A0000000 %844 = fcmp uge float 0.000000e+00, %843 %845 = select i1 %844, float 0.000000e+00, float %843 %846 = fcmp uge float %845, 0x3FD99999A0000000 @@ -991,9 +991,9 @@ %860 = call float @llvm.AMDGPU.dp4(<4 x float> %855, <4 x float> %859) %861 = fcmp uge float 0x3FEB333340000000, %860 %862 = select i1 %861, float 0x3FEB333340000000, float %860 - %863 = fmul float %8, %862 - %864 = fmul float %13, %862 - %865 = fmul float %18, %862 + %863 = fmul nexc nrnd float %8, %862 + %864 = fmul nexc nrnd float %13, %862 + %865 = fmul nexc nrnd float %18, %862 %866 = insertelement <4 x float> undef, float %34, i32 0 %867 = insertelement <4 x float> %866, float %35, i32 1 %868 = insertelement <4 x float> %867, float %36, i32 2 @@ -1005,9 +1005,9 @@ %874 = call float @llvm.AMDGPU.dp4(<4 x float> %869, <4 x float> %873) %875 = fcmp uge float 0x3FECCCCCC0000000, %874 %876 = select i1 %875, float 0x3FECCCCCC0000000, float %874 - %877 = fmul float %863, %876 - %878 = fmul float %864, %876 - %879 = fmul float %865, %876 + %877 = fmul nexc nrnd float %863, %876 + %878 = fmul nexc nrnd float %864, %876 + %879 = fmul nexc nrnd float %865, %876 br label %ENDIF175 ENDIF175: ; preds = %ENDIF172, %IF176 @@ -1028,9 +1028,9 @@ br i1 %886, label %IF179, label %ENDIF178 IF179: ; preds = %ENDIF175 - %887 = fadd float %202, 1.000000e+00 - %888 = fadd float %202, 1.000000e+00 - %889 = fadd float %202, 1.000000e+00 + %887 = fadd nexc nrnd float %202, 1.000000e+00 + %888 = fadd nexc nrnd float %202, 1.000000e+00 + %889 = fadd nexc nrnd float %202, 1.000000e+00 %890 = insertelement <4 x float> undef, float %43, i32 0 %891 = insertelement <4 x float> %890, float %44, i32 1 %892 = insertelement <4 x float> %891, float %45, i32 2 @@ -1041,23 +1041,23 @@ %897 = insertelement <4 x float> %896, float 0.000000e+00, i32 3 %898 = call float @llvm.AMDGPU.dp4(<4 x float> %893, <4 x float> %897) %899 = call float @llvm.AMDGPU.rsq.f32(float %898) - %900 = fmul float %45, %899 + %900 = fmul nexc nrnd float %45, %899 %901 = call float @fabs(float %900) - %902 = fmul float %176, 0x3FECCCCCC0000000 - %903 = fadd float %902, %901 - %904 = fadd float %903, 0xBFEFAE1480000000 - %905 = fmul float %904, 0xC043FFFE20000000 + %902 = fmul nexc nrnd float %176, 0x3FECCCCCC0000000 + %903 = fadd nexc nrnd float %902, %901 + %904 = fadd nexc nrnd float %903, 0xBFEFAE1480000000 + %905 = fmul nexc nrnd float %904, 0xC043FFFE20000000 %906 = call float @llvm.AMDIL.clamp.(float %905, float 0.000000e+00, float 1.000000e+00) - %907 = fmul float 2.000000e+00, %906 - %908 = fsub float -0.000000e+00, %907 - %909 = fadd float 3.000000e+00, %908 - %910 = fmul float %906, %909 - %911 = fmul float %906, %910 + %907 = fmul nexc nrnd float 2.000000e+00, %906 + %908 = fsub nexc nrnd float -0.000000e+00, %907 + %909 = fadd nexc nrnd float 3.000000e+00, %908 + %910 = fmul nexc nrnd float %906, %909 + %911 = fmul nexc nrnd float %906, %910 %912 = call float @llvm.AMDGPU.lrp(float %911, float %temp84.5, float %887) %913 = call float @llvm.AMDGPU.lrp(float %911, float %temp85.5, float %888) %914 = call float @llvm.AMDGPU.lrp(float %911, float %temp86.5, float %889) %915 = call float @llvm.AMDGPU.lrp(float %911, float %temp87.5, float 0.000000e+00) - %916 = fmul float %202, 5.000000e-01 + %916 = fmul nexc nrnd float %202, 5.000000e-01 %917 = fcmp uge float 0x3FE4CCCCC0000000, %916 %918 = select i1 %917, float 0x3FE4CCCCC0000000, float %916 %919 = fcmp uge float %918, 0x3FE3333340000000 @@ -1077,9 +1077,9 @@ %933 = call float @llvm.AMDGPU.dp4(<4 x float> %928, <4 x float> %932) %934 = fcmp uge float 0x3FE99999A0000000, %933 %935 = select i1 %934, float 0x3FE99999A0000000, float %933 - %936 = fmul float %8, %935 - %937 = fmul float %13, %935 - %938 = fmul float %18, %935 + %936 = fmul nexc nrnd float %8, %935 + %937 = fmul nexc nrnd float %13, %935 + %938 = fmul nexc nrnd float %18, %935 %939 = insertelement <4 x float> undef, float %34, i32 0 %940 = insertelement <4 x float> %939, float %35, i32 1 %941 = insertelement <4 x float> %940, float %36, i32 2 @@ -1091,9 +1091,9 @@ %947 = call float @llvm.AMDGPU.dp4(<4 x float> %942, <4 x float> %946) %948 = fcmp uge float 0x3FECCCCCC0000000, %947 %949 = select i1 %948, float 0x3FECCCCCC0000000, float %947 - %950 = fmul float %936, %949 - %951 = fmul float %937, %949 - %952 = fmul float %938, %949 + %950 = fmul nexc nrnd float %936, %949 + %951 = fmul nexc nrnd float %937, %949 + %952 = fmul nexc nrnd float %938, %949 br label %ENDIF178 ENDIF178: ; preds = %ENDIF175, %IF179 @@ -1104,29 +1104,29 @@ %temp92.12 = phi float [ %950, %IF179 ], [ %temp92.11, %ENDIF175 ] %temp93.6 = phi float [ %951, %IF179 ], [ %temp93.5, %ENDIF175 ] %temp94.6 = phi float [ %952, %IF179 ], [ %temp94.5, %ENDIF175 ] - %953 = fmul float %55, %temp92.12 - %954 = fmul float %57, %temp93.6 - %955 = fmul float %59, %temp94.6 - %956 = fmul float %61, 0.000000e+00 - %957 = fmul float %temp84.6, %953 - %958 = fmul float %temp85.6, %954 - %959 = fmul float %temp86.6, %955 - %960 = fmul float %temp87.6, %956 - %961 = fmul float %2, -2.000000e+00 - %962 = fadd float %961, 1.000000e+00 + %953 = fmul nexc nrnd float %55, %temp92.12 + %954 = fmul nexc nrnd float %57, %temp93.6 + %955 = fmul nexc nrnd float %59, %temp94.6 + %956 = fmul nexc nrnd float %61, 0.000000e+00 + %957 = fmul nexc nrnd float %temp84.6, %953 + %958 = fmul nexc nrnd float %temp85.6, %954 + %959 = fmul nexc nrnd float %temp86.6, %955 + %960 = fmul nexc nrnd float %temp87.6, %956 + %961 = fmul nexc nrnd float %2, -2.000000e+00 + %962 = fadd nexc nrnd float %961, 1.000000e+00 %963 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 23) %964 = extractelement <4 x float> %963, i32 2 - %965 = fsub float -0.000000e+00, %964 - %966 = fadd float %962, %965 - %967 = fdiv float 1.000000e+00, %966 + %965 = fsub nexc nrnd float -0.000000e+00, %964 + %966 = fadd nexc nrnd float %962, %965 + %967 = fdiv nexc nrnd float 1.000000e+00, %966 %968 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 24) %969 = extractelement <4 x float> %968, i32 2 - %970 = fmul float %969, %967 - %971 = fsub float -0.000000e+00, %53 - %972 = fmul float %971, %53 - %973 = fmul float %972, %970 - %974 = fmul float %973, %970 - %975 = fmul float %974, 0x3FF7154760000000 + %970 = fmul nexc nrnd float %969, %967 + %971 = fsub nexc nrnd float -0.000000e+00, %53 + %972 = fmul nexc nrnd float %971, %53 + %973 = fmul nexc nrnd float %972, %970 + %974 = fmul nexc nrnd float %973, %970 + %975 = fmul nexc nrnd float %974, 0x3FF7154760000000 %976 = call float @llvm.AMDIL.exp.(float %975) %977 = fcmp oeq float %53, 1.000000e+00 %978 = sext i1 %977 to i32 Index: test/CodeGen/AMDGPU/bitcast.ll =================================================================== --- test/CodeGen/AMDGPU/bitcast.ll +++ test/CodeGen/AMDGPU/bitcast.ll @@ -70,7 +70,7 @@ ; SI: s_endpgm define void @bitcast_f64_to_v2i32(<2 x i32> addrspace(1)* %out, double addrspace(1)* %in) { %val = load double, double addrspace(1)* %in, align 8 - %add = fadd double %val, 4.0 + %add = fadd nexc nrnd double %val, 4.0 %bc = bitcast double %add to <2 x i32> store <2 x i32> %bc, <2 x i32> addrspace(1)* %out, align 8 ret void Index: test/CodeGen/AMDGPU/commute_modifiers.ll =================================================================== --- test/CodeGen/AMDGPU/commute_modifiers.ll +++ test/CodeGen/AMDGPU/commute_modifiers.ll @@ -13,7 +13,7 @@ %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid %x = load float, float addrspace(1)* %gep.0 %x.fabs = call float @llvm.fabs.f32(float %x) #1 - %z = fadd float 2.0, %x.fabs + %z = fadd nexc nrnd float 2.0, %x.fabs store float %z, float addrspace(1)* %out ret void } @@ -27,8 +27,8 @@ %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid %x = load float, float addrspace(1)* %gep.0 %x.fabs = call float @llvm.fabs.f32(float %x) #1 - %x.fneg.fabs = fsub float -0.000000e+00, %x.fabs - %z = fmul float 4.0, %x.fneg.fabs + %x.fneg.fabs = fsub nexc nrnd float -0.000000e+00, %x.fabs + %z = fmul nexc nrnd float 4.0, %x.fneg.fabs store float %z, float addrspace(1)* %out ret void } @@ -41,8 +41,8 @@ %tid = call i32 @llvm.r600.read.tidig.x() #1 %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid %x = load float, float addrspace(1)* %gep.0 - %x.fneg = fsub float -0.000000e+00, %x - %z = fmul float 4.0, %x.fneg + %x.fneg = fsub nexc nrnd float -0.000000e+00, %x + %z = fmul nexc nrnd float 4.0, %x.fneg store float %z, float addrspace(1)* %out ret void } @@ -58,7 +58,7 @@ %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid %x = load float, float addrspace(1)* %gep.0 %x.fabs = call float @llvm.fabs.f32(float %x) #1 - %z = fadd float 1024.0, %x.fabs + %z = fadd nexc nrnd float 1024.0, %x.fabs store float %z, float addrspace(1)* %out ret void } @@ -75,7 +75,7 @@ %x = load float, float addrspace(1)* %gep.0 %y = load float, float addrspace(1)* %gep.1 %y.fabs = call float @llvm.fabs.f32(float %y) #1 - %z = fadd float %x, %y.fabs + %z = fadd nexc nrnd float %x, %y.fabs store float %z, float addrspace(1)* %out ret void } @@ -91,8 +91,8 @@ %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1 %x = load float, float addrspace(1)* %gep.0 %y = load float, float addrspace(1)* %gep.1 - %y.fneg = fsub float -0.000000e+00, %y - %z = fmul float %x, %y.fneg + %y.fneg = fsub nexc nrnd float -0.000000e+00, %y + %z = fmul nexc nrnd float %x, %y.fneg store float %z, float addrspace(1)* %out ret void } @@ -109,8 +109,8 @@ %x = load float, float addrspace(1)* %gep.0 %y = load float, float addrspace(1)* %gep.1 %y.fabs = call float @llvm.fabs.f32(float %y) #1 - %y.fabs.fneg = fsub float -0.000000e+00, %y.fabs - %z = fmul float %x, %y.fabs.fneg + %y.fabs.fneg = fsub nexc nrnd float -0.000000e+00, %y.fabs + %z = fmul nexc nrnd float %x, %y.fabs.fneg store float %z, float addrspace(1)* %out ret void } @@ -129,7 +129,7 @@ %y = load float, float addrspace(1)* %gep.1 %x.fabs = call float @llvm.fabs.f32(float %x) #1 %y.fabs = call float @llvm.fabs.f32(float %y) #1 - %z = fmul float %x.fabs, %y.fabs + %z = fmul nexc nrnd float %x.fabs, %y.fabs store float %z, float addrspace(1)* %out ret void } @@ -147,8 +147,8 @@ %y = load float, float addrspace(1)* %gep.1 %x.fabs = call float @llvm.fabs.f32(float %x) #1 %y.fabs = call float @llvm.fabs.f32(float %y) #1 - %y.fabs.fneg = fsub float -0.000000e+00, %y.fabs - %z = fmul float %x.fabs, %y.fabs.fneg + %y.fabs.fneg = fsub nexc nrnd float -0.000000e+00, %y.fabs + %z = fmul nexc nrnd float %x.fabs, %y.fabs.fneg store float %z, float addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/cvt_flr_i32_f32.ll =================================================================== --- test/CodeGen/AMDGPU/cvt_flr_i32_f32.ll +++ test/CodeGen/AMDGPU/cvt_flr_i32_f32.ll @@ -23,7 +23,7 @@ ; SI-NONAN: v_cvt_flr_i32_f32_e32 v{{[0-9]+}}, [[TMP]] ; SI: s_endpgm define void @cvt_flr_i32_f32_1(i32 addrspace(1)* %out, float %x) #0 { - %fadd = fadd float %x, 1.0 + %fadd = fadd nexc nrnd float %x, 1.0 %floor = call float @llvm.floor.f32(float %fadd) #1 %cvt = fptosi float %floor to i32 store i32 %cvt, i32 addrspace(1)* %out @@ -49,7 +49,7 @@ ; SI-NONAN: v_cvt_flr_i32_f32_e64 v{{[0-9]+}}, -s{{[0-9]+}} ; SI: s_endpgm define void @cvt_flr_i32_f32_fneg(i32 addrspace(1)* %out, float %x) #0 { - %x.fneg = fsub float -0.000000e+00, %x + %x.fneg = fsub nexc nrnd float -0.000000e+00, %x %floor = call float @llvm.floor.f32(float %x.fneg) #1 %cvt = fptosi float %floor to i32 store i32 %cvt, i32 addrspace(1)* %out @@ -63,7 +63,7 @@ ; SI: s_endpgm define void @cvt_flr_i32_f32_fabs_fneg(i32 addrspace(1)* %out, float %x) #0 { %x.fabs = call float @llvm.fabs.f32(float %x) #1 - %x.fabs.fneg = fsub float -0.000000e+00, %x.fabs + %x.fabs.fneg = fsub nexc nrnd float -0.000000e+00, %x.fabs %floor = call float @llvm.floor.f32(float %x.fabs.fneg) #1 %cvt = fptosi float %floor to i32 store i32 %cvt, i32 addrspace(1)* %out Index: test/CodeGen/AMDGPU/cvt_rpi_i32_f32.ll =================================================================== --- test/CodeGen/AMDGPU/cvt_rpi_i32_f32.ll +++ test/CodeGen/AMDGPU/cvt_rpi_i32_f32.ll @@ -10,7 +10,7 @@ ; SI-NONAN: v_cvt_rpi_i32_f32_e32 v{{[0-9]+}}, s{{[0-9]+}} ; SI: s_endpgm define void @cvt_rpi_i32_f32(i32 addrspace(1)* %out, float %x) #0 { - %fadd = fadd float %x, 0.5 + %fadd = fadd nexc nrnd float %x, 0.5 %floor = call float @llvm.floor.f32(float %fadd) #1 %cvt = fptosi float %floor to i32 store i32 %cvt, i32 addrspace(1)* %out @@ -23,14 +23,14 @@ ; SI: s_endpgm define void @cvt_rpi_i32_f32_fabs(i32 addrspace(1)* %out, float %x) #0 { %x.fabs = call float @llvm.fabs.f32(float %x) #1 - %fadd = fadd float %x.fabs, 0.5 + %fadd = fadd nexc nrnd float %x.fabs, 0.5 %floor = call float @llvm.floor.f32(float %fadd) #1 %cvt = fptosi float %floor to i32 store i32 %cvt, i32 addrspace(1)* %out ret void } -; FIXME: This doesn't work because it forms fsub 0.5, x +; FIXME: This doesn't work because it forms fsub nexc nrnd 0.5, x ; FUNC-LABEL: {{^}}cvt_rpi_i32_f32_fneg: ; XSI-NONAN: v_cvt_rpi_i32_f32_e64 v{{[0-9]+}}, -s{{[0-9]+}} ; SI: v_sub_f32_e64 [[TMP:v[0-9]+]], 0.5, s{{[0-9]+}} @@ -38,8 +38,8 @@ ; SI-NONAN: v_cvt_flr_i32_f32_e32 {{v[0-9]+}}, [[TMP]] ; SI: s_endpgm define void @cvt_rpi_i32_f32_fneg(i32 addrspace(1)* %out, float %x) #0 { - %x.fneg = fsub float -0.000000e+00, %x - %fadd = fadd float %x.fneg, 0.5 + %x.fneg = fsub nexc nrnd float -0.000000e+00, %x + %fadd = fadd nexc nrnd float %x.fneg, 0.5 %floor = call float @llvm.floor.f32(float %fadd) #1 %cvt = fptosi float %floor to i32 store i32 %cvt, i32 addrspace(1)* %out @@ -57,8 +57,8 @@ ; SI: s_endpgm define void @cvt_rpi_i32_f32_fabs_fneg(i32 addrspace(1)* %out, float %x) #0 { %x.fabs = call float @llvm.fabs.f32(float %x) #1 - %x.fabs.fneg = fsub float -0.000000e+00, %x.fabs - %fadd = fadd float %x.fabs.fneg, 0.5 + %x.fabs.fneg = fsub nexc nrnd float -0.000000e+00, %x.fabs + %fadd = fadd nexc nrnd float %x.fabs.fneg, 0.5 %floor = call float @llvm.floor.f32(float %fadd) #1 %cvt = fptosi float %floor to i32 store i32 %cvt, i32 addrspace(1)* %out @@ -72,7 +72,7 @@ ; SI: v_cvt_u32_f32 ; SI: s_endpgm define void @no_cvt_rpi_i32_f32_0(i32 addrspace(1)* %out, float %x) #0 { - %fadd = fadd float %x, 0.5 + %fadd = fadd nexc nrnd float %x, 0.5 %floor = call float @llvm.floor.f32(float %fadd) #1 %cvt = fptoui float %floor to i32 store i32 %cvt, i32 addrspace(1)* %out Index: test/CodeGen/AMDGPU/ds-negative-offset-addressing-mode-loop.ll =================================================================== --- test/CodeGen/AMDGPU/ds-negative-offset-addressing-mode-loop.ll +++ test/CodeGen/AMDGPU/ds-negative-offset-addressing-mode-loop.ll @@ -48,11 +48,11 @@ %add7 = add nsw i32 %offset.02, 64 %arrayidx8 = getelementptr inbounds float, float addrspace(3)* %lptr, i32 %add7 %tmp4 = load float, float addrspace(3)* %arrayidx8, align 4 - %add9 = fadd float %tmp, %tmp1 - %add10 = fadd float %add9, %tmp2 - %add11 = fadd float %add10, %tmp3 - %add12 = fadd float %add11, %tmp4 - %add13 = fadd float %sum.03, %add12 + %add9 = fadd nexc nrnd float %tmp, %tmp1 + %add10 = fadd nexc nrnd float %add9, %tmp2 + %add11 = fadd nexc nrnd float %add10, %tmp3 + %add12 = fadd nexc nrnd float %add11, %tmp4 + %add13 = fadd nexc nrnd float %sum.03, %add12 %inc = add nsw i32 %k.01, 1 %add14 = add nsw i32 %offset.02, 97 %exitcond = icmp eq i32 %inc, 8 Index: test/CodeGen/AMDGPU/ds_read2.ll =================================================================== --- test/CodeGen/AMDGPU/ds_read2.ll +++ test/CodeGen/AMDGPU/ds_read2.ll @@ -19,7 +19,7 @@ %add.x = add nsw i32 %x.i, 8 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %add.x %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -38,7 +38,7 @@ %add.x = add nsw i32 %x.i, 255 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %add.x %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -56,7 +56,7 @@ %add.x = add nsw i32 %x.i, 257 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %add.x %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -75,7 +75,7 @@ %idx.1 = add nsw i32 %tid.x, 8 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %idx.1 %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum.0 = fadd float %val0, %val1 + %sum.0 = fadd nexc nrnd float %val0, %val1 %idx.2 = add nsw i32 %tid.x, 11 %arrayidx2 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %idx.2 @@ -84,9 +84,9 @@ %idx.3 = add nsw i32 %tid.x, 27 %arrayidx3 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %idx.3 %val3 = load float, float addrspace(3)* %arrayidx3, align 4 - %sum.1 = fadd float %val2, %val3 + %sum.1 = fadd nexc nrnd float %val2, %val3 - %sum = fadd float %sum.0, %sum.1 + %sum = fadd nexc nrnd float %sum.0, %sum.1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %idx.0 store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -107,7 +107,7 @@ %idx.1 = add nsw i32 %tid.x, 8 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %idx.1 %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum.0 = fadd float %val0, %val1 + %sum.0 = fadd nexc nrnd float %val0, %val1 call void @llvm.AMDGPU.barrier.local() #2 @@ -118,9 +118,9 @@ %idx.3 = add nsw i32 %tid.x, 27 %arrayidx3 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %idx.3 %val3 = load float, float addrspace(3)* %arrayidx3, align 4 - %sum.1 = fadd float %val2, %val3 + %sum.1 = fadd nexc nrnd float %val2, %val3 - %sum = fadd float %sum.0, %sum.1 + %sum = fadd nexc nrnd float %sum.0, %sum.1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %idx.0 store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -142,7 +142,7 @@ %idx.1 = add nsw i32 %tid.x, 8 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %idx.1 %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum.0 = fadd float %val0, %val1 + %sum.0 = fadd nexc nrnd float %val0, %val1 %idx.2 = add nsw i32 %tid.x, 11 %arrayidx2 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %idx.2 @@ -151,9 +151,9 @@ %idx.3 = add nsw i32 %tid.x, 27 %arrayidx3 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %idx.3 %val3 = load float, float addrspace(3)* %arrayidx3, align 4 - %sum.1 = fadd float %val2, %val3 + %sum.1 = fadd nexc nrnd float %val2, %val3 - %sum = fadd float %sum.0, %sum.1 + %sum = fadd nexc nrnd float %sum.0, %sum.1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %idx.0 store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -180,7 +180,7 @@ %val0 = load float, float addrspace(3)* %gep.0, align 4 %val1 = load float, float addrspace(3)* %gep.1, align 4 %add.x = add nsw i32 %x.i, 8 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -210,7 +210,7 @@ %val0 = load float, float addrspace(3)* %gep.0, align 4 %val1 = load float, float addrspace(3)* %gep.1.offset, align 4 %add.x = add nsw i32 %x.i, 8 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -232,7 +232,7 @@ %val0 = load float, float addrspace(3)* %gep.0, align 4 %val1 = load float, float addrspace(3)* %gep.1, align 4 %add.x = add nsw i32 %x.i, 8 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -250,7 +250,7 @@ %add.x = add nsw i32 %x.i, 8 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %add.x %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -268,7 +268,7 @@ %add.x = add nsw i32 %x.i, 8 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %add.x %val1 = load volatile float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -287,7 +287,7 @@ %add.x = add nsw i32 %x.i, 8 %arrayidx1 = getelementptr inbounds float, float addrspace(3)* %lds, i32 %add.x %val1 = load float, float addrspace(3)* %arrayidx1, align 1 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -303,7 +303,7 @@ %add.x = add nsw i32 %x.i, 8 %arrayidx1 = getelementptr inbounds float, float addrspace(3)* %lds, i32 %add.x %val1 = load float, float addrspace(3)* %arrayidx1, align 2 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -322,7 +322,7 @@ %add.x = add nsw i32 %x.i, 8 %arrayidx1 = getelementptr inbounds [512 x double], [512 x double] addrspace(3)* @lds.f64, i32 0, i32 %add.x %val1 = load double, double addrspace(3)* %arrayidx1, align 8 - %sum = fadd double %val0, %val1 + %sum = fadd nexc nrnd double %val0, %val1 %out.gep = getelementptr inbounds double, double addrspace(1)* %out, i32 %x.i store double %sum, double addrspace(1)* %out.gep, align 8 ret void @@ -338,7 +338,7 @@ %add.x = add nsw i32 %x.i, 255 %arrayidx1 = getelementptr inbounds [512 x double], [512 x double] addrspace(3)* @lds.f64, i32 0, i32 %add.x %val1 = load double, double addrspace(3)* %arrayidx1, align 8 - %sum = fadd double %val0, %val1 + %sum = fadd nexc nrnd double %val0, %val1 %out.gep = getelementptr inbounds double, double addrspace(1)* %out, i32 %x.i store double %sum, double addrspace(1)* %out.gep, align 8 ret void @@ -356,7 +356,7 @@ %add.x = add nsw i32 %x.i, 257 %arrayidx1 = getelementptr inbounds [512 x double], [512 x double] addrspace(3)* @lds.f64, i32 0, i32 %add.x %val1 = load double, double addrspace(3)* %arrayidx1, align 8 - %sum = fadd double %val0, %val1 + %sum = fadd nexc nrnd double %val0, %val1 %out.gep = getelementptr inbounds double, double addrspace(1)* %out, i32 %x.i store double %sum, double addrspace(1)* %out.gep, align 8 ret void @@ -374,7 +374,7 @@ %add.x = add nsw i32 %x.i, 7 %arrayidx1 = getelementptr inbounds double, double addrspace(3)* %lds, i32 %add.x %val1 = load double, double addrspace(3)* %arrayidx1, align 4 - %sum = fadd double %val0, %val1 + %sum = fadd nexc nrnd double %val0, %val1 %out.gep = getelementptr inbounds double, double addrspace(1)* %out, i32 %x.i store double %sum, double addrspace(1)* %out.gep, align 4 ret void @@ -468,15 +468,15 @@ %add79 = add nsw i32 %y.i, 65 %arrayidx80 = getelementptr inbounds [776 x float], [776 x float] addrspace(3)* @sgemm.lB, i32 0, i32 %add79 %tmp25 = load float, float addrspace(3)* %arrayidx80, align 4 - %sum.0 = fadd float %tmp16, %tmp17 - %sum.1 = fadd float %sum.0, %tmp18 - %sum.2 = fadd float %sum.1, %tmp19 - %sum.3 = fadd float %sum.2, %tmp20 - %sum.4 = fadd float %sum.3, %tmp21 - %sum.5 = fadd float %sum.4, %tmp22 - %sum.6 = fadd float %sum.5, %tmp23 - %sum.7 = fadd float %sum.6, %tmp24 - %sum.8 = fadd float %sum.7, %tmp25 + %sum.0 = fadd nexc nrnd float %tmp16, %tmp17 + %sum.1 = fadd nexc nrnd float %sum.0, %tmp18 + %sum.2 = fadd nexc nrnd float %sum.1, %tmp19 + %sum.3 = fadd nexc nrnd float %sum.2, %tmp20 + %sum.4 = fadd nexc nrnd float %sum.3, %tmp21 + %sum.5 = fadd nexc nrnd float %sum.4, %tmp22 + %sum.6 = fadd nexc nrnd float %sum.5, %tmp23 + %sum.7 = fadd nexc nrnd float %sum.6, %tmp24 + %sum.8 = fadd nexc nrnd float %sum.7, %tmp25 store float %sum.8, float addrspace(1)* %C, align 4 ret void } Index: test/CodeGen/AMDGPU/ds_read2_offset_order.ll =================================================================== --- test/CodeGen/AMDGPU/ds_read2_offset_order.ll +++ test/CodeGen/AMDGPU/ds_read2_offset_order.ll @@ -20,27 +20,27 @@ %ptr1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 256 %val1 = load float, float addrspace(3)* %ptr1 - %add1 = fadd float %val0, %val1 + %add1 = fadd nexc nrnd float %val0, %val1 %ptr2 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 3 %val2 = load float, float addrspace(3)* %ptr2 - %add2 = fadd float %add1, %val2 + %add2 = fadd nexc nrnd float %add1, %val2 %ptr3 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 2 %val3 = load float, float addrspace(3)* %ptr3 - %add3 = fadd float %add2, %val3 + %add3 = fadd nexc nrnd float %add2, %val3 %ptr4 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 12 %val4 = load float, float addrspace(3)* %ptr4 - %add4 = fadd float %add3, %val4 + %add4 = fadd nexc nrnd float %add3, %val4 %ptr5 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 14 %val5 = load float, float addrspace(3)* %ptr5 - %add5 = fadd float %add4, %val5 + %add5 = fadd nexc nrnd float %add4, %val5 %ptr6 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 11 %val6 = load float, float addrspace(3)* %ptr6 - %add6 = fadd float %add5, %val6 + %add6 = fadd nexc nrnd float %add5, %val6 store float %add6, float addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/ds_read2_superreg.ll =================================================================== --- test/CodeGen/AMDGPU/ds_read2_superreg.ll +++ test/CodeGen/AMDGPU/ds_read2_superreg.ll @@ -52,9 +52,9 @@ %elt2 = extractelement <4 x float> %val0, i32 2 %elt3 = extractelement <4 x float> %val0, i32 3 - %add0 = fadd float %elt0, %elt2 - %add1 = fadd float %elt1, %elt3 - %add2 = fadd float %add0, %add1 + %add0 = fadd nexc nrnd float %elt0, %elt2 + %add1 = fadd nexc nrnd float %elt1, %elt3 + %add2 = fadd nexc nrnd float %add0, %add1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %add2, float addrspace(1)* %out.gep @@ -76,8 +76,8 @@ %elt1 = extractelement <3 x float> %val0, i32 1 %elt2 = extractelement <3 x float> %val0, i32 2 - %add0 = fadd float %elt0, %elt2 - %add1 = fadd float %add0, %elt1 + %add0 = fadd nexc nrnd float %elt0, %elt2 + %add1 = fadd nexc nrnd float %add0, %elt1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %add1, float addrspace(1)* %out.gep Index: test/CodeGen/AMDGPU/ds_read2st64.ll =================================================================== --- test/CodeGen/AMDGPU/ds_read2st64.ll +++ test/CodeGen/AMDGPU/ds_read2st64.ll @@ -17,7 +17,7 @@ %add.x = add nsw i32 %x.i, 64 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %add.x %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -37,7 +37,7 @@ %add.x.1 = add nsw i32 %x.i, 128 %arrayidx1 = getelementptr inbounds float, float addrspace(3)* %lds, i32 %add.x.1 %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -57,7 +57,7 @@ %add.x.1 = add nsw i32 %x.i, 16320 %arrayidx1 = getelementptr inbounds float, float addrspace(3)* %lds, i32 %add.x.1 %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -77,7 +77,7 @@ %add.x.1 = add nsw i32 %x.i, 16384 %arrayidx1 = getelementptr inbounds float, float addrspace(3)* %lds, i32 %add.x.1 %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -93,7 +93,7 @@ %add.x = add nsw i32 %x.i, 63 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %add.x %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -110,7 +110,7 @@ %add.x.1 = add nsw i32 %x.i, 127 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds, i32 0, i32 %add.x.1 %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 %out.gep = getelementptr inbounds float, float addrspace(1)* %out, i32 %x.i store float %sum, float addrspace(1)* %out.gep, align 4 ret void @@ -129,7 +129,7 @@ %add.x = add nsw i32 %x.i, 64 %arrayidx1 = getelementptr inbounds [512 x double], [512 x double] addrspace(3)* @lds.f64, i32 0, i32 %add.x %val1 = load double, double addrspace(3)* %arrayidx1, align 8 - %sum = fadd double %val0, %val1 + %sum = fadd nexc nrnd double %val0, %val1 %out.gep = getelementptr inbounds double, double addrspace(1)* %out, i32 %x.i store double %sum, double addrspace(1)* %out.gep, align 8 ret void @@ -149,7 +149,7 @@ %add.x.1 = add nsw i32 %x.i, 128 %arrayidx1 = getelementptr inbounds double, double addrspace(3)* %lds, i32 %add.x.1 %val1 = load double, double addrspace(3)* %arrayidx1, align 8 - %sum = fadd double %val0, %val1 + %sum = fadd nexc nrnd double %val0, %val1 %out.gep = getelementptr inbounds double, double addrspace(1)* %out, i32 %x.i store double %sum, double addrspace(1)* %out.gep, align 8 ret void @@ -168,7 +168,7 @@ %add.x = add nsw i32 %x.i, 64 %arrayidx1 = getelementptr inbounds double, double addrspace(3)* %lds, i32 %add.x %val1 = load double, double addrspace(3)* %arrayidx1, align 4 - %sum = fadd double %val0, %val1 + %sum = fadd nexc nrnd double %val0, %val1 %out.gep = getelementptr inbounds double, double addrspace(1)* %out, i32 %x.i store double %sum, double addrspace(1)* %out.gep, align 4 ret void @@ -189,7 +189,7 @@ %add.x.1 = add nsw i32 %x.i, 8128 %arrayidx1 = getelementptr inbounds double, double addrspace(3)* %lds, i32 %add.x.1 %val1 = load double, double addrspace(3)* %arrayidx1, align 8 - %sum = fadd double %val0, %val1 + %sum = fadd nexc nrnd double %val0, %val1 %out.gep = getelementptr inbounds double, double addrspace(1)* %out, i32 %x.i store double %sum, double addrspace(1)* %out.gep, align 8 ret void @@ -209,7 +209,7 @@ %add.x.1 = add nsw i32 %x.i, 8192 %arrayidx1 = getelementptr inbounds double, double addrspace(3)* %lds, i32 %add.x.1 %val1 = load double, double addrspace(3)* %arrayidx1, align 8 - %sum = fadd double %val0, %val1 + %sum = fadd nexc nrnd double %val0, %val1 %out.gep = getelementptr inbounds double, double addrspace(1)* %out, i32 %x.i store double %sum, double addrspace(1)* %out.gep, align 8 ret void @@ -226,7 +226,7 @@ %add.x.1 = add nsw i32 %x.i, 8129 %arrayidx1 = getelementptr inbounds double, double addrspace(3)* %lds, i32 %add.x.1 %val1 = load double, double addrspace(3)* %arrayidx1, align 8 - %sum = fadd double %val0, %val1 + %sum = fadd nexc nrnd double %val0, %val1 %out.gep = getelementptr inbounds double, double addrspace(1)* %out, i32 %x.i store double %sum, double addrspace(1)* %out.gep, align 8 ret void @@ -246,7 +246,7 @@ %add.x = add nsw i32 %x.i, 8 %arrayidx1 = getelementptr inbounds double, double addrspace(3)* %lds, i32 %add.x %val1 = load double, double addrspace(3)* %arrayidx1, align 8 - %sum = fadd double %val0, %val1 + %sum = fadd nexc nrnd double %val0, %val1 %out.gep = getelementptr inbounds double, double addrspace(1)* %out, i32 %x.i store double %sum, double addrspace(1)* %out.gep, align 4 ret void Index: test/CodeGen/AMDGPU/fabs.f64.ll =================================================================== --- test/CodeGen/AMDGPU/fabs.f64.ll +++ test/CodeGen/AMDGPU/fabs.f64.ll @@ -59,7 +59,7 @@ ; SI: s_endpgm define void @fabs_fold_f64(double addrspace(1)* %out, double %in0, double %in1) { %fabs = call double @llvm.fabs.f64(double %in0) - %fmul = fmul double %fabs, %in1 + %fmul = fmul nexc nrnd double %fabs, %in1 store double %fmul, double addrspace(1)* %out ret void } @@ -71,7 +71,7 @@ ; SI: s_endpgm define void @fabs_fn_fold_f64(double addrspace(1)* %out, double %in0, double %in1) { %fabs = call double @fabs(double %in0) - %fmul = fmul double %fabs, %in1 + %fmul = fmul nexc nrnd double %fabs, %in1 store double %fmul, double addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fabs.ll =================================================================== --- test/CodeGen/AMDGPU/fabs.ll +++ test/CodeGen/AMDGPU/fabs.ll @@ -78,7 +78,7 @@ ; GCN: v_mul_f32_e64 v{{[0-9]+}}, |[[ABS_VALUE]]|, v{{[0-9]+}} define void @fabs_fn_fold(float addrspace(1)* %out, float %in0, float %in1) { %fabs = call float @fabs(float %in0) - %fmul = fmul float %fabs, %in1 + %fmul = fmul nexc nrnd float %fabs, %in1 store float %fmul, float addrspace(1)* %out ret void } @@ -90,7 +90,7 @@ ; GCN: v_mul_f32_e64 v{{[0-9]+}}, |[[ABS_VALUE]]|, v{{[0-9]+}} define void @fabs_fold(float addrspace(1)* %out, float %in0, float %in1) { %fabs = call float @llvm.fabs.f32(float %in0) - %fmul = fmul float %fabs, %in1 + %fmul = fmul nexc nrnd float %fabs, %in1 store float %fmul, float addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fadd.ll =================================================================== --- test/CodeGen/AMDGPU/fadd.ll +++ test/CodeGen/AMDGPU/fadd.ll @@ -6,7 +6,7 @@ ; R600: ADD {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].Z, KC0[2].W ; SI: v_add_f32 define void @fadd_f32(float addrspace(1)* %out, float %a, float %b) { - %add = fadd float %a, %b + %add = fadd nexc nrnd float %a, %b store float %add, float addrspace(1)* %out, align 4 ret void } @@ -17,7 +17,7 @@ ; SI: v_add_f32 ; SI: v_add_f32 define void @fadd_v2f32(<2 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b) { - %add = fadd <2 x float> %a, %b + %add = fadd nexc nrnd <2 x float> %a, %b store <2 x float> %add, <2 x float> addrspace(1)* %out, align 8 ret void } @@ -35,7 +35,7 @@ %b_ptr = getelementptr <4 x float>, <4 x float> addrspace(1)* %in, i32 1 %a = load <4 x float>, <4 x float> addrspace(1)* %in, align 16 %b = load <4 x float>, <4 x float> addrspace(1)* %b_ptr, align 16 - %result = fadd <4 x float> %a, %b + %result = fadd nexc nrnd <4 x float> %a, %b store <4 x float> %result, <4 x float> addrspace(1)* %out, align 16 ret void } @@ -58,7 +58,7 @@ ; SI: v_add_f32 ; SI: v_add_f32 define void @fadd_v8f32(<8 x float> addrspace(1)* %out, <8 x float> %a, <8 x float> %b) { - %add = fadd <8 x float> %a, %b + %add = fadd nexc nrnd <8 x float> %a, %b store <8 x float> %add, <8 x float> addrspace(1)* %out, align 32 ret void } Index: test/CodeGen/AMDGPU/fadd64.ll =================================================================== --- test/CodeGen/AMDGPU/fadd64.ll +++ test/CodeGen/AMDGPU/fadd64.ll @@ -7,7 +7,7 @@ double addrspace(1)* %in2) { %r0 = load double, double addrspace(1)* %in1 %r1 = load double, double addrspace(1)* %in2 - %r2 = fadd double %r0, %r1 + %r2 = fadd nexc nrnd double %r0, %r1 store double %r2, double addrspace(1)* %out ret void } @@ -15,7 +15,7 @@ ; CHECK-LABEL: {{^}}s_fadd_f64: ; CHECK: v_add_f64 {{v\[[0-9]+:[0-9]+\]}}, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}} define void @s_fadd_f64(double addrspace(1)* %out, double %r0, double %r1) { - %r2 = fadd double %r0, %r1 + %r2 = fadd nexc nrnd double %r0, %r1 store double %r2, double addrspace(1)* %out ret void } @@ -28,7 +28,7 @@ <2 x double> addrspace(1)* %in2) { %r0 = load <2 x double>, <2 x double> addrspace(1)* %in1 %r1 = load <2 x double>, <2 x double> addrspace(1)* %in2 - %r2 = fadd <2 x double> %r0, %r1 + %r2 = fadd nexc nrnd <2 x double> %r0, %r1 store <2 x double> %r2, <2 x double> addrspace(1)* %out ret void } @@ -38,7 +38,7 @@ ; CHECK: v_add_f64 {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{v\[[0-9]+:[0-9]+\]}} ; CHECK: buffer_store_dwordx4 define void @s_fadd_v2f64(<2 x double> addrspace(1)* %out, <2 x double> %r0, <2 x double> %r1) { - %r2 = fadd <2 x double> %r0, %r1 + %r2 = fadd nexc nrnd <2 x double> %r0, %r1 store <2 x double> %r2, <2 x double> addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fconst64.ll =================================================================== --- test/CodeGen/AMDGPU/fconst64.ll +++ test/CodeGen/AMDGPU/fconst64.ll @@ -7,7 +7,7 @@ define void @fconst_f64(double addrspace(1)* %out, double addrspace(1)* %in) { %r1 = load double, double addrspace(1)* %in - %r2 = fadd double %r1, 5.000000e+00 + %r2 = fadd nexc nrnd double %r1, 5.000000e+00 store double %r2, double addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fdiv.f64.ll =================================================================== --- test/CodeGen/AMDGPU/fdiv.f64.ll +++ test/CodeGen/AMDGPU/fdiv.f64.ll @@ -33,7 +33,7 @@ %gep.1 = getelementptr double, double addrspace(1)* %in, i32 1 %num = load double, double addrspace(1)* %in %den = load double, double addrspace(1)* %gep.1 - %result = fdiv double %num, %den + %result = fdiv nexc nrnd double %num, %den store double %result, double addrspace(1)* %out ret void } @@ -41,7 +41,7 @@ ; COMMON-LABEL: {{^}}fdiv_f64_s_v: define void @fdiv_f64_s_v(double addrspace(1)* %out, double addrspace(1)* %in, double %num) nounwind { %den = load double, double addrspace(1)* %in - %result = fdiv double %num, %den + %result = fdiv nexc nrnd double %num, %den store double %result, double addrspace(1)* %out ret void } @@ -49,14 +49,14 @@ ; COMMON-LABEL: {{^}}fdiv_f64_v_s: define void @fdiv_f64_v_s(double addrspace(1)* %out, double addrspace(1)* %in, double %den) nounwind { %num = load double, double addrspace(1)* %in - %result = fdiv double %num, %den + %result = fdiv nexc nrnd double %num, %den store double %result, double addrspace(1)* %out ret void } ; COMMON-LABEL: {{^}}fdiv_f64_s_s: define void @fdiv_f64_s_s(double addrspace(1)* %out, double %num, double %den) nounwind { - %result = fdiv double %num, %den + %result = fdiv nexc nrnd double %num, %den store double %result, double addrspace(1)* %out ret void } @@ -66,14 +66,14 @@ %gep.1 = getelementptr <2 x double>, <2 x double> addrspace(1)* %in, i32 1 %num = load <2 x double>, <2 x double> addrspace(1)* %in %den = load <2 x double>, <2 x double> addrspace(1)* %gep.1 - %result = fdiv <2 x double> %num, %den + %result = fdiv nexc nrnd <2 x double> %num, %den store <2 x double> %result, <2 x double> addrspace(1)* %out ret void } ; COMMON-LABEL: {{^}}s_fdiv_v2f64: define void @s_fdiv_v2f64(<2 x double> addrspace(1)* %out, <2 x double> %num, <2 x double> %den) { - %result = fdiv <2 x double> %num, %den + %result = fdiv nexc nrnd <2 x double> %num, %den store <2 x double> %result, <2 x double> addrspace(1)* %out ret void } @@ -83,14 +83,14 @@ %gep.1 = getelementptr <4 x double>, <4 x double> addrspace(1)* %in, i32 1 %num = load <4 x double>, <4 x double> addrspace(1)* %in %den = load <4 x double>, <4 x double> addrspace(1)* %gep.1 - %result = fdiv <4 x double> %num, %den + %result = fdiv nexc nrnd <4 x double> %num, %den store <4 x double> %result, <4 x double> addrspace(1)* %out ret void } ; COMMON-LABEL: {{^}}s_fdiv_v4f64: define void @s_fdiv_v4f64(<4 x double> addrspace(1)* %out, <4 x double> %num, <4 x double> %den) { - %result = fdiv <4 x double> %num, %den + %result = fdiv nexc nrnd <4 x double> %num, %den store <4 x double> %result, <4 x double> addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fdiv.ll =================================================================== --- test/CodeGen/AMDGPU/fdiv.ll +++ test/CodeGen/AMDGPU/fdiv.ll @@ -2,7 +2,7 @@ ; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s -; These tests check that fdiv is expanded correctly and also test that the +; These tests check that fdiv nexc nrnd is expanded correctly and also test that the ; scheduler is scheduling the RECIP_IEEE and MUL_IEEE instructions in separate ; instruction groups. @@ -16,7 +16,7 @@ ; SI-DAG: v_mul_f32 define void @fdiv_f32(float addrspace(1)* %out, float %a, float %b) { entry: - %0 = fdiv float %a, %b + %0 = fdiv nexc nrnd float %a, %b store float %0, float addrspace(1)* %out ret void } @@ -35,7 +35,7 @@ ; SI-DAG: v_mul_f32 define void @fdiv_v2f32(<2 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b) { entry: - %0 = fdiv <2 x float> %a, %b + %0 = fdiv nexc nrnd <2 x float> %a, %b store <2 x float> %0, <2 x float> addrspace(1)* %out ret void } @@ -62,7 +62,7 @@ %b_ptr = getelementptr <4 x float>, <4 x float> addrspace(1)* %in, i32 1 %a = load <4 x float>, <4 x float> addrspace(1) * %in %b = load <4 x float>, <4 x float> addrspace(1) * %b_ptr - %result = fdiv <4 x float> %a, %b + %result = fdiv nexc nrnd <4 x float> %a, %b store <4 x float> %result, <4 x float> addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fetch-limits.r600.ll =================================================================== --- test/CodeGen/AMDGPU/fetch-limits.r600.ll +++ test/CodeGen/AMDGPU/fetch-limits.r600.ll @@ -27,16 +27,16 @@ %res6 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %6, i32 0, i32 0, i32 1) %res7 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %7, i32 0, i32 0, i32 1) %res8 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %8, i32 0, i32 0, i32 1) - %a = fadd <4 x float> %res0, %res1 - %b = fadd <4 x float> %res2, %res3 - %c = fadd <4 x float> %res4, %res5 - %d = fadd <4 x float> %res6, %res7 - %e = fadd <4 x float> %res8, %a + %a = fadd nexc nrnd <4 x float> %res0, %res1 + %b = fadd nexc nrnd <4 x float> %res2, %res3 + %c = fadd nexc nrnd <4 x float> %res4, %res5 + %d = fadd nexc nrnd <4 x float> %res6, %res7 + %e = fadd nexc nrnd <4 x float> %res8, %a - %bc = fadd <4 x float> %b, %c - %de = fadd <4 x float> %d, %e + %bc = fadd nexc nrnd <4 x float> %b, %c + %de = fadd nexc nrnd <4 x float> %d, %e - %bcde = fadd <4 x float> %bc, %de + %bcde = fadd nexc nrnd <4 x float> %bc, %de call void @llvm.R600.store.swizzle(<4 x float> %bcde, i32 0, i32 1) ret void Index: test/CodeGen/AMDGPU/fetch-limits.r700+.ll =================================================================== --- test/CodeGen/AMDGPU/fetch-limits.r700+.ll +++ test/CodeGen/AMDGPU/fetch-limits.r700+.ll @@ -52,25 +52,25 @@ %res14 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %14, i32 0, i32 0, i32 1) %res15 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %15, i32 0, i32 0, i32 1) %res16 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %16, i32 0, i32 0, i32 1) - %a = fadd <4 x float> %res0, %res1 - %b = fadd <4 x float> %res2, %res3 - %c = fadd <4 x float> %res4, %res5 - %d = fadd <4 x float> %res6, %res7 - %e = fadd <4 x float> %res8, %res9 - %f = fadd <4 x float> %res10, %res11 - %g = fadd <4 x float> %res12, %res13 - %h = fadd <4 x float> %res14, %res15 - %i = fadd <4 x float> %res16, %a + %a = fadd nexc nrnd <4 x float> %res0, %res1 + %b = fadd nexc nrnd <4 x float> %res2, %res3 + %c = fadd nexc nrnd <4 x float> %res4, %res5 + %d = fadd nexc nrnd <4 x float> %res6, %res7 + %e = fadd nexc nrnd <4 x float> %res8, %res9 + %f = fadd nexc nrnd <4 x float> %res10, %res11 + %g = fadd nexc nrnd <4 x float> %res12, %res13 + %h = fadd nexc nrnd <4 x float> %res14, %res15 + %i = fadd nexc nrnd <4 x float> %res16, %a - %bc = fadd <4 x float> %b, %c - %de = fadd <4 x float> %d, %e - %fg = fadd <4 x float> %f, %g - %hi = fadd <4 x float> %h, %i + %bc = fadd nexc nrnd <4 x float> %b, %c + %de = fadd nexc nrnd <4 x float> %d, %e + %fg = fadd nexc nrnd <4 x float> %f, %g + %hi = fadd nexc nrnd <4 x float> %h, %i - %bcde = fadd <4 x float> %bc, %de - %fghi = fadd <4 x float> %fg, %hi + %bcde = fadd nexc nrnd <4 x float> %bc, %de + %fghi = fadd nexc nrnd <4 x float> %fg, %hi - %bcdefghi = fadd <4 x float> %bcde, %fghi + %bcdefghi = fadd nexc nrnd <4 x float> %bcde, %fghi call void @llvm.R600.store.swizzle(<4 x float> %bcdefghi, i32 0, i32 1) ret void } Index: test/CodeGen/AMDGPU/ffloor.f64.ll =================================================================== --- test/CodeGen/AMDGPU/ffloor.f64.ll +++ test/CodeGen/AMDGPU/ffloor.f64.ll @@ -35,7 +35,7 @@ ; SI: v_add_f64 {{v[[0-9]+:[0-9]+]}}, -[[INPUT]] ; SI: s_endpgm define void @ffloor_f64_neg(double addrspace(1)* %out, double %x) { - %neg = fsub double 0.0, %x + %neg = fsub nexc nrnd double 0.0, %x %y = call double @llvm.floor.f64(double %neg) nounwind readnone store double %y, double addrspace(1)* %out ret void @@ -52,7 +52,7 @@ ; SI: s_endpgm define void @ffloor_f64_neg_abs(double addrspace(1)* %out, double %x) { %abs = call double @llvm.fabs.f64(double %x) - %neg = fsub double 0.0, %abs + %neg = fsub nexc nrnd double 0.0, %abs %y = call double @llvm.floor.f64(double %neg) nounwind readnone store double %y, double addrspace(1)* %out ret void Index: test/CodeGen/AMDGPU/fma-combine.ll =================================================================== --- test/CodeGen/AMDGPU/fma-combine.ll +++ test/CodeGen/AMDGPU/fma-combine.ll @@ -24,8 +24,8 @@ %b = load double, double addrspace(1)* %gep.1 %c = load double, double addrspace(1)* %gep.2 - %mul = fmul double %a, %b - %fma = fadd double %mul, %c + %mul = fmul nexc nrnd double %a, %b + %fma = fadd nexc nrnd double %mul, %c store double %fma, double addrspace(1)* %gep.out ret void } @@ -55,9 +55,9 @@ %c = load double, double addrspace(1)* %gep.2 %d = load double, double addrspace(1)* %gep.3 - %mul = fmul double %a, %b - %fma0 = fadd double %mul, %c - %fma1 = fadd double %mul, %d + %mul = fmul nexc nrnd double %a, %b + %fma0 = fadd nexc nrnd double %mul, %c + %fma1 = fadd nexc nrnd double %mul, %d store double %fma0, double addrspace(1)* %gep.out.0 store double %fma1, double addrspace(1)* %gep.out.1 ret void @@ -81,8 +81,8 @@ %b = load double, double addrspace(1)* %gep.1 %c = load double, double addrspace(1)* %gep.2 - %mul = fmul double %a, %b - %fma = fadd double %c, %mul + %mul = fmul nexc nrnd double %a, %b + %fma = fadd nexc nrnd double %c, %mul store double %fma, double addrspace(1)* %gep.out ret void } @@ -105,8 +105,8 @@ %b = load double, double addrspace(1)* %gep.1 %c = load double, double addrspace(1)* %gep.2 - %mul = fmul double %a, %b - %fma = fsub double %mul, %c + %mul = fmul nexc nrnd double %a, %b + %fma = fsub nexc nrnd double %mul, %c store double %fma, double addrspace(1)* %gep.out ret void } @@ -136,9 +136,9 @@ %c = load double, double addrspace(1)* %gep.2 %d = load double, double addrspace(1)* %gep.3 - %mul = fmul double %a, %b - %fma0 = fsub double %mul, %c - %fma1 = fsub double %mul, %d + %mul = fmul nexc nrnd double %a, %b + %fma0 = fsub nexc nrnd double %mul, %c + %fma1 = fsub nexc nrnd double %mul, %d store double %fma0, double addrspace(1)* %gep.out.0 store double %fma1, double addrspace(1)* %gep.out.1 ret void @@ -162,8 +162,8 @@ %b = load double, double addrspace(1)* %gep.1 %c = load double, double addrspace(1)* %gep.2 - %mul = fmul double %a, %b - %fma = fsub double %c, %mul + %mul = fmul nexc nrnd double %a, %b + %fma = fsub nexc nrnd double %c, %mul store double %fma, double addrspace(1)* %gep.out ret void } @@ -193,9 +193,9 @@ %c = load double, double addrspace(1)* %gep.2 %d = load double, double addrspace(1)* %gep.3 - %mul = fmul double %a, %b - %fma0 = fsub double %c, %mul - %fma1 = fsub double %d, %mul + %mul = fmul nexc nrnd double %a, %b + %fma0 = fsub nexc nrnd double %c, %mul + %fma1 = fsub nexc nrnd double %d, %mul store double %fma0, double addrspace(1)* %gep.out.0 store double %fma1, double addrspace(1)* %gep.out.1 ret void @@ -219,9 +219,9 @@ %b = load double, double addrspace(1)* %gep.1 %c = load double, double addrspace(1)* %gep.2 - %mul = fmul double %a, %b - %mul.neg = fsub double -0.0, %mul - %fma = fsub double %mul.neg, %c + %mul = fmul nexc nrnd double %a, %b + %mul.neg = fsub nexc nrnd double -0.0, %mul + %fma = fsub nexc nrnd double %mul.neg, %c store double %fma, double addrspace(1)* %gep.out ret void @@ -251,10 +251,10 @@ %c = load double, double addrspace(1)* %gep.2 %d = load double, double addrspace(1)* %gep.3 - %mul = fmul double %a, %b - %mul.neg = fsub double -0.0, %mul - %fma0 = fsub double %mul.neg, %c - %fma1 = fsub double %mul.neg, %d + %mul = fmul nexc nrnd double %a, %b + %mul.neg = fsub nexc nrnd double -0.0, %mul + %fma0 = fsub nexc nrnd double %mul.neg, %c + %fma1 = fsub nexc nrnd double %mul.neg, %d store double %fma0, double addrspace(1)* %gep.out.0 store double %fma1, double addrspace(1)* %gep.out.1 @@ -285,10 +285,10 @@ %c = load double, double addrspace(1)* %gep.2 %d = load double, double addrspace(1)* %gep.3 - %mul = fmul double %a, %b - %mul.neg = fsub double -0.0, %mul - %fma0 = fsub double %mul.neg, %c - %fma1 = fsub double %mul, %d + %mul = fmul nexc nrnd double %a, %b + %mul.neg = fsub nexc nrnd double -0.0, %mul + %fma0 = fsub nexc nrnd double %mul.neg, %c + %fma1 = fsub nexc nrnd double %mul, %d store double %fma0, double addrspace(1)* %gep.out.0 store double %fma1, double addrspace(1)* %gep.out.1 @@ -321,9 +321,9 @@ %u = load double, double addrspace(1)* %gep.3 %v = load double, double addrspace(1)* %gep.4 - %tmp0 = fmul double %u, %v + %tmp0 = fmul nexc nrnd double %u, %v %tmp1 = call double @llvm.fma.f64(double %x, double %y, double %tmp0) #0 - %tmp2 = fsub double %tmp1, %z + %tmp2 = fsub nexc nrnd double %tmp1, %z store double %tmp2, double addrspace(1)* %gep.out ret void @@ -356,9 +356,9 @@ %u = load double, double addrspace(1)* %gep.3 %v = load double, double addrspace(1)* %gep.4 - %tmp0 = fmul double %u, %v + %tmp0 = fmul nexc nrnd double %u, %v %tmp1 = call double @llvm.fma.f64(double %y, double %z, double %tmp0) #0 - %tmp2 = fsub double %x, %tmp1 + %tmp2 = fsub nexc nrnd double %x, %tmp1 store double %tmp2, double addrspace(1)* %gep.out ret void @@ -375,8 +375,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %a = fadd float %x, 1.0 - %m = fmul float %a, %y + %a = fadd nexc nrnd float %x, 1.0 + %m = fmul nexc nrnd float %a, %y store float %m, float addrspace(1)* %out ret void } @@ -388,8 +388,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %a = fadd float %x, 1.0 - %m = fmul float %y, %a + %a = fadd nexc nrnd float %x, 1.0 + %m = fmul nexc nrnd float %y, %a store float %m, float addrspace(1)* %out ret void } @@ -401,8 +401,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %a = fadd float %x, -1.0 - %m = fmul float %a, %y + %a = fadd nexc nrnd float %x, -1.0 + %m = fmul nexc nrnd float %a, %y store float %m, float addrspace(1)* %out ret void } @@ -414,8 +414,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %a = fadd float %x, -1.0 - %m = fmul float %y, %a + %a = fadd nexc nrnd float %x, -1.0 + %m = fmul nexc nrnd float %y, %a store float %m, float addrspace(1)* %out ret void } @@ -427,8 +427,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %s = fsub float 1.0, %x - %m = fmul float %s, %y + %s = fsub nexc nrnd float 1.0, %x + %m = fmul nexc nrnd float %s, %y store float %m, float addrspace(1)* %out ret void } @@ -440,8 +440,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %s = fsub float 1.0, %x - %m = fmul float %y, %s + %s = fsub nexc nrnd float 1.0, %x + %m = fmul nexc nrnd float %y, %s store float %m, float addrspace(1)* %out ret void } @@ -453,8 +453,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %s = fsub float -1.0, %x - %m = fmul float %s, %y + %s = fsub nexc nrnd float -1.0, %x + %m = fmul nexc nrnd float %s, %y store float %m, float addrspace(1)* %out ret void } @@ -466,8 +466,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %s = fsub float -1.0, %x - %m = fmul float %y, %s + %s = fsub nexc nrnd float -1.0, %x + %m = fmul nexc nrnd float %y, %s store float %m, float addrspace(1)* %out ret void } @@ -479,8 +479,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %s = fsub float %x, 1.0 - %m = fmul float %s, %y + %s = fsub nexc nrnd float %x, 1.0 + %m = fmul nexc nrnd float %s, %y store float %m, float addrspace(1)* %out ret void } @@ -492,8 +492,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %s = fsub float %x, 1.0 - %m = fmul float %y, %s + %s = fsub nexc nrnd float %x, 1.0 + %m = fmul nexc nrnd float %y, %s store float %m, float addrspace(1)* %out ret void } @@ -505,8 +505,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %s = fsub float %x, -1.0 - %m = fmul float %s, %y + %s = fsub nexc nrnd float %x, -1.0 + %m = fmul nexc nrnd float %s, %y store float %m, float addrspace(1)* %out ret void } @@ -518,8 +518,8 @@ float addrspace(1)* %in2) { %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 - %s = fsub float %x, -1.0 - %m = fmul float %y, %s + %s = fsub nexc nrnd float %x, -1.0 + %m = fmul nexc nrnd float %y, %s store float %m, float addrspace(1)* %out ret void } @@ -538,10 +538,10 @@ %x = load float, float addrspace(1)* %in1 %y = load float, float addrspace(1)* %in2 %t = load float, float addrspace(1)* %in3 - %t1 = fsub float 1.0, %t - %tx = fmul float %x, %t - %ty = fmul float %y, %t1 - %r = fadd float %tx, %ty + %t1 = fsub nexc nrnd float 1.0, %t + %tx = fmul nexc nrnd float %x, %t + %ty = fmul nexc nrnd float %y, %t1 + %r = fadd nexc nrnd float %tx, %ty store float %r, float addrspace(1)* %out ret void } @@ -556,10 +556,10 @@ %x = load double, double addrspace(1)* %in1 %y = load double, double addrspace(1)* %in2 %t = load double, double addrspace(1)* %in3 - %t1 = fsub double 1.0, %t - %tx = fmul double %x, %t - %ty = fmul double %y, %t1 - %r = fadd double %tx, %ty + %t1 = fsub nexc nrnd double 1.0, %t + %tx = fmul nexc nrnd double %x, %t + %ty = fmul nexc nrnd double %y, %t1 + %r = fadd nexc nrnd double %tx, %ty store double %r, double addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fmad.ll =================================================================== --- test/CodeGen/AMDGPU/fmad.ll +++ test/CodeGen/AMDGPU/fmad.ll @@ -6,8 +6,8 @@ %r0 = extractelement <4 x float> %reg0, i32 0 %r1 = extractelement <4 x float> %reg0, i32 1 %r2 = extractelement <4 x float> %reg0, i32 2 - %r3 = fmul float %r0, %r1 - %r4 = fadd float %r3, %r2 + %r3 = fmul nexc nrnd float %r0, %r1 + %r4 = fadd nexc nrnd float %r3, %r2 %vec = insertelement <4 x float> undef, float %r4, i32 0 call void @llvm.R600.store.swizzle(<4 x float> %vec, i32 0, i32 0) ret void Index: test/CodeGen/AMDGPU/fmul.ll =================================================================== --- test/CodeGen/AMDGPU/fmul.ll +++ test/CodeGen/AMDGPU/fmul.ll @@ -9,7 +9,7 @@ ; SI: v_mul_f32 define void @fmul_f32(float addrspace(1)* %out, float %a, float %b) { entry: - %0 = fmul float %a, %b + %0 = fmul nexc nrnd float %a, %b store float %0, float addrspace(1)* %out ret void } @@ -26,7 +26,7 @@ ; SI: v_mul_f32 define void @fmul_v2f32(<2 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b) { entry: - %0 = fmul <2 x float> %a, %b + %0 = fmul nexc nrnd <2 x float> %a, %b store <2 x float> %0, <2 x float> addrspace(1)* %out ret void } @@ -45,7 +45,7 @@ %b_ptr = getelementptr <4 x float>, <4 x float> addrspace(1)* %in, i32 1 %a = load <4 x float>, <4 x float> addrspace(1) * %in %b = load <4 x float>, <4 x float> addrspace(1) * %b_ptr - %result = fmul <4 x float> %a, %b + %result = fmul nexc nrnd <4 x float> %a, %b store <4 x float> %result, <4 x float> addrspace(1)* %out ret void } @@ -55,8 +55,8 @@ ; SI-NOT: v_mul_f32 ; SI: s_endpgm define void @test_mul_2_k(float addrspace(1)* %out, float %x) #0 { - %y = fmul float %x, 2.0 - %z = fmul float %y, 3.0 + %y = fmul nexc nrnd float %x, 2.0 + %z = fmul nexc nrnd float %y, 3.0 store float %z, float addrspace(1)* %out ret void } @@ -67,8 +67,8 @@ ; SI-NOT: v_mad_f32 ; SI: s_endpgm define void @test_mul_2_k_inv(float addrspace(1)* %out, float %x) #0 { - %y = fmul float %x, 3.0 - %z = fmul float %y, 2.0 + %y = fmul nexc nrnd float %x, 3.0 + %z = fmul nexc nrnd float %y, 2.0 store float %z, float addrspace(1)* %out ret void } @@ -81,10 +81,10 @@ ; SI: v_mul_f32 ; SI-NOT: v_mul_f32 define void @test_mul_twouse(float addrspace(1)* %out, float %x, float %y) #0 { - %a = fmul float %x, 5.0 - %b = fsub float -0.0, %a - %c = fmul float %b, %y - %d = fmul float %c, %a + %a = fmul nexc nrnd float %x, 5.0 + %b = fsub nexc nrnd float -0.0, %a + %c = fmul nexc nrnd float %b, %y + %d = fmul nexc nrnd float %c, %a store float %d, float addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fmul64.ll =================================================================== --- test/CodeGen/AMDGPU/fmul64.ll +++ test/CodeGen/AMDGPU/fmul64.ll @@ -7,7 +7,7 @@ double addrspace(1)* %in2) { %r0 = load double, double addrspace(1)* %in1 %r1 = load double, double addrspace(1)* %in2 - %r2 = fmul double %r0, %r1 + %r2 = fmul nexc nrnd double %r0, %r1 store double %r2, double addrspace(1)* %out ret void } @@ -19,7 +19,7 @@ <2 x double> addrspace(1)* %in2) { %r0 = load <2 x double>, <2 x double> addrspace(1)* %in1 %r1 = load <2 x double>, <2 x double> addrspace(1)* %in2 - %r2 = fmul <2 x double> %r0, %r1 + %r2 = fmul nexc nrnd <2 x double> %r0, %r1 store <2 x double> %r2, <2 x double> addrspace(1)* %out ret void } @@ -33,7 +33,7 @@ <4 x double> addrspace(1)* %in2) { %r0 = load <4 x double>, <4 x double> addrspace(1)* %in1 %r1 = load <4 x double>, <4 x double> addrspace(1)* %in2 - %r2 = fmul <4 x double> %r0, %r1 + %r2 = fmul nexc nrnd <4 x double> %r0, %r1 store <4 x double> %r2, <4 x double> addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fmuladd.ll =================================================================== --- test/CodeGen/AMDGPU/fmuladd.ll +++ test/CodeGen/AMDGPU/fmuladd.ll @@ -85,8 +85,8 @@ %r0 = load float, float addrspace(1)* %gep.0 %r1 = load float, float addrspace(1)* %gep.1 - %add.0 = fadd float %r0, %r0 - %add.1 = fadd float %add.0, %r1 + %add.0 = fadd nexc nrnd float %r0, %r0 + %add.1 = fadd nexc nrnd float %add.0, %r1 store float %add.1, float addrspace(1)* %out ret void } @@ -107,8 +107,8 @@ %r0 = load float, float addrspace(1)* %gep.0 %r1 = load float, float addrspace(1)* %gep.1 - %add.0 = fadd float %r0, %r0 - %add.1 = fadd float %r1, %add.0 + %add.0 = fadd nexc nrnd float %r0, %r0 + %add.1 = fadd nexc nrnd float %r1, %add.0 store float %add.1, float addrspace(1)* %out ret void } @@ -147,7 +147,7 @@ %r1 = load float, float addrspace(1)* %gep.0 %r2 = load float, float addrspace(1)* %gep.1 - %r1.fneg = fsub float -0.000000e+00, %r1 + %r1.fneg = fsub nexc nrnd float -0.000000e+00, %r1 %r3 = tail call float @llvm.fmuladd.f32(float -2.0, float %r1.fneg, float %r2) store float %r3, float addrspace(1)* %gep.out @@ -169,7 +169,7 @@ %r1 = load float, float addrspace(1)* %gep.0 %r2 = load float, float addrspace(1)* %gep.1 - %r1.fneg = fsub float -0.000000e+00, %r1 + %r1.fneg = fsub nexc nrnd float -0.000000e+00, %r1 %r3 = tail call float @llvm.fmuladd.f32(float 2.0, float %r1.fneg, float %r2) store float %r3, float addrspace(1)* %gep.out @@ -191,7 +191,7 @@ %r1 = load float, float addrspace(1)* %gep.0 %r2 = load float, float addrspace(1)* %gep.1 - %r2.fneg = fsub float -0.000000e+00, %r2 + %r2.fneg = fsub nexc nrnd float -0.000000e+00, %r2 %r3 = tail call float @llvm.fmuladd.f32(float 2.0, float %r1, float %r2.fneg) store float %r3, float addrspace(1)* %gep.out Index: test/CodeGen/AMDGPU/fneg-fabs.f64.ll =================================================================== --- test/CodeGen/AMDGPU/fneg-fabs.f64.ll +++ test/CodeGen/AMDGPU/fneg-fabs.f64.ll @@ -8,8 +8,8 @@ ; SI: v_add_f64 {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, -|v{{\[[0-9]+:[0-9]+\]}}| define void @fneg_fabs_fadd_f64(double addrspace(1)* %out, double %x, double %y) { %fabs = call double @llvm.fabs.f64(double %x) - %fsub = fsub double -0.000000e+00, %fabs - %fadd = fadd double %y, %fsub + %fsub = fsub nexc nrnd double -0.000000e+00, %fabs + %fadd = fadd nexc nrnd double %y, %fsub store double %fadd, double addrspace(1)* %out, align 8 ret void } @@ -18,8 +18,8 @@ %x = load double, double addrspace(1)* %xptr, align 8 %y = load double, double addrspace(1)* %xptr, align 8 %fabs = call double @llvm.fabs.f64(double %x) - %fsub = fsub double -0.000000e+00, %fabs - %fadd = fadd double %y, %fsub + %fsub = fsub nexc nrnd double -0.000000e+00, %fabs + %fadd = fadd nexc nrnd double %y, %fsub store double %fadd, double addrspace(1)* %out, align 8 ret void } @@ -28,8 +28,8 @@ ; SI: v_mul_f64 {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, -|{{v\[[0-9]+:[0-9]+\]}}| define void @fneg_fabs_fmul_f64(double addrspace(1)* %out, double %x, double %y) { %fabs = call double @llvm.fabs.f64(double %x) - %fsub = fsub double -0.000000e+00, %fabs - %fmul = fmul double %y, %fsub + %fsub = fsub nexc nrnd double -0.000000e+00, %fabs + %fmul = fmul nexc nrnd double %y, %fsub store double %fmul, double addrspace(1)* %out, align 8 ret void } @@ -38,7 +38,7 @@ define void @fneg_fabs_free_f64(double addrspace(1)* %out, i64 %in) { %bc = bitcast i64 %in to double %fabs = call double @llvm.fabs.f64(double %bc) - %fsub = fsub double -0.000000e+00, %fabs + %fsub = fsub nexc nrnd double -0.000000e+00, %fabs store double %fsub, double addrspace(1)* %out ret void } @@ -49,7 +49,7 @@ define void @fneg_fabs_fn_free_f64(double addrspace(1)* %out, i64 %in) { %bc = bitcast i64 %in to double %fabs = call double @fabs(double %bc) - %fsub = fsub double -0.000000e+00, %fabs + %fsub = fsub nexc nrnd double -0.000000e+00, %fabs store double %fsub, double addrspace(1)* %out ret void } @@ -63,7 +63,7 @@ ; SI: buffer_store_dwordx2 v{{\[}}[[LO_V]]:[[HI_V]]{{\]}} define void @fneg_fabs_f64(double addrspace(1)* %out, double %in) { %fabs = call double @llvm.fabs.f64(double %in) - %fsub = fsub double -0.000000e+00, %fabs + %fsub = fsub nexc nrnd double -0.000000e+00, %fabs store double %fsub, double addrspace(1)* %out, align 8 ret void } @@ -75,7 +75,7 @@ ; SI: v_or_b32_e32 v{{[0-9]+}}, s{{[0-9]+}}, [[IMMREG]] define void @fneg_fabs_v2f64(<2 x double> addrspace(1)* %out, <2 x double> %in) { %fabs = call <2 x double> @llvm.fabs.v2f64(<2 x double> %in) - %fsub = fsub <2 x double> , %fabs + %fsub = fsub nexc nrnd <2 x double> , %fabs store <2 x double> %fsub, <2 x double> addrspace(1)* %out ret void } @@ -89,7 +89,7 @@ ; SI: v_or_b32_e32 v{{[0-9]+}}, s{{[0-9]+}}, [[IMMREG]] define void @fneg_fabs_v4f64(<4 x double> addrspace(1)* %out, <4 x double> %in) { %fabs = call <4 x double> @llvm.fabs.v4f64(<4 x double> %in) - %fsub = fsub <4 x double> , %fabs + %fsub = fsub nexc nrnd <4 x double> , %fabs store <4 x double> %fsub, <4 x double> addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fneg-fabs.ll =================================================================== --- test/CodeGen/AMDGPU/fneg-fabs.ll +++ test/CodeGen/AMDGPU/fneg-fabs.ll @@ -7,8 +7,8 @@ ; SI: v_sub_f32_e64 {{v[0-9]+}}, {{s[0-9]+}}, |{{v[0-9]+}}| define void @fneg_fabs_fadd_f32(float addrspace(1)* %out, float %x, float %y) { %fabs = call float @llvm.fabs.f32(float %x) - %fsub = fsub float -0.000000e+00, %fabs - %fadd = fadd float %y, %fsub + %fsub = fsub nexc nrnd float -0.000000e+00, %fabs + %fadd = fadd nexc nrnd float %y, %fsub store float %fadd, float addrspace(1)* %out, align 4 ret void } @@ -19,8 +19,8 @@ ; SI-NOT: and define void @fneg_fabs_fmul_f32(float addrspace(1)* %out, float %x, float %y) { %fabs = call float @llvm.fabs.f32(float %x) - %fsub = fsub float -0.000000e+00, %fabs - %fmul = fmul float %y, %fsub + %fsub = fsub nexc nrnd float -0.000000e+00, %fabs + %fmul = fmul nexc nrnd float %y, %fsub store float %fmul, float addrspace(1)* %out, align 4 ret void } @@ -38,7 +38,7 @@ define void @fneg_fabs_free_f32(float addrspace(1)* %out, i32 %in) { %bc = bitcast i32 %in to float %fabs = call float @llvm.fabs.f32(float %bc) - %fsub = fsub float -0.000000e+00, %fabs + %fsub = fsub nexc nrnd float -0.000000e+00, %fabs store float %fsub, float addrspace(1)* %out ret void } @@ -52,7 +52,7 @@ define void @fneg_fabs_fn_free_f32(float addrspace(1)* %out, i32 %in) { %bc = bitcast i32 %in to float %fabs = call float @fabs(float %bc) - %fsub = fsub float -0.000000e+00, %fabs + %fsub = fsub nexc nrnd float -0.000000e+00, %fabs store float %fsub, float addrspace(1)* %out ret void } @@ -61,7 +61,7 @@ ; SI: s_or_b32 s{{[0-9]+}}, s{{[0-9]+}}, 0x80000000 define void @fneg_fabs_f32(float addrspace(1)* %out, float %in) { %fabs = call float @llvm.fabs.f32(float %in) - %fsub = fsub float -0.000000e+00, %fabs + %fsub = fsub nexc nrnd float -0.000000e+00, %fabs store float %fsub, float addrspace(1)* %out, align 4 ret void } @@ -71,7 +71,7 @@ define void @v_fneg_fabs_f32(float addrspace(1)* %out, float addrspace(1)* %in) { %val = load float, float addrspace(1)* %in, align 4 %fabs = call float @llvm.fabs.f32(float %val) - %fsub = fsub float -0.000000e+00, %fabs + %fsub = fsub nexc nrnd float -0.000000e+00, %fabs store float %fsub, float addrspace(1)* %out, align 4 ret void } @@ -86,7 +86,7 @@ ; SI: v_or_b32_e32 v{{[0-9]+}}, 0x80000000, v{{[0-9]+}} define void @fneg_fabs_v2f32(<2 x float> addrspace(1)* %out, <2 x float> %in) { %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %in) - %fsub = fsub <2 x float> , %fabs + %fsub = fsub nexc nrnd <2 x float> , %fabs store <2 x float> %fsub, <2 x float> addrspace(1)* %out ret void } @@ -98,7 +98,7 @@ ; SI: v_or_b32_e32 v{{[0-9]+}}, 0x80000000, v{{[0-9]+}} define void @fneg_fabs_v4f32(<4 x float> addrspace(1)* %out, <4 x float> %in) { %fabs = call <4 x float> @llvm.fabs.v4f32(<4 x float> %in) - %fsub = fsub <4 x float> , %fabs + %fsub = fsub nexc nrnd <4 x float> , %fabs store <4 x float> %fsub, <4 x float> addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fneg.f64.ll =================================================================== --- test/CodeGen/AMDGPU/fneg.f64.ll +++ test/CodeGen/AMDGPU/fneg.f64.ll @@ -4,7 +4,7 @@ ; FUNC-LABEL: {{^}}fneg_f64: ; GCN: v_xor_b32 define void @fneg_f64(double addrspace(1)* %out, double %in) { - %fneg = fsub double -0.000000e+00, %in + %fneg = fsub nexc nrnd double -0.000000e+00, %in store double %fneg, double addrspace(1)* %out ret void } @@ -13,7 +13,7 @@ ; GCN: v_xor_b32 ; GCN: v_xor_b32 define void @fneg_v2f64(<2 x double> addrspace(1)* nocapture %out, <2 x double> %in) { - %fneg = fsub <2 x double> , %in + %fneg = fsub nexc nrnd <2 x double> , %in store <2 x double> %fneg, <2 x double> addrspace(1)* %out ret void } @@ -29,7 +29,7 @@ ; GCN: v_xor_b32 ; GCN: v_xor_b32 define void @fneg_v4f64(<4 x double> addrspace(1)* nocapture %out, <4 x double> %in) { - %fneg = fsub <4 x double> , %in + %fneg = fsub nexc nrnd <4 x double> , %in store <4 x double> %fneg, <4 x double> addrspace(1)* %out ret void } @@ -42,7 +42,7 @@ ; GCN: v_add_f64 {{v\[[0-9]+:[0-9]+\]}}, 0, -{{s\[[0-9]+:[0-9]+\]$}} define void @fneg_free_f64(double addrspace(1)* %out, i64 %in) { %bc = bitcast i64 %in to double - %fsub = fsub double 0.0, %bc + %fsub = fsub nexc nrnd double 0.0, %bc store double %fsub, double addrspace(1)* %out ret void } @@ -53,8 +53,8 @@ ; GCN-NOT: xor ; GCN: v_mul_f64 {{v\[[0-9]+:[0-9]+\]}}, -[[NEG_VALUE]], [[NEG_VALUE]] define void @fneg_fold_f64(double addrspace(1)* %out, double %in) { - %fsub = fsub double -0.0, %in - %fmul = fmul double %fsub, %in + %fsub = fsub nexc nrnd double -0.0, %in + %fmul = fmul nexc nrnd double %fsub, %in store double %fmul, double addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/fneg.ll =================================================================== --- test/CodeGen/AMDGPU/fneg.ll +++ test/CodeGen/AMDGPU/fneg.ll @@ -7,7 +7,7 @@ ; GCN: v_xor_b32 define void @fneg_f32(float addrspace(1)* %out, float %in) { - %fneg = fsub float -0.000000e+00, %in + %fneg = fsub nexc nrnd float -0.000000e+00, %in store float %fneg, float addrspace(1)* %out ret void } @@ -19,7 +19,7 @@ ; GCN: v_xor_b32 ; GCN: v_xor_b32 define void @fneg_v2f32(<2 x float> addrspace(1)* nocapture %out, <2 x float> %in) { - %fneg = fsub <2 x float> , %in + %fneg = fsub nexc nrnd <2 x float> , %in store <2 x float> %fneg, <2 x float> addrspace(1)* %out ret void } @@ -35,7 +35,7 @@ ; GCN: v_xor_b32 ; GCN: v_xor_b32 define void @fneg_v4f32(<4 x float> addrspace(1)* nocapture %out, <4 x float> %in) { - %fneg = fsub <4 x float> , %in + %fneg = fsub nexc nrnd <4 x float> , %in store <4 x float> %fneg, <4 x float> addrspace(1)* %out ret void } @@ -52,7 +52,7 @@ ; GCN: v_sub_f32_e64 v{{[0-9]}}, 0, s{{[0-9]+$}} define void @fneg_free_f32(float addrspace(1)* %out, i32 %in) { %bc = bitcast i32 %in to float - %fsub = fsub float 0.0, %bc + %fsub = fsub nexc nrnd float 0.0, %bc store float %fsub, float addrspace(1)* %out ret void } @@ -63,8 +63,8 @@ ; GCN-NOT: xor ; GCN: v_mul_f32_e64 v{{[0-9]+}}, -[[NEG_VALUE]], [[NEG_VALUE]] define void @fneg_fold_f32(float addrspace(1)* %out, float %in) { - %fsub = fsub float -0.0, %in - %fmul = fmul float %fsub, %in + %fsub = fsub nexc nrnd float -0.0, %in + %fmul = fmul nexc nrnd float %fsub, %in store float %fmul, float addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/frem.ll =================================================================== --- test/CodeGen/AMDGPU/frem.ll +++ test/CodeGen/AMDGPU/frem.ll @@ -18,7 +18,7 @@ %gep2 = getelementptr float, float addrspace(1)* %in2, i32 4 %r0 = load float, float addrspace(1)* %in1, align 4 %r1 = load float, float addrspace(1)* %gep2, align 4 - %r2 = frem float %r0, %r1 + %r2 = frem nexc nrnd float %r0, %r1 store float %r2, float addrspace(1)* %out, align 4 ret void } @@ -37,7 +37,7 @@ %gep2 = getelementptr float, float addrspace(1)* %in2, i32 4 %r0 = load float, float addrspace(1)* %in1, align 4 %r1 = load float, float addrspace(1)* %gep2, align 4 - %r2 = frem float %r0, %r1 + %r2 = frem nexc nrnd float %r0, %r1 store float %r2, float addrspace(1)* %out, align 4 ret void } @@ -57,7 +57,7 @@ double addrspace(1)* %in2) #0 { %r0 = load double, double addrspace(1)* %in1, align 8 %r1 = load double, double addrspace(1)* %in2, align 8 - %r2 = frem double %r0, %r1 + %r2 = frem nexc nrnd double %r0, %r1 store double %r2, double addrspace(1)* %out, align 8 ret void } @@ -73,7 +73,7 @@ double addrspace(1)* %in2) #1 { %r0 = load double, double addrspace(1)* %in1, align 8 %r1 = load double, double addrspace(1)* %in2, align 8 - %r2 = frem double %r0, %r1 + %r2 = frem nexc nrnd double %r0, %r1 store double %r2, double addrspace(1)* %out, align 8 ret void } @@ -83,7 +83,7 @@ %gep2 = getelementptr <2 x float>, <2 x float> addrspace(1)* %in2, i32 4 %r0 = load <2 x float>, <2 x float> addrspace(1)* %in1, align 8 %r1 = load <2 x float>, <2 x float> addrspace(1)* %gep2, align 8 - %r2 = frem <2 x float> %r0, %r1 + %r2 = frem nexc nrnd <2 x float> %r0, %r1 store <2 x float> %r2, <2 x float> addrspace(1)* %out, align 8 ret void } @@ -93,7 +93,7 @@ %gep2 = getelementptr <4 x float>, <4 x float> addrspace(1)* %in2, i32 4 %r0 = load <4 x float>, <4 x float> addrspace(1)* %in1, align 16 %r1 = load <4 x float>, <4 x float> addrspace(1)* %gep2, align 16 - %r2 = frem <4 x float> %r0, %r1 + %r2 = frem nexc nrnd <4 x float> %r0, %r1 store <4 x float> %r2, <4 x float> addrspace(1)* %out, align 16 ret void } @@ -103,7 +103,7 @@ %gep2 = getelementptr <2 x double>, <2 x double> addrspace(1)* %in2, i32 4 %r0 = load <2 x double>, <2 x double> addrspace(1)* %in1, align 16 %r1 = load <2 x double>, <2 x double> addrspace(1)* %gep2, align 16 - %r2 = frem <2 x double> %r0, %r1 + %r2 = frem nexc nrnd <2 x double> %r0, %r1 store <2 x double> %r2, <2 x double> addrspace(1)* %out, align 16 ret void } Index: test/CodeGen/AMDGPU/fsub.ll =================================================================== --- test/CodeGen/AMDGPU/fsub.ll +++ test/CodeGen/AMDGPU/fsub.ll @@ -9,7 +9,7 @@ %b_ptr = getelementptr float, float addrspace(1)* %in, i32 1 %a = load float, float addrspace(1)* %in, align 4 %b = load float, float addrspace(1)* %b_ptr, align 4 - %result = fsub float %a, %b + %result = fsub nexc nrnd float %a, %b store float %result, float addrspace(1)* %out, align 4 ret void } @@ -19,7 +19,7 @@ ; SI: v_sub_f32_e32 {{v[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}} define void @s_fsub_f32(float addrspace(1)* %out, float %a, float %b) { - %sub = fsub float %a, %b + %sub = fsub nexc nrnd float %a, %b store float %sub, float addrspace(1)* %out, align 4 ret void } @@ -36,7 +36,7 @@ ; SI: v_subrev_f32_e32 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} ; SI: v_subrev_f32_e32 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} define void @fsub_v2f32(<2 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b) { - %sub = fsub <2 x float> %a, %b + %sub = fsub nexc nrnd <2 x float> %a, %b store <2 x float> %sub, <2 x float> addrspace(1)* %out, align 8 ret void } @@ -55,7 +55,7 @@ %b_ptr = getelementptr <4 x float>, <4 x float> addrspace(1)* %in, i32 1 %a = load <4 x float>, <4 x float> addrspace(1)* %in, align 16 %b = load <4 x float>, <4 x float> addrspace(1)* %b_ptr, align 16 - %result = fsub <4 x float> %a, %b + %result = fsub nexc nrnd <4 x float> %a, %b store <4 x float> %result, <4 x float> addrspace(1)* %out, align 16 ret void } @@ -69,7 +69,7 @@ ; SI: v_subrev_f32_e32 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} ; SI: s_endpgm define void @s_fsub_v4f32(<4 x float> addrspace(1)* %out, <4 x float> %a, <4 x float> %b) { - %result = fsub <4 x float> %a, %b + %result = fsub nexc nrnd <4 x float> %a, %b store <4 x float> %result, <4 x float> addrspace(1)* %out, align 16 ret void } Index: test/CodeGen/AMDGPU/fsub64.ll =================================================================== --- test/CodeGen/AMDGPU/fsub64.ll +++ test/CodeGen/AMDGPU/fsub64.ll @@ -9,7 +9,7 @@ double addrspace(1)* %in2) { %r0 = load double, double addrspace(1)* %in1 %r1 = load double, double addrspace(1)* %in2 - %r2 = fsub double %r0, %r1 + %r2 = fsub nexc nrnd double %r0, %r1 store double %r2, double addrspace(1)* %out ret void } @@ -21,7 +21,7 @@ %r0 = load double, double addrspace(1)* %in1 %r1 = load double, double addrspace(1)* %in2 %r1.fabs = call double @llvm.fabs.f64(double %r1) #0 - %r2 = fsub double %r0, %r1.fabs + %r2 = fsub nexc nrnd double %r0, %r1.fabs store double %r2, double addrspace(1)* %out ret void } @@ -33,7 +33,7 @@ %r0 = load double, double addrspace(1)* %in1 %r1 = load double, double addrspace(1)* %in2 %r0.fabs = call double @llvm.fabs.f64(double %r0) #0 - %r2 = fsub double %r0.fabs, %r1 + %r2 = fsub nexc nrnd double %r0.fabs, %r1 store double %r2, double addrspace(1)* %out ret void } @@ -41,7 +41,7 @@ ; SI-LABEL: {{^}}s_fsub_f64: ; SI: v_add_f64 {{v\[[0-9]+:[0-9]+\], s\[[0-9]+:[0-9]+\], -v\[[0-9]+:[0-9]+\]}} define void @s_fsub_f64(double addrspace(1)* %out, double %a, double %b) { - %sub = fsub double %a, %b + %sub = fsub nexc nrnd double %a, %b store double %sub, double addrspace(1)* %out ret void } @@ -49,7 +49,7 @@ ; SI-LABEL: {{^}}s_fsub_imm_f64: ; SI: v_add_f64 {{v\[[0-9]+:[0-9]+\], 4.0, -s\[[0-9]+:[0-9]+\]}} define void @s_fsub_imm_f64(double addrspace(1)* %out, double %a, double %b) { - %sub = fsub double 4.0, %a + %sub = fsub nexc nrnd double 4.0, %a store double %sub, double addrspace(1)* %out ret void } @@ -57,7 +57,7 @@ ; SI-LABEL: {{^}}s_fsub_imm_inv_f64: ; SI: v_add_f64 {{v\[[0-9]+:[0-9]+\], -4.0, s\[[0-9]+:[0-9]+\]}} define void @s_fsub_imm_inv_f64(double addrspace(1)* %out, double %a, double %b) { - %sub = fsub double %a, 4.0 + %sub = fsub nexc nrnd double %a, 4.0 store double %sub, double addrspace(1)* %out ret void } @@ -65,7 +65,7 @@ ; SI-LABEL: {{^}}s_fsub_self_f64: ; SI: v_add_f64 {{v\[[0-9]+:[0-9]+\], s\[[0-9]+:[0-9]+\], -s\[[0-9]+:[0-9]+\]}} define void @s_fsub_self_f64(double addrspace(1)* %out, double %a) { - %sub = fsub double %a, %a + %sub = fsub nexc nrnd double %a, %a store double %sub, double addrspace(1)* %out ret void } @@ -74,7 +74,7 @@ ; SI: v_add_f64 {{v\[[0-9]+:[0-9]+\], s\[[0-9]+:[0-9]+\], -v\[[0-9]+:[0-9]+\]}} ; SI: v_add_f64 {{v\[[0-9]+:[0-9]+\], s\[[0-9]+:[0-9]+\], -v\[[0-9]+:[0-9]+\]}} define void @fsub_v2f64(<2 x double> addrspace(1)* %out, <2 x double> %a, <2 x double> %b) { - %sub = fsub <2 x double> %a, %b + %sub = fsub nexc nrnd <2 x double> %a, %b store <2 x double> %sub, <2 x double> addrspace(1)* %out ret void } @@ -88,7 +88,7 @@ %b_ptr = getelementptr <4 x double>, <4 x double> addrspace(1)* %in, i32 1 %a = load <4 x double>, <4 x double> addrspace(1)* %in %b = load <4 x double>, <4 x double> addrspace(1)* %b_ptr - %result = fsub <4 x double> %a, %b + %result = fsub nexc nrnd <4 x double> %a, %b store <4 x double> %result, <4 x double> addrspace(1)* %out ret void } @@ -99,7 +99,7 @@ ; SI: v_add_f64 {{v\[[0-9]+:[0-9]+\], s\[[0-9]+:[0-9]+\], -v\[[0-9]+:[0-9]+\]}} ; SI: v_add_f64 {{v\[[0-9]+:[0-9]+\], s\[[0-9]+:[0-9]+\], -v\[[0-9]+:[0-9]+\]}} define void @s_fsub_v4f64(<4 x double> addrspace(1)* %out, <4 x double> %a, <4 x double> %b) { - %result = fsub <4 x double> %a, %b + %result = fsub nexc nrnd <4 x double> %a, %b store <4 x double> %result, <4 x double> addrspace(1)* %out, align 16 ret void } Index: test/CodeGen/AMDGPU/half.ll =================================================================== --- test/CodeGen/AMDGPU/half.ll +++ test/CodeGen/AMDGPU/half.ll @@ -584,7 +584,7 @@ ; SI: v_add_f32 ; GCN: s_endpgm define void @fadd_f16(half addrspace(1)* %out, half %a, half %b) #0 { - %add = fadd half %a, %b + %add = fadd nexc nrnd half %a, %b store half %add, half addrspace(1)* %out, align 4 ret void } @@ -594,7 +594,7 @@ ; SI: v_add_f32 ; GCN: s_endpgm define void @fadd_v2f16(<2 x half> addrspace(1)* %out, <2 x half> %a, <2 x half> %b) #0 { - %add = fadd <2 x half> %a, %b + %add = fadd nexc nrnd <2 x half> %a, %b store <2 x half> %add, <2 x half> addrspace(1)* %out, align 8 ret void } @@ -609,7 +609,7 @@ %b_ptr = getelementptr <4 x half>, <4 x half> addrspace(1)* %in, i32 1 %a = load <4 x half>, <4 x half> addrspace(1)* %in, align 16 %b = load <4 x half>, <4 x half> addrspace(1)* %b_ptr, align 16 - %result = fadd <4 x half> %a, %b + %result = fadd nexc nrnd <4 x half> %a, %b store <4 x half> %result, <4 x half> addrspace(1)* %out, align 16 ret void } @@ -625,7 +625,7 @@ ; SI: v_add_f32 ; GCN: s_endpgm define void @fadd_v8f16(<8 x half> addrspace(1)* %out, <8 x half> %a, <8 x half> %b) #0 { - %add = fadd <8 x half> %a, %b + %add = fadd nexc nrnd <8 x half> %a, %b store <8 x half> %add, <8 x half> addrspace(1)* %out, align 32 ret void } @@ -637,7 +637,7 @@ %b_ptr = getelementptr half, half addrspace(1)* %in, i32 1 %a = load half, half addrspace(1)* %in %b = load half, half addrspace(1)* %b_ptr - %sub = fsub half %a, %b + %sub = fsub nexc nrnd half %a, %b store half %sub, half addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/imm.ll =================================================================== --- test/CodeGen/AMDGPU/imm.ll +++ test/CodeGen/AMDGPU/imm.ll @@ -131,7 +131,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 0, [[VAL]]{{$}} ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_0.0_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 0.0 + %y = fadd nexc nrnd float %x, 0.0 store float %y, float addrspace(1)* %out ret void } @@ -141,7 +141,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 0.5, [[VAL]]{{$}} ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_0.5_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 0.5 + %y = fadd nexc nrnd float %x, 0.5 store float %y, float addrspace(1)* %out ret void } @@ -151,7 +151,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -0.5, [[VAL]]{{$}} ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_neg_0.5_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, -0.5 + %y = fadd nexc nrnd float %x, -0.5 store float %y, float addrspace(1)* %out ret void } @@ -161,7 +161,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 1.0, [[VAL]]{{$}} ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_1.0_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 1.0 + %y = fadd nexc nrnd float %x, 1.0 store float %y, float addrspace(1)* %out ret void } @@ -171,7 +171,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -1.0, [[VAL]]{{$}} ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_neg_1.0_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, -1.0 + %y = fadd nexc nrnd float %x, -1.0 store float %y, float addrspace(1)* %out ret void } @@ -181,7 +181,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 2.0, [[VAL]]{{$}} ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_2.0_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 2.0 + %y = fadd nexc nrnd float %x, 2.0 store float %y, float addrspace(1)* %out ret void } @@ -191,7 +191,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -2.0, [[VAL]]{{$}} ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_neg_2.0_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, -2.0 + %y = fadd nexc nrnd float %x, -2.0 store float %y, float addrspace(1)* %out ret void } @@ -201,7 +201,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 4.0, [[VAL]]{{$}} ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_4.0_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 4.0 + %y = fadd nexc nrnd float %x, 4.0 store float %y, float addrspace(1)* %out ret void } @@ -211,7 +211,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -4.0, [[VAL]]{{$}} ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_neg_4.0_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, -4.0 + %y = fadd nexc nrnd float %x, -4.0 store float %y, float addrspace(1)* %out ret void } @@ -222,7 +222,7 @@ ; CHECK: buffer_store_dword [[REG]] define void @commute_add_inline_imm_0.5_f32(float addrspace(1)* %out, float addrspace(1)* %in) { %x = load float, float addrspace(1)* %in - %y = fadd float %x, 0.5 + %y = fadd nexc nrnd float %x, 0.5 store float %y, float addrspace(1)* %out ret void } @@ -233,7 +233,7 @@ ; CHECK: buffer_store_dword [[REG]] define void @commute_add_literal_f32(float addrspace(1)* %out, float addrspace(1)* %in) { %x = load float, float addrspace(1)* %in - %y = fadd float %x, 1024.0 + %y = fadd nexc nrnd float %x, 1024.0 store float %y, float addrspace(1)* %out ret void } @@ -243,7 +243,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 1, [[VAL]]{{$}} ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_1_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 0x36a0000000000000 + %y = fadd nexc nrnd float %x, 0x36a0000000000000 store float %y, float addrspace(1)* %out ret void } @@ -253,7 +253,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 2, [[VAL]]{{$}} ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_2_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 0x36b0000000000000 + %y = fadd nexc nrnd float %x, 0x36b0000000000000 store float %y, float addrspace(1)* %out ret void } @@ -263,7 +263,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 16, [[VAL]] ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_16_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 0x36e0000000000000 + %y = fadd nexc nrnd float %x, 0x36e0000000000000 store float %y, float addrspace(1)* %out ret void } @@ -273,7 +273,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -1, [[VAL]] ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_neg_1_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 0xffffffffe0000000 + %y = fadd nexc nrnd float %x, 0xffffffffe0000000 store float %y, float addrspace(1)* %out ret void } @@ -283,7 +283,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -2, [[VAL]] ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_neg_2_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 0xffffffffc0000000 + %y = fadd nexc nrnd float %x, 0xffffffffc0000000 store float %y, float addrspace(1)* %out ret void } @@ -293,7 +293,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], -16, [[VAL]] ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_neg_16_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 0xfffffffe00000000 + %y = fadd nexc nrnd float %x, 0xfffffffe00000000 store float %y, float addrspace(1)* %out ret void } @@ -303,7 +303,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 63, [[VAL]] ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_63_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 0x36ff800000000000 + %y = fadd nexc nrnd float %x, 0x36ff800000000000 store float %y, float addrspace(1)* %out ret void } @@ -313,7 +313,7 @@ ; CHECK: v_add_f32_e64 [[REG:v[0-9]+]], 64, [[VAL]] ; CHECK: buffer_store_dword [[REG]] define void @add_inline_imm_64_f32(float addrspace(1)* %out, float %x) { - %y = fadd float %x, 0x3700000000000000 + %y = fadd nexc nrnd float %x, 0x3700000000000000 store float %y, float addrspace(1)* %out ret void } @@ -325,7 +325,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 0, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_0.0_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 0.0 + %y = fadd nexc nrnd double %x, 0.0 store double %y, double addrspace(1)* %out ret void } @@ -336,7 +336,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 0.5, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_0.5_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 0.5 + %y = fadd nexc nrnd double %x, 0.5 store double %y, double addrspace(1)* %out ret void } @@ -347,7 +347,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -0.5, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_neg_0.5_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, -0.5 + %y = fadd nexc nrnd double %x, -0.5 store double %y, double addrspace(1)* %out ret void } @@ -358,7 +358,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 1.0, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_1.0_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 1.0 + %y = fadd nexc nrnd double %x, 1.0 store double %y, double addrspace(1)* %out ret void } @@ -369,7 +369,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -1.0, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_neg_1.0_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, -1.0 + %y = fadd nexc nrnd double %x, -1.0 store double %y, double addrspace(1)* %out ret void } @@ -380,7 +380,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 2.0, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_2.0_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 2.0 + %y = fadd nexc nrnd double %x, 2.0 store double %y, double addrspace(1)* %out ret void } @@ -391,7 +391,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -2.0, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_neg_2.0_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, -2.0 + %y = fadd nexc nrnd double %x, -2.0 store double %y, double addrspace(1)* %out ret void } @@ -402,7 +402,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 4.0, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_4.0_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 4.0 + %y = fadd nexc nrnd double %x, 4.0 store double %y, double addrspace(1)* %out ret void } @@ -413,7 +413,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -4.0, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_neg_4.0_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, -4.0 + %y = fadd nexc nrnd double %x, -4.0 store double %y, double addrspace(1)* %out ret void } @@ -425,7 +425,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 1, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_1_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 0x0000000000000001 + %y = fadd nexc nrnd double %x, 0x0000000000000001 store double %y, double addrspace(1)* %out ret void } @@ -436,7 +436,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 2, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_2_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 0x0000000000000002 + %y = fadd nexc nrnd double %x, 0x0000000000000002 store double %y, double addrspace(1)* %out ret void } @@ -447,7 +447,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 16, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_16_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 0x0000000000000010 + %y = fadd nexc nrnd double %x, 0x0000000000000010 store double %y, double addrspace(1)* %out ret void } @@ -458,7 +458,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -1, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_neg_1_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 0xffffffffffffffff + %y = fadd nexc nrnd double %x, 0xffffffffffffffff store double %y, double addrspace(1)* %out ret void } @@ -469,7 +469,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -2, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_neg_2_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 0xfffffffffffffffe + %y = fadd nexc nrnd double %x, 0xfffffffffffffffe store double %y, double addrspace(1)* %out ret void } @@ -480,7 +480,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], -16, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_neg_16_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 0xfffffffffffffff0 + %y = fadd nexc nrnd double %x, 0xfffffffffffffff0 store double %y, double addrspace(1)* %out ret void } @@ -491,7 +491,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 63, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_63_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 0x000000000000003F + %y = fadd nexc nrnd double %x, 0x000000000000003F store double %y, double addrspace(1)* %out ret void } @@ -502,7 +502,7 @@ ; CHECK: v_add_f64 [[REG:v\[[0-9]+:[0-9]+\]]], 64, [[VAL]] ; CHECK: buffer_store_dwordx2 [[REG]] define void @add_inline_imm_64_f64(double addrspace(1)* %out, double %x) { - %y = fadd double %x, 0x0000000000000040 + %y = fadd nexc nrnd double %x, 0x0000000000000040 store double %y, double addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/jump-address.ll =================================================================== --- test/CodeGen/AMDGPU/jump-address.ll +++ test/CodeGen/AMDGPU/jump-address.ll @@ -42,8 +42,8 @@ IF13: ; preds = %ELSE %20 = load <4 x float>, <4 x float> addrspace(8)* null %21 = extractelement <4 x float> %20, i32 0 - %22 = fsub float -0.000000e+00, %21 - %23 = fadd float 0xFFF8000000000000, %22 + %22 = fsub nexc nrnd float -0.000000e+00, %21 + %23 = fadd nexc nrnd float 0xFFF8000000000000, %22 br label %ENDIF } Index: test/CodeGen/AMDGPU/literals.ll =================================================================== --- test/CodeGen/AMDGPU/literals.ll +++ test/CodeGen/AMDGPU/literals.ll @@ -29,7 +29,7 @@ ; CHECK-NEXT: 1084227584(5.0 define void @float_literal(float addrspace(1)* %out, float %in) { entry: - %0 = fadd float 5.0, %in + %0 = fadd nexc nrnd float 5.0, %in store float %0, float addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/llvm.AMDGPU.cube.ll =================================================================== --- test/CodeGen/AMDGPU/llvm.AMDGPU.cube.ll +++ test/CodeGen/AMDGPU/llvm.AMDGPU.cube.ll @@ -12,13 +12,13 @@ %1 = extractelement <4 x float> %0, i32 3 %2 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 9) %3 = extractelement <4 x float> %2, i32 0 - %4 = fdiv float %3, %1 + %4 = fdiv nexc nrnd float %3, %1 %5 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 9) %6 = extractelement <4 x float> %5, i32 1 - %7 = fdiv float %6, %1 + %7 = fdiv nexc nrnd float %6, %1 %8 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 9) %9 = extractelement <4 x float> %8, i32 2 - %10 = fdiv float %9, %1 + %10 = fdiv nexc nrnd float %9, %1 %11 = insertelement <4 x float> undef, float %4, i32 0 %12 = insertelement <4 x float> %11, float %7, i32 1 %13 = insertelement <4 x float> %12, float %10, i32 2 @@ -29,11 +29,11 @@ %18 = extractelement <4 x float> %15, i32 2 %19 = extractelement <4 x float> %15, i32 3 %20 = call float @fabs(float %18) - %21 = fdiv float 1.000000e+00, %20 - %22 = fmul float %16, %21 - %23 = fadd float %22, 1.500000e+00 - %24 = fmul float %17, %21 - %25 = fadd float %24, 1.500000e+00 + %21 = fdiv nexc nrnd float 1.000000e+00, %20 + %22 = fmul nexc nrnd float %16, %21 + %23 = fadd nexc nrnd float %22, 1.500000e+00 + %24 = fmul nexc nrnd float %17, %21 + %25 = fadd nexc nrnd float %24, 1.500000e+00 %26 = insertelement <4 x float> undef, float %25, i32 0 %27 = insertelement <4 x float> %26, float %23, i32 1 %28 = insertelement <4 x float> %27, float %19, i32 2 Index: test/CodeGen/AMDGPU/llvm.AMDGPU.fract.f64.ll =================================================================== --- test/CodeGen/AMDGPU/llvm.AMDGPU.fract.f64.ll +++ test/CodeGen/AMDGPU/llvm.AMDGPU.fract.f64.ll @@ -34,7 +34,7 @@ ; CI: buffer_store_dwordx2 [[FRC]] define void @fract_f64_neg(double addrspace(1)* %out, double addrspace(1)* %src) nounwind { %val = load double, double addrspace(1)* %src, align 4 - %neg = fsub double 0.0, %val + %neg = fsub nexc nrnd double 0.0, %val %fract = call double @llvm.AMDGPU.fract.f64(double %neg) nounwind readnone store double %fract, double addrspace(1)* %out, align 4 ret void @@ -53,7 +53,7 @@ define void @fract_f64_neg_abs(double addrspace(1)* %out, double addrspace(1)* %src) nounwind { %val = load double, double addrspace(1)* %src, align 4 %abs = call double @llvm.fabs.f64(double %val) - %neg = fsub double 0.0, %abs + %neg = fsub nexc nrnd double 0.0, %abs %fract = call double @llvm.AMDGPU.fract.f64(double %neg) nounwind readnone store double %fract, double addrspace(1)* %out, align 4 ret void Index: test/CodeGen/AMDGPU/llvm.AMDGPU.fract.ll =================================================================== --- test/CodeGen/AMDGPU/llvm.AMDGPU.fract.ll +++ test/CodeGen/AMDGPU/llvm.AMDGPU.fract.ll @@ -43,7 +43,7 @@ ; EG: FRACT define void @fract_f32_neg(float addrspace(1)* %out, float addrspace(1)* %src) nounwind { %val = load float, float addrspace(1)* %src, align 4 - %neg = fsub float 0.0, %val + %neg = fsub nexc nrnd float 0.0, %val %fract = call float @llvm.AMDGPU.fract.f32(float %neg) nounwind readnone store float %fract, float addrspace(1)* %out, align 4 ret void @@ -58,7 +58,7 @@ define void @fract_f32_neg_abs(float addrspace(1)* %out, float addrspace(1)* %src) nounwind { %val = load float, float addrspace(1)* %src, align 4 %abs = call float @llvm.fabs.f32(float %val) - %neg = fsub float 0.0, %abs + %neg = fsub nexc nrnd float 0.0, %abs %fract = call float @llvm.AMDGPU.fract.f32(float %neg) nounwind readnone store float %fract, float addrspace(1)* %out, align 4 ret void Index: test/CodeGen/AMDGPU/llvm.AMDGPU.rcp.f64.ll =================================================================== --- test/CodeGen/AMDGPU/llvm.AMDGPU.rcp.f64.ll +++ test/CodeGen/AMDGPU/llvm.AMDGPU.rcp.f64.ll @@ -15,7 +15,7 @@ ; FUNC-LABEL: {{^}}rcp_pat_f64: ; SI: v_rcp_f64_e32 define void @rcp_pat_f64(double addrspace(1)* %out, double %src) nounwind { - %rcp = fdiv double 1.0, %src + %rcp = fdiv nexc nrnd double 1.0, %src store double %rcp, double addrspace(1)* %out, align 8 ret void } Index: test/CodeGen/AMDGPU/llvm.AMDGPU.rcp.ll =================================================================== --- test/CodeGen/AMDGPU/llvm.AMDGPU.rcp.ll +++ test/CodeGen/AMDGPU/llvm.AMDGPU.rcp.ll @@ -31,7 +31,7 @@ ; EG: RECIP_IEEE define void @rcp_pat_f32(float addrspace(1)* %out, float %src) nounwind { - %rcp = fdiv float 1.0, %src + %rcp = fdiv nexc nrnd float 1.0, %src store float %rcp, float addrspace(1)* %out, align 4 ret void } Index: test/CodeGen/AMDGPU/llvm.SI.sample.ll =================================================================== --- test/CodeGen/AMDGPU/llvm.SI.sample.ll +++ test/CodeGen/AMDGPU/llvm.SI.sample.ll @@ -73,65 +73,65 @@ %e4 = extractelement <4 x float> %res4, i32 3 %t0 = extractelement <4 x float> %res5, i32 0 %t1 = extractelement <4 x float> %res5, i32 1 - %e5 = fadd float %t0, %t1 + %e5 = fadd nexc nrnd float %t0, %t1 %t2 = extractelement <4 x float> %res6, i32 0 %t3 = extractelement <4 x float> %res6, i32 2 - %e6 = fadd float %t2, %t3 + %e6 = fadd nexc nrnd float %t2, %t3 %t4 = extractelement <4 x float> %res7, i32 0 %t5 = extractelement <4 x float> %res7, i32 3 - %e7 = fadd float %t4, %t5 + %e7 = fadd nexc nrnd float %t4, %t5 %t6 = extractelement <4 x float> %res8, i32 1 %t7 = extractelement <4 x float> %res8, i32 2 - %e8 = fadd float %t6, %t7 + %e8 = fadd nexc nrnd float %t6, %t7 %t8 = extractelement <4 x float> %res9, i32 1 %t9 = extractelement <4 x float> %res9, i32 3 - %e9 = fadd float %t8, %t9 + %e9 = fadd nexc nrnd float %t8, %t9 %t10 = extractelement <4 x float> %res10, i32 2 %t11 = extractelement <4 x float> %res10, i32 3 - %e10 = fadd float %t10, %t11 + %e10 = fadd nexc nrnd float %t10, %t11 %t12 = extractelement <4 x float> %res11, i32 0 %t13 = extractelement <4 x float> %res11, i32 1 %t14 = extractelement <4 x float> %res11, i32 2 - %t15 = fadd float %t12, %t13 - %e11 = fadd float %t14, %t15 + %t15 = fadd nexc nrnd float %t12, %t13 + %e11 = fadd nexc nrnd float %t14, %t15 %t16 = extractelement <4 x float> %res12, i32 0 %t17 = extractelement <4 x float> %res12, i32 1 %t18 = extractelement <4 x float> %res12, i32 3 - %t19 = fadd float %t16, %t17 - %e12 = fadd float %t18, %t19 + %t19 = fadd nexc nrnd float %t16, %t17 + %e12 = fadd nexc nrnd float %t18, %t19 %t20 = extractelement <4 x float> %res13, i32 0 %t21 = extractelement <4 x float> %res13, i32 2 %t22 = extractelement <4 x float> %res13, i32 3 - %t23 = fadd float %t20, %t21 - %e13 = fadd float %t22, %t23 + %t23 = fadd nexc nrnd float %t20, %t21 + %e13 = fadd nexc nrnd float %t22, %t23 %t24 = extractelement <4 x float> %res14, i32 1 %t25 = extractelement <4 x float> %res14, i32 2 %t26 = extractelement <4 x float> %res14, i32 3 - %t27 = fadd float %t24, %t25 - %e14 = fadd float %t26, %t27 + %t27 = fadd nexc nrnd float %t24, %t25 + %e14 = fadd nexc nrnd float %t26, %t27 %t28 = extractelement <4 x float> %res15, i32 0 %t29 = extractelement <4 x float> %res15, i32 1 %t30 = extractelement <4 x float> %res15, i32 2 %t31 = extractelement <4 x float> %res15, i32 3 - %t32 = fadd float %t28, %t29 - %t33 = fadd float %t30, %t31 - %e15 = fadd float %t32, %t33 + %t32 = fadd nexc nrnd float %t28, %t29 + %t33 = fadd nexc nrnd float %t30, %t31 + %e15 = fadd nexc nrnd float %t32, %t33 %e16 = extractelement <4 x float> %res16, i32 3 - %s1 = fadd float %e1, %e2 - %s2 = fadd float %s1, %e3 - %s3 = fadd float %s2, %e4 - %s4 = fadd float %s3, %e5 - %s5 = fadd float %s4, %e6 - %s6 = fadd float %s5, %e7 - %s7 = fadd float %s6, %e8 - %s8 = fadd float %s7, %e9 - %s9 = fadd float %s8, %e10 - %s10 = fadd float %s9, %e11 - %s11 = fadd float %s10, %e12 - %s12 = fadd float %s11, %e13 - %s13 = fadd float %s12, %e14 - %s14 = fadd float %s13, %e15 - %s15 = fadd float %s14, %e16 + %s1 = fadd nexc nrnd float %e1, %e2 + %s2 = fadd nexc nrnd float %s1, %e3 + %s3 = fadd nexc nrnd float %s2, %e4 + %s4 = fadd nexc nrnd float %s3, %e5 + %s5 = fadd nexc nrnd float %s4, %e6 + %s6 = fadd nexc nrnd float %s5, %e7 + %s7 = fadd nexc nrnd float %s6, %e8 + %s8 = fadd nexc nrnd float %s7, %e9 + %s9 = fadd nexc nrnd float %s8, %e10 + %s10 = fadd nexc nrnd float %s9, %e11 + %s11 = fadd nexc nrnd float %s10, %e12 + %s12 = fadd nexc nrnd float %s11, %e13 + %s13 = fadd nexc nrnd float %s12, %e14 + %s14 = fadd nexc nrnd float %s13, %e15 + %s15 = fadd nexc nrnd float %s14, %e16 call void @llvm.SI.export(i32 15, i32 0, i32 1, i32 12, i32 0, float %s15, float %s15, float %s15, float %s15) ret void } Index: test/CodeGen/AMDGPU/llvm.SI.sampled.ll =================================================================== --- test/CodeGen/AMDGPU/llvm.SI.sampled.ll +++ test/CodeGen/AMDGPU/llvm.SI.sampled.ll @@ -73,65 +73,65 @@ %e4 = extractelement <4 x float> %res4, i32 3 %t0 = extractelement <4 x float> %res5, i32 0 %t1 = extractelement <4 x float> %res5, i32 1 - %e5 = fadd float %t0, %t1 + %e5 = fadd nexc nrnd float %t0, %t1 %t2 = extractelement <4 x float> %res6, i32 0 %t3 = extractelement <4 x float> %res6, i32 2 - %e6 = fadd float %t2, %t3 + %e6 = fadd nexc nrnd float %t2, %t3 %t4 = extractelement <4 x float> %res7, i32 0 %t5 = extractelement <4 x float> %res7, i32 3 - %e7 = fadd float %t4, %t5 + %e7 = fadd nexc nrnd float %t4, %t5 %t6 = extractelement <4 x float> %res8, i32 1 %t7 = extractelement <4 x float> %res8, i32 2 - %e8 = fadd float %t6, %t7 + %e8 = fadd nexc nrnd float %t6, %t7 %t8 = extractelement <4 x float> %res9, i32 1 %t9 = extractelement <4 x float> %res9, i32 3 - %e9 = fadd float %t8, %t9 + %e9 = fadd nexc nrnd float %t8, %t9 %t10 = extractelement <4 x float> %res10, i32 2 %t11 = extractelement <4 x float> %res10, i32 3 - %e10 = fadd float %t10, %t11 + %e10 = fadd nexc nrnd float %t10, %t11 %t12 = extractelement <4 x float> %res11, i32 0 %t13 = extractelement <4 x float> %res11, i32 1 %t14 = extractelement <4 x float> %res11, i32 2 - %t15 = fadd float %t12, %t13 - %e11 = fadd float %t14, %t15 + %t15 = fadd nexc nrnd float %t12, %t13 + %e11 = fadd nexc nrnd float %t14, %t15 %t16 = extractelement <4 x float> %res12, i32 0 %t17 = extractelement <4 x float> %res12, i32 1 %t18 = extractelement <4 x float> %res12, i32 3 - %t19 = fadd float %t16, %t17 - %e12 = fadd float %t18, %t19 + %t19 = fadd nexc nrnd float %t16, %t17 + %e12 = fadd nexc nrnd float %t18, %t19 %t20 = extractelement <4 x float> %res13, i32 0 %t21 = extractelement <4 x float> %res13, i32 2 %t22 = extractelement <4 x float> %res13, i32 3 - %t23 = fadd float %t20, %t21 - %e13 = fadd float %t22, %t23 + %t23 = fadd nexc nrnd float %t20, %t21 + %e13 = fadd nexc nrnd float %t22, %t23 %t24 = extractelement <4 x float> %res14, i32 1 %t25 = extractelement <4 x float> %res14, i32 2 %t26 = extractelement <4 x float> %res14, i32 3 - %t27 = fadd float %t24, %t25 - %e14 = fadd float %t26, %t27 + %t27 = fadd nexc nrnd float %t24, %t25 + %e14 = fadd nexc nrnd float %t26, %t27 %t28 = extractelement <4 x float> %res15, i32 0 %t29 = extractelement <4 x float> %res15, i32 1 %t30 = extractelement <4 x float> %res15, i32 2 %t31 = extractelement <4 x float> %res15, i32 3 - %t32 = fadd float %t28, %t29 - %t33 = fadd float %t30, %t31 - %e15 = fadd float %t32, %t33 + %t32 = fadd nexc nrnd float %t28, %t29 + %t33 = fadd nexc nrnd float %t30, %t31 + %e15 = fadd nexc nrnd float %t32, %t33 %e16 = extractelement <4 x float> %res16, i32 3 - %s1 = fadd float %e1, %e2 - %s2 = fadd float %s1, %e3 - %s3 = fadd float %s2, %e4 - %s4 = fadd float %s3, %e5 - %s5 = fadd float %s4, %e6 - %s6 = fadd float %s5, %e7 - %s7 = fadd float %s6, %e8 - %s8 = fadd float %s7, %e9 - %s9 = fadd float %s8, %e10 - %s10 = fadd float %s9, %e11 - %s11 = fadd float %s10, %e12 - %s12 = fadd float %s11, %e13 - %s13 = fadd float %s12, %e14 - %s14 = fadd float %s13, %e15 - %s15 = fadd float %s14, %e16 + %s1 = fadd nexc nrnd float %e1, %e2 + %s2 = fadd nexc nrnd float %s1, %e3 + %s3 = fadd nexc nrnd float %s2, %e4 + %s4 = fadd nexc nrnd float %s3, %e5 + %s5 = fadd nexc nrnd float %s4, %e6 + %s6 = fadd nexc nrnd float %s5, %e7 + %s7 = fadd nexc nrnd float %s6, %e8 + %s8 = fadd nexc nrnd float %s7, %e9 + %s9 = fadd nexc nrnd float %s8, %e10 + %s10 = fadd nexc nrnd float %s9, %e11 + %s11 = fadd nexc nrnd float %s10, %e12 + %s12 = fadd nexc nrnd float %s11, %e13 + %s13 = fadd nexc nrnd float %s12, %e14 + %s14 = fadd nexc nrnd float %s13, %e15 + %s15 = fadd nexc nrnd float %s14, %e16 call void @llvm.SI.export(i32 15, i32 0, i32 1, i32 12, i32 0, float %s15, float %s15, float %s15, float %s15) ret void } Index: test/CodeGen/AMDGPU/llvm.sin.ll =================================================================== --- test/CodeGen/AMDGPU/llvm.sin.ll +++ test/CodeGen/AMDGPU/llvm.sin.ll @@ -31,7 +31,7 @@ ; SI: v_sin_f32 ; SI-NOT: v_sin_f32 define void @sin_3x_f32(float addrspace(1)* %out, float %x) #1 { - %y = fmul float 3.0, %x + %y = fmul nexc nrnd float 3.0, %x %sin = call float @llvm.sin.f32(float %y) store float %sin, float addrspace(1)* %out ret void @@ -47,7 +47,7 @@ ; SI: v_sin_f32 ; SI-NOT: v_sin_f32 define void @sin_2x_f32(float addrspace(1)* %out, float %x) #1 { - %y = fmul float 2.0, %x + %y = fmul nexc nrnd float 2.0, %x %sin = call float @llvm.sin.f32(float %y) store float %sin, float addrspace(1)* %out ret void @@ -62,7 +62,7 @@ ; SI: v_sin_f32 ; SI-NOT: v_sin_f32 define void @test_2sin_f32(float addrspace(1)* %out, float %x) #1 { - %y = fmul float 2.0, %x + %y = fmul nexc nrnd float 2.0, %x %sin = call float @llvm.sin.f32(float %y) store float %sin, float addrspace(1)* %out ret void Index: test/CodeGen/AMDGPU/load-input-fold.ll =================================================================== --- test/CodeGen/AMDGPU/load-input-fold.ll +++ test/CodeGen/AMDGPU/load-input-fold.ll @@ -16,64 +16,64 @@ %11 = extractelement <4 x float> %reg3, i32 3 %12 = load <4 x float>, <4 x float> addrspace(8)* null %13 = extractelement <4 x float> %12, i32 0 - %14 = fmul float %0, %13 + %14 = fmul nexc nrnd float %0, %13 %15 = load <4 x float>, <4 x float> addrspace(8)* null %16 = extractelement <4 x float> %15, i32 1 - %17 = fmul float %0, %16 + %17 = fmul nexc nrnd float %0, %16 %18 = load <4 x float>, <4 x float> addrspace(8)* null %19 = extractelement <4 x float> %18, i32 2 - %20 = fmul float %0, %19 + %20 = fmul nexc nrnd float %0, %19 %21 = load <4 x float>, <4 x float> addrspace(8)* null %22 = extractelement <4 x float> %21, i32 3 - %23 = fmul float %0, %22 + %23 = fmul nexc nrnd float %0, %22 %24 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) %25 = extractelement <4 x float> %24, i32 0 - %26 = fmul float %1, %25 - %27 = fadd float %26, %14 + %26 = fmul nexc nrnd float %1, %25 + %27 = fadd nexc nrnd float %26, %14 %28 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) %29 = extractelement <4 x float> %28, i32 1 - %30 = fmul float %1, %29 - %31 = fadd float %30, %17 + %30 = fmul nexc nrnd float %1, %29 + %31 = fadd nexc nrnd float %30, %17 %32 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) %33 = extractelement <4 x float> %32, i32 2 - %34 = fmul float %1, %33 - %35 = fadd float %34, %20 + %34 = fmul nexc nrnd float %1, %33 + %35 = fadd nexc nrnd float %34, %20 %36 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) %37 = extractelement <4 x float> %36, i32 3 - %38 = fmul float %1, %37 - %39 = fadd float %38, %23 + %38 = fmul nexc nrnd float %1, %37 + %39 = fadd nexc nrnd float %38, %23 %40 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) %41 = extractelement <4 x float> %40, i32 0 - %42 = fmul float %2, %41 - %43 = fadd float %42, %27 + %42 = fmul nexc nrnd float %2, %41 + %43 = fadd nexc nrnd float %42, %27 %44 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) %45 = extractelement <4 x float> %44, i32 1 - %46 = fmul float %2, %45 - %47 = fadd float %46, %31 + %46 = fmul nexc nrnd float %2, %45 + %47 = fadd nexc nrnd float %46, %31 %48 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) %49 = extractelement <4 x float> %48, i32 2 - %50 = fmul float %2, %49 - %51 = fadd float %50, %35 + %50 = fmul nexc nrnd float %2, %49 + %51 = fadd nexc nrnd float %50, %35 %52 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) %53 = extractelement <4 x float> %52, i32 3 - %54 = fmul float %2, %53 - %55 = fadd float %54, %39 + %54 = fmul nexc nrnd float %2, %53 + %55 = fadd nexc nrnd float %54, %39 %56 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) %57 = extractelement <4 x float> %56, i32 0 - %58 = fmul float %3, %57 - %59 = fadd float %58, %43 + %58 = fmul nexc nrnd float %3, %57 + %59 = fadd nexc nrnd float %58, %43 %60 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) %61 = extractelement <4 x float> %60, i32 1 - %62 = fmul float %3, %61 - %63 = fadd float %62, %47 + %62 = fmul nexc nrnd float %3, %61 + %63 = fadd nexc nrnd float %62, %47 %64 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) %65 = extractelement <4 x float> %64, i32 2 - %66 = fmul float %3, %65 - %67 = fadd float %66, %51 + %66 = fmul nexc nrnd float %3, %65 + %67 = fadd nexc nrnd float %66, %51 %68 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) %69 = extractelement <4 x float> %68, i32 3 - %70 = fmul float %3, %69 - %71 = fadd float %70, %55 + %70 = fmul nexc nrnd float %3, %69 + %71 = fadd nexc nrnd float %70, %55 %72 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) %73 = extractelement <4 x float> %72, i32 0 %74 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) Index: test/CodeGen/AMDGPU/mad-combine.ll =================================================================== --- test/CodeGen/AMDGPU/mad-combine.ll +++ test/CodeGen/AMDGPU/mad-combine.ll @@ -42,8 +42,8 @@ %b = load float, float addrspace(1)* %gep.1 %c = load float, float addrspace(1)* %gep.2 - %mul = fmul float %a, %b - %fma = fadd float %mul, %c + %mul = fmul nexc nrnd float %a, %b + %fma = fadd nexc nrnd float %mul, %c store float %fma, float addrspace(1)* %gep.out ret void } @@ -84,9 +84,9 @@ %c = load float, float addrspace(1)* %gep.2 %d = load float, float addrspace(1)* %gep.3 - %mul = fmul float %a, %b - %fma0 = fadd float %mul, %c - %fma1 = fadd float %mul, %d + %mul = fmul nexc nrnd float %a, %b + %fma0 = fadd nexc nrnd float %mul, %c + %fma1 = fadd nexc nrnd float %mul, %d store float %fma0, float addrspace(1)* %gep.out.0 store float %fma1, float addrspace(1)* %gep.out.1 @@ -118,8 +118,8 @@ %b = load float, float addrspace(1)* %gep.1 %c = load float, float addrspace(1)* %gep.2 - %mul = fmul float %a, %b - %fma = fadd float %c, %mul + %mul = fmul nexc nrnd float %a, %b + %fma = fadd nexc nrnd float %c, %mul store float %fma, float addrspace(1)* %gep.out ret void } @@ -148,8 +148,8 @@ %b = load float, float addrspace(1)* %gep.1 %c = load float, float addrspace(1)* %gep.2 - %mul = fmul float %a, %b - %fma = fsub float %mul, %c + %mul = fmul nexc nrnd float %a, %b + %fma = fsub nexc nrnd float %mul, %c store float %fma, float addrspace(1)* %gep.out ret void } @@ -188,9 +188,9 @@ %c = load float, float addrspace(1)* %gep.2 %d = load float, float addrspace(1)* %gep.3 - %mul = fmul float %a, %b - %fma0 = fsub float %mul, %c - %fma1 = fsub float %mul, %d + %mul = fmul nexc nrnd float %a, %b + %fma0 = fsub nexc nrnd float %mul, %c + %fma1 = fsub nexc nrnd float %mul, %d store float %fma0, float addrspace(1)* %gep.out.0 store float %fma1, float addrspace(1)* %gep.out.1 ret void @@ -220,8 +220,8 @@ %b = load float, float addrspace(1)* %gep.1 %c = load float, float addrspace(1)* %gep.2 - %mul = fmul float %a, %b - %fma = fsub float %c, %mul + %mul = fmul nexc nrnd float %a, %b + %fma = fsub nexc nrnd float %c, %mul store float %fma, float addrspace(1)* %gep.out ret void } @@ -259,9 +259,9 @@ %c = load float, float addrspace(1)* %gep.2 %d = load float, float addrspace(1)* %gep.3 - %mul = fmul float %a, %b - %fma0 = fsub float %c, %mul - %fma1 = fsub float %d, %mul + %mul = fmul nexc nrnd float %a, %b + %fma0 = fsub nexc nrnd float %c, %mul + %fma1 = fsub nexc nrnd float %d, %mul store float %fma0, float addrspace(1)* %gep.out.0 store float %fma1, float addrspace(1)* %gep.out.1 ret void @@ -292,9 +292,9 @@ %b = load float, float addrspace(1)* %gep.1 %c = load float, float addrspace(1)* %gep.2 - %mul = fmul float %a, %b - %mul.neg = fsub float -0.0, %mul - %fma = fsub float %mul.neg, %c + %mul = fmul nexc nrnd float %a, %b + %mul.neg = fsub nexc nrnd float -0.0, %mul + %fma = fsub nexc nrnd float %mul.neg, %c store float %fma, float addrspace(1)* %gep.out ret void @@ -333,10 +333,10 @@ %c = load float, float addrspace(1)* %gep.2 %d = load float, float addrspace(1)* %gep.3 - %mul = fmul float %a, %b - %mul.neg = fsub float -0.0, %mul - %fma0 = fsub float %mul.neg, %c - %fma1 = fsub float %mul.neg, %d + %mul = fmul nexc nrnd float %a, %b + %mul.neg = fsub nexc nrnd float -0.0, %mul + %fma0 = fsub nexc nrnd float %mul.neg, %c + %fma1 = fsub nexc nrnd float %mul.neg, %d store float %fma0, float addrspace(1)* %gep.out.0 store float %fma1, float addrspace(1)* %gep.out.1 @@ -376,10 +376,10 @@ %c = load float, float addrspace(1)* %gep.2 %d = load float, float addrspace(1)* %gep.3 - %mul = fmul float %a, %b - %mul.neg = fsub float -0.0, %mul - %fma0 = fsub float %mul.neg, %c - %fma1 = fsub float %mul, %d + %mul = fmul nexc nrnd float %a, %b + %mul.neg = fsub nexc nrnd float -0.0, %mul + %fma0 = fsub nexc nrnd float %mul.neg, %c + %fma1 = fsub nexc nrnd float %mul, %d store float %fma0, float addrspace(1)* %gep.out.0 store float %fma1, float addrspace(1)* %gep.out.1 @@ -422,9 +422,9 @@ %u = load float, float addrspace(1)* %gep.3 %v = load float, float addrspace(1)* %gep.4 - %tmp0 = fmul float %u, %v + %tmp0 = fmul nexc nrnd float %u, %v %tmp1 = call float @llvm.fma.f32(float %x, float %y, float %tmp0) #0 - %tmp2 = fsub float %tmp1, %z + %tmp2 = fsub nexc nrnd float %tmp1, %z store float %tmp2, float addrspace(1)* %gep.out ret void @@ -468,9 +468,9 @@ %u = load float, float addrspace(1)* %gep.3 %v = load float, float addrspace(1)* %gep.4 - %tmp0 = fmul float %u, %v + %tmp0 = fmul nexc nrnd float %u, %v %tmp1 = call float @llvm.fma.f32(float %y, float %z, float %tmp0) #0 - %tmp2 = fsub float %x, %tmp1 + %tmp2 = fsub nexc nrnd float %x, %tmp1 store float %tmp2, float addrspace(1)* %gep.out ret void @@ -514,9 +514,9 @@ %u = load float, float addrspace(1)* %gep.3 %v = load float, float addrspace(1)* %gep.4 - %tmp0 = fmul float %u, %v + %tmp0 = fmul nexc nrnd float %u, %v %tmp1 = call float @llvm.fmuladd.f32(float %x, float %y, float %tmp0) #0 - %tmp2 = fsub float %tmp1, %z + %tmp2 = fsub nexc nrnd float %tmp1, %z store float %tmp2, float addrspace(1)* %gep.out ret void @@ -560,9 +560,9 @@ %u = load float, float addrspace(1)* %gep.3 %v = load float, float addrspace(1)* %gep.4 - %tmp0 = fmul float %u, %v + %tmp0 = fmul nexc nrnd float %u, %v %tmp1 = call float @llvm.fmuladd.f32(float %y, float %z, float %tmp0) #0 - %tmp2 = fsub float %x, %tmp1 + %tmp2 = fsub nexc nrnd float %x, %tmp1 store float %tmp2, float addrspace(1)* %gep.out ret void Index: test/CodeGen/AMDGPU/mad-sub.ll =================================================================== --- test/CodeGen/AMDGPU/mad-sub.ll +++ test/CodeGen/AMDGPU/mad-sub.ll @@ -21,8 +21,8 @@ %a = load float, float addrspace(1)* %gep0, align 4 %b = load float, float addrspace(1)* %gep1, align 4 %c = load float, float addrspace(1)* %gep2, align 4 - %mul = fmul float %a, %b - %sub = fsub float %mul, %c + %mul = fmul nexc nrnd float %a, %b + %sub = fsub nexc nrnd float %mul, %c store float %sub, float addrspace(1)* %outgep, align 4 ret void } @@ -45,8 +45,8 @@ %a = load float, float addrspace(1)* %gep0, align 4 %b = load float, float addrspace(1)* %gep1, align 4 %c = load float, float addrspace(1)* %gep2, align 4 - %mul = fmul float %a, %b - %sub = fsub float %c, %mul + %mul = fmul nexc nrnd float %a, %b + %sub = fsub nexc nrnd float %c, %mul store float %sub, float addrspace(1)* %outgep, align 4 ret void } @@ -66,8 +66,8 @@ %a = load double, double addrspace(1)* %gep0, align 8 %b = load double, double addrspace(1)* %gep1, align 8 %c = load double, double addrspace(1)* %gep2, align 8 - %mul = fmul double %a, %b - %sub = fsub double %mul, %c + %mul = fmul nexc nrnd double %a, %b + %sub = fsub nexc nrnd double %mul, %c store double %sub, double addrspace(1)* %outgep, align 8 ret void } @@ -91,8 +91,8 @@ %b = load float, float addrspace(1)* %gep1, align 4 %c = load float, float addrspace(1)* %gep2, align 4 %c.abs = call float @llvm.fabs.f32(float %c) #0 - %mul = fmul float %a, %b - %sub = fsub float %mul, %c.abs + %mul = fmul nexc nrnd float %a, %b + %sub = fsub nexc nrnd float %mul, %c.abs store float %sub, float addrspace(1)* %outgep, align 4 ret void } @@ -116,8 +116,8 @@ %b = load float, float addrspace(1)* %gep1, align 4 %c = load float, float addrspace(1)* %gep2, align 4 %c.abs = call float @llvm.fabs.f32(float %c) #0 - %mul = fmul float %a, %b - %sub = fsub float %c.abs, %mul + %mul = fmul nexc nrnd float %a, %b + %sub = fsub nexc nrnd float %c.abs, %mul store float %sub, float addrspace(1)* %outgep, align 4 ret void } @@ -136,10 +136,10 @@ %a = load float, float addrspace(1)* %gep0, align 4 %b = load float, float addrspace(1)* %gep1, align 4 %c = load float, float addrspace(1)* %gep2, align 4 - %nega = fsub float -0.000000e+00, %a - %negb = fsub float -0.000000e+00, %b - %mul = fmul float %nega, %negb - %sub = fadd float %mul, %c + %nega = fsub nexc nrnd float -0.000000e+00, %a + %negb = fsub nexc nrnd float -0.000000e+00, %b + %mul = fmul nexc nrnd float %nega, %negb + %sub = fadd nexc nrnd float %mul, %c store float %sub, float addrspace(1)* %outgep, align 4 ret void } @@ -163,8 +163,8 @@ %b = load float, float addrspace(1)* %gep1, align 4 %c = load float, float addrspace(1)* %gep2, align 4 %b.abs = call float @llvm.fabs.f32(float %b) #0 - %mul = fmul float %a, %b.abs - %sub = fsub float %mul, %c + %mul = fmul nexc nrnd float %a, %b.abs + %sub = fsub nexc nrnd float %mul, %c store float %sub, float addrspace(1)* %outgep, align 4 ret void } @@ -183,8 +183,8 @@ %r1 = load float, float addrspace(1)* %gep.0 %r2 = load float, float addrspace(1)* %gep.1 - %add = fadd float %r1, %r1 - %r3 = fsub float %r2, %add + %add = fadd nexc nrnd float %r1, %r1 + %r3 = fsub nexc nrnd float %r2, %add store float %r3, float addrspace(1)* %gep.out ret void @@ -204,8 +204,8 @@ %r1 = load float, float addrspace(1)* %gep.0 %r2 = load float, float addrspace(1)* %gep.1 - %add = fadd float %r1, %r1 - %r3 = fsub float %add, %r2 + %add = fadd nexc nrnd float %r1, %r1 + %r3 = fsub nexc nrnd float %add, %r2 store float %r3, float addrspace(1)* %gep.out ret void Index: test/CodeGen/AMDGPU/madak.ll =================================================================== --- test/CodeGen/AMDGPU/madak.ll +++ test/CodeGen/AMDGPU/madak.ll @@ -19,8 +19,8 @@ %a = load float, float addrspace(1)* %in.a.gep, align 4 %b = load float, float addrspace(1)* %in.b.gep, align 4 - %mul = fmul float %a, %b - %madak = fadd float %mul, 10.0 + %mul = fmul nexc nrnd float %a, %b + %madak = fadd nexc nrnd float %mul, 10.0 store float %madak, float addrspace(1)* %out.gep, align 4 ret void } @@ -51,10 +51,10 @@ %b = load float, float addrspace(1)* %in.gep.1, align 4 %c = load float, float addrspace(1)* %in.gep.2, align 4 - %mul0 = fmul float %a, %b - %mul1 = fmul float %a, %c - %madak0 = fadd float %mul0, 10.0 - %madak1 = fadd float %mul1, 10.0 + %mul0 = fmul nexc nrnd float %a, %b + %mul1 = fmul nexc nrnd float %a, %c + %madak0 = fadd nexc nrnd float %mul0, 10.0 + %madak1 = fadd nexc nrnd float %mul1, 10.0 store float %madak0, float addrspace(1)* %out.gep.0, align 4 store float %madak1, float addrspace(1)* %out.gep.1, align 4 @@ -71,8 +71,8 @@ %a = load float, float addrspace(1)* %in.a.gep, align 4 - %mul = fmul float 4.0, %a - %madak = fadd float %mul, 10.0 + %mul = fmul nexc nrnd float 4.0, %a + %madak = fadd nexc nrnd float %mul, 10.0 store float %madak, float addrspace(1)* %out.gep, align 4 ret void } @@ -93,8 +93,8 @@ %a = load float, float addrspace(1)* %in.a.gep, align 4 %b = load float, float addrspace(1)* %in.b.gep, align 4 - %mul = fmul float %a, %b - %madak = fadd float %mul, 4.0 + %mul = fmul nexc nrnd float %a, %b + %madak = fadd nexc nrnd float %mul, 4.0 store float %madak, float addrspace(1)* %out.gep, align 4 ret void } @@ -113,8 +113,8 @@ %a = load float, float addrspace(1)* %in.a.gep, align 4 - %mul = fmul float %a, %b - %madak = fadd float %mul, 10.0 + %mul = fmul nexc nrnd float %a, %b + %madak = fadd nexc nrnd float %mul, 10.0 store float %madak, float addrspace(1)* %out.gep, align 4 ret void } @@ -132,8 +132,8 @@ %b = load float, float addrspace(1)* %in.b.gep, align 4 - %mul = fmul float %a, %b - %madak = fadd float %mul, 10.0 + %mul = fmul nexc nrnd float %a, %b + %madak = fadd nexc nrnd float %mul, 10.0 store float %madak, float addrspace(1)* %out.gep, align 4 ret void } @@ -142,8 +142,8 @@ ; GCN-NOT: v_madak_f32 ; GCN: v_mac_f32_e32 {{v[0-9]+}}, {{s[0-9]+}}, {{v[0-9]+}} define void @s_s_madak_f32(float addrspace(1)* %out, float %a, float %b) nounwind { - %mul = fmul float %a, %b - %madak = fadd float %mul, 10.0 + %mul = fmul nexc nrnd float %a, %b + %madak = fadd nexc nrnd float %mul, 10.0 store float %madak, float addrspace(1)* %out, align 4 ret void } @@ -164,8 +164,8 @@ %a.fabs = call float @llvm.fabs.f32(float %a) nounwind readnone - %mul = fmul float %a.fabs, %b - %madak = fadd float %mul, 10.0 + %mul = fmul nexc nrnd float %a.fabs, %b + %madak = fadd nexc nrnd float %mul, 10.0 store float %madak, float addrspace(1)* %out.gep, align 4 ret void } @@ -186,8 +186,8 @@ %b.fabs = call float @llvm.fabs.f32(float %b) nounwind readnone - %mul = fmul float %a, %b.fabs - %madak = fadd float %mul, 10.0 + %mul = fmul nexc nrnd float %a, %b.fabs + %madak = fadd nexc nrnd float %mul, 10.0 store float %madak, float addrspace(1)* %out.gep, align 4 ret void } Index: test/CodeGen/AMDGPU/madmk.ll =================================================================== --- test/CodeGen/AMDGPU/madmk.ll +++ test/CodeGen/AMDGPU/madmk.ll @@ -17,8 +17,8 @@ %a = load float, float addrspace(1)* %gep.0, align 4 %b = load float, float addrspace(1)* %gep.1, align 4 - %mul = fmul float %a, 10.0 - %madmk = fadd float %mul, %b + %mul = fmul nexc nrnd float %a, 10.0 + %madmk = fadd nexc nrnd float %mul, %b store float %madmk, float addrspace(1)* %out.gep, align 4 ret void } @@ -45,10 +45,10 @@ %b = load float, float addrspace(1)* %in.gep.1, align 4 %c = load float, float addrspace(1)* %in.gep.2, align 4 - %mul0 = fmul float %a, 10.0 - %mul1 = fmul float %a, 10.0 - %madmk0 = fadd float %mul0, %b - %madmk1 = fadd float %mul1, %c + %mul0 = fmul nexc nrnd float %a, 10.0 + %mul1 = fmul nexc nrnd float %a, 10.0 + %madmk0 = fadd nexc nrnd float %mul0, %b + %madmk1 = fadd nexc nrnd float %mul1, %c store float %madmk0, float addrspace(1)* %out.gep.0, align 4 store float %madmk1, float addrspace(1)* %out.gep.1, align 4 @@ -69,8 +69,8 @@ %a = load float, float addrspace(1)* %gep.0, align 4 %b = load float, float addrspace(1)* %gep.1, align 4 - %mul = fmul float %a, 4.0 - %madmk = fadd float %mul, %b + %mul = fmul nexc nrnd float %a, 4.0 + %madmk = fadd nexc nrnd float %mul, %b store float %madmk, float addrspace(1)* %out.gep, align 4 ret void } @@ -83,8 +83,8 @@ %tid = tail call i32 @llvm.r600.read.tidig.x() nounwind readnone %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid - %mul = fmul float %a, 10.0 - %madmk = fadd float %mul, %b + %mul = fmul nexc nrnd float %a, 10.0 + %madmk = fadd nexc nrnd float %mul, %b store float %madmk, float addrspace(1)* %out.gep, align 4 ret void } @@ -99,8 +99,8 @@ %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid %a = load float, float addrspace(1)* %gep.0, align 4 - %mul = fmul float %a, 10.0 - %madmk = fadd float %mul, %b + %mul = fmul nexc nrnd float %a, 10.0 + %madmk = fadd nexc nrnd float %mul, %b store float %madmk, float addrspace(1)* %out.gep, align 4 ret void } @@ -115,8 +115,8 @@ %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid %b = load float, float addrspace(1)* %gep.0, align 4 - %mul = fmul float %a, 10.0 - %madmk = fadd float %mul, %b + %mul = fmul nexc nrnd float %a, 10.0 + %madmk = fadd nexc nrnd float %mul, %b store float %madmk, float addrspace(1)* %out.gep, align 4 ret void } @@ -136,8 +136,8 @@ %a.fabs = call float @llvm.fabs.f32(float %a) nounwind readnone - %mul = fmul float %a.fabs, 10.0 - %madmk = fadd float %mul, %b + %mul = fmul nexc nrnd float %a.fabs, 10.0 + %madmk = fadd nexc nrnd float %mul, %b store float %madmk, float addrspace(1)* %out.gep, align 4 ret void } @@ -157,8 +157,8 @@ %b.fabs = call float @llvm.fabs.f32(float %b) nounwind readnone - %mul = fmul float %a, 10.0 - %madmk = fadd float %mul, %b.fabs + %mul = fmul nexc nrnd float %a, 10.0 + %madmk = fadd nexc nrnd float %mul, %b.fabs store float %madmk, float addrspace(1)* %out.gep, align 4 ret void } @@ -174,8 +174,8 @@ %a = load float, float addrspace(1)* %gep.0, align 4 - %mul = fmul float %a, 10.0 - %madmk = fadd float %mul, 2.0 + %mul = fmul nexc nrnd float %a, 10.0 + %madmk = fadd nexc nrnd float %mul, 2.0 store float %madmk, float addrspace(1)* %out.gep, align 4 ret void } @@ -193,13 +193,13 @@ bb2: ; preds = %bb6, %bb %tmp = phi float [ undef, %bb ], [ %tmp8, %bb6 ] - %tmp3 = fsub float undef, %tmp + %tmp3 = fsub nexc nrnd float undef, %tmp %tmp5 = fcmp oeq float %tmp3, 1.000000e+04 br i1 %tmp5, label %bb1, label %bb6 bb6: ; preds = %bb2 - %tmp4 = fmul float %tmp, undef - %tmp7 = fmul float %tmp4, 0x40E55DD180000000 - %tmp8 = fadd float %tmp7, undef + %tmp4 = fmul nexc nrnd float %tmp, undef + %tmp7 = fmul nexc nrnd float %tmp4, 0x40E55DD180000000 + %tmp8 = fadd nexc nrnd float %tmp7, undef br label %bb2 } Index: test/CodeGen/AMDGPU/max-literals.ll =================================================================== --- test/CodeGen/AMDGPU/max-literals.ll +++ test/CodeGen/AMDGPU/max-literals.ll @@ -10,10 +10,10 @@ %2 = extractelement <4 x float> %reg1, i32 2 %3 = extractelement <4 x float> %reg1, i32 3 %4 = extractelement <4 x float> %reg2, i32 0 - %5 = fadd float %0, 2.0 - %6 = fadd float %1, 3.0 - %7 = fadd float %2, 4.0 - %8 = fadd float %3, 5.0 + %5 = fadd nexc nrnd float %0, 2.0 + %6 = fadd nexc nrnd float %1, 3.0 + %7 = fadd nexc nrnd float %2, 4.0 + %8 = fadd nexc nrnd float %3, 5.0 %9 = bitcast float %4 to i32 %10 = mul i32 %9, 6 %11 = bitcast i32 %10 to float @@ -39,10 +39,10 @@ %2 = extractelement <4 x float> %reg1, i32 2 %3 = extractelement <4 x float> %reg1, i32 3 %4 = extractelement <4 x float> %reg2, i32 0 - %5 = fadd float %0, 2.0 - %6 = fadd float %1, 3.0 - %7 = fadd float %2, 4.0 - %8 = fadd float %3, 2.0 + %5 = fadd nexc nrnd float %0, 2.0 + %6 = fadd nexc nrnd float %1, 3.0 + %7 = fadd nexc nrnd float %2, 4.0 + %8 = fadd nexc nrnd float %3, 2.0 %9 = bitcast float %4 to i32 %10 = mul i32 %9, 6 %11 = bitcast i32 %10 to float Index: test/CodeGen/AMDGPU/merge-stores.ll =================================================================== --- test/CodeGen/AMDGPU/merge-stores.ll +++ test/CodeGen/AMDGPU/merge-stores.ll @@ -683,7 +683,7 @@ ; GCN: ScratchSize: 0{{$}} define void @copy_v3f32_align4(<3 x float> addrspace(1)* noalias %out, <3 x float> addrspace(1)* noalias %in) #0 { %vec = load <3 x float>, <3 x float> addrspace(1)* %in, align 4 - %fadd = fadd <3 x float> %vec, + %fadd = fadd nexc nrnd <3 x float> %vec, store <3 x float> %fadd, <3 x float> addrspace(1)* %out ret void } @@ -700,7 +700,7 @@ ; GCN: ScratchSize: 0{{$}} define void @copy_v3f64_align4(<3 x double> addrspace(1)* noalias %out, <3 x double> addrspace(1)* noalias %in) #0 { %vec = load <3 x double>, <3 x double> addrspace(1)* %in, align 4 - %fadd = fadd <3 x double> %vec, + %fadd = fadd nexc nrnd <3 x double> %vec, store <3 x double> %fadd, <3 x double> addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/operand-spacing.ll =================================================================== --- test/CodeGen/AMDGPU/operand-spacing.ll +++ test/CodeGen/AMDGPU/operand-spacing.ll @@ -12,7 +12,7 @@ ; GCN: v_add_f32_e32 [[RESULT:v[0-9]+]], [[SREGA]], [[VREGB]] ; GCN: buffer_store_dword [[RESULT]], define void @add_f32(float addrspace(1)* %out, float %a, float %b) { - %result = fadd float %a, %b + %result = fadd nexc nrnd float %a, %b store float %result, float addrspace(1)* %out ret void } Index: test/CodeGen/AMDGPU/pv-packing.ll =================================================================== --- test/CodeGen/AMDGPU/pv-packing.ll +++ test/CodeGen/AMDGPU/pv-packing.ll @@ -17,14 +17,14 @@ %9 = load <4 x float>, <4 x float> addrspace(8)* null %10 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) %11 = call float @llvm.AMDGPU.dp4(<4 x float> %9, <4 x float> %9) - %12 = fmul float %0, %3 - %13 = fadd float %12, %6 - %14 = fmul float %1, %4 - %15 = fadd float %14, %7 - %16 = fmul float %2, %5 - %17 = fadd float %16, %8 - %18 = fmul float %11, %11 - %19 = fadd float %18, %0 + %12 = fmul nexc nrnd float %0, %3 + %13 = fadd nexc nrnd float %12, %6 + %14 = fmul nexc nrnd float %1, %4 + %15 = fadd nexc nrnd float %14, %7 + %16 = fmul nexc nrnd float %2, %5 + %17 = fadd nexc nrnd float %16, %8 + %18 = fmul nexc nrnd float %11, %11 + %19 = fadd nexc nrnd float %18, %0 %20 = insertelement <4 x float> undef, float %13, i32 0 %21 = insertelement <4 x float> %20, float %15, i32 1 %22 = insertelement <4 x float> %21, float %17, i32 2 Index: test/CodeGen/AMDGPU/pv.ll =================================================================== --- test/CodeGen/AMDGPU/pv.ll +++ test/CodeGen/AMDGPU/pv.ll @@ -35,64 +35,64 @@ %27 = extractelement <4 x float> %reg7, i32 3 %28 = load <4 x float>, <4 x float> addrspace(8)* null %29 = extractelement <4 x float> %28, i32 0 - %30 = fmul float %0, %29 + %30 = fmul nexc nrnd float %0, %29 %31 = load <4 x float>, <4 x float> addrspace(8)* null %32 = extractelement <4 x float> %31, i32 1 - %33 = fmul float %0, %32 + %33 = fmul nexc nrnd float %0, %32 %34 = load <4 x float>, <4 x float> addrspace(8)* null %35 = extractelement <4 x float> %34, i32 2 - %36 = fmul float %0, %35 + %36 = fmul nexc nrnd float %0, %35 %37 = load <4 x float>, <4 x float> addrspace(8)* null %38 = extractelement <4 x float> %37, i32 3 - %39 = fmul float %0, %38 + %39 = fmul nexc nrnd float %0, %38 %40 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) %41 = extractelement <4 x float> %40, i32 0 - %42 = fmul float %1, %41 - %43 = fadd float %42, %30 + %42 = fmul nexc nrnd float %1, %41 + %43 = fadd nexc nrnd float %42, %30 %44 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) %45 = extractelement <4 x float> %44, i32 1 - %46 = fmul float %1, %45 - %47 = fadd float %46, %33 + %46 = fmul nexc nrnd float %1, %45 + %47 = fadd nexc nrnd float %46, %33 %48 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) %49 = extractelement <4 x float> %48, i32 2 - %50 = fmul float %1, %49 - %51 = fadd float %50, %36 + %50 = fmul nexc nrnd float %1, %49 + %51 = fadd nexc nrnd float %50, %36 %52 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) %53 = extractelement <4 x float> %52, i32 3 - %54 = fmul float %1, %53 - %55 = fadd float %54, %39 + %54 = fmul nexc nrnd float %1, %53 + %55 = fadd nexc nrnd float %54, %39 %56 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) %57 = extractelement <4 x float> %56, i32 0 - %58 = fmul float %2, %57 - %59 = fadd float %58, %43 + %58 = fmul nexc nrnd float %2, %57 + %59 = fadd nexc nrnd float %58, %43 %60 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) %61 = extractelement <4 x float> %60, i32 1 - %62 = fmul float %2, %61 - %63 = fadd float %62, %47 + %62 = fmul nexc nrnd float %2, %61 + %63 = fadd nexc nrnd float %62, %47 %64 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) %65 = extractelement <4 x float> %64, i32 2 - %66 = fmul float %2, %65 - %67 = fadd float %66, %51 + %66 = fmul nexc nrnd float %2, %65 + %67 = fadd nexc nrnd float %66, %51 %68 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) %69 = extractelement <4 x float> %68, i32 3 - %70 = fmul float %2, %69 - %71 = fadd float %70, %55 + %70 = fmul nexc nrnd float %2, %69 + %71 = fadd nexc nrnd float %70, %55 %72 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) %73 = extractelement <4 x float> %72, i32 0 - %74 = fmul float %3, %73 - %75 = fadd float %74, %59 + %74 = fmul nexc nrnd float %3, %73 + %75 = fadd nexc nrnd float %74, %59 %76 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) %77 = extractelement <4 x float> %76, i32 1 - %78 = fmul float %3, %77 - %79 = fadd float %78, %63 + %78 = fmul nexc nrnd float %3, %77 + %79 = fadd nexc nrnd float %78, %63 %80 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) %81 = extractelement <4 x float> %80, i32 2 - %82 = fmul float %3, %81 - %83 = fadd float %82, %67 + %82 = fmul nexc nrnd float %3, %81 + %83 = fadd nexc nrnd float %82, %67 %84 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 3) %85 = extractelement <4 x float> %84, i32 3 - %86 = fmul float %3, %85 - %87 = fadd float %86, %71 + %86 = fmul nexc nrnd float %3, %85 + %87 = fadd nexc nrnd float %86, %71 %88 = insertelement <4 x float> undef, float %4, i32 0 %89 = insertelement <4 x float> %88, float %5, i32 1 %90 = insertelement <4 x float> %89, float %6, i32 2 @@ -104,21 +104,21 @@ %96 = call float @llvm.AMDGPU.dp4(<4 x float> %91, <4 x float> %95) %97 = call float @fabs(float %96) %98 = call float @llvm.AMDGPU.rsq.f32(float %97) - %99 = fmul float %4, %98 - %100 = fmul float %5, %98 - %101 = fmul float %6, %98 + %99 = fmul nexc nrnd float %4, %98 + %100 = fmul nexc nrnd float %5, %98 + %101 = fmul nexc nrnd float %6, %98 %102 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) %103 = extractelement <4 x float> %102, i32 0 - %104 = fmul float %103, %8 - %105 = fadd float %104, %20 + %104 = fmul nexc nrnd float %103, %8 + %105 = fadd nexc nrnd float %104, %20 %106 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) %107 = extractelement <4 x float> %106, i32 1 - %108 = fmul float %107, %9 - %109 = fadd float %108, %21 + %108 = fmul nexc nrnd float %107, %9 + %109 = fadd nexc nrnd float %108, %21 %110 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) %111 = extractelement <4 x float> %110, i32 2 - %112 = fmul float %111, %10 - %113 = fadd float %112, %22 + %112 = fmul nexc nrnd float %111, %10 + %113 = fadd nexc nrnd float %112, %22 %114 = call float @llvm.AMDIL.clamp.(float %105, float 0.000000e+00, float 1.000000e+00) %115 = call float @llvm.AMDIL.clamp.(float %109, float 0.000000e+00, float 1.000000e+00) %116 = call float @llvm.AMDIL.clamp.(float %113, float 0.000000e+00, float 1.000000e+00) @@ -155,31 +155,31 @@ %147 = call float @llvm.AMDGPU.dp4(<4 x float> %142, <4 x float> %146) %148 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 8) %149 = extractelement <4 x float> %148, i32 0 - %150 = fmul float %149, %8 + %150 = fmul nexc nrnd float %149, %8 %151 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 8) %152 = extractelement <4 x float> %151, i32 1 - %153 = fmul float %152, %9 + %153 = fmul nexc nrnd float %152, %9 %154 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 8) %155 = extractelement <4 x float> %154, i32 2 - %156 = fmul float %155, %10 + %156 = fmul nexc nrnd float %155, %10 %157 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 9) %158 = extractelement <4 x float> %157, i32 0 - %159 = fmul float %158, %12 + %159 = fmul nexc nrnd float %158, %12 %160 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 9) %161 = extractelement <4 x float> %160, i32 1 - %162 = fmul float %161, %13 + %162 = fmul nexc nrnd float %161, %13 %163 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 9) %164 = extractelement <4 x float> %163, i32 2 - %165 = fmul float %164, %14 + %165 = fmul nexc nrnd float %164, %14 %166 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 10) %167 = extractelement <4 x float> %166, i32 0 - %168 = fmul float %167, %16 + %168 = fmul nexc nrnd float %167, %16 %169 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 10) %170 = extractelement <4 x float> %169, i32 1 - %171 = fmul float %170, %17 + %171 = fmul nexc nrnd float %170, %17 %172 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 10) %173 = extractelement <4 x float> %172, i32 2 - %174 = fmul float %173, %18 + %174 = fmul nexc nrnd float %173, %18 %175 = fcmp uge float %132, 0.000000e+00 %176 = select i1 %175, float %132, float 0.000000e+00 %177 = fcmp uge float %147, 0.000000e+00 @@ -187,21 +187,21 @@ %179 = call float @llvm.pow.f32(float %178, float %24) %180 = fcmp ult float %132, 0.000000e+00 %181 = select i1 %180, float 0.000000e+00, float %179 - %182 = fadd float %150, %105 - %183 = fadd float %153, %109 - %184 = fadd float %156, %113 - %185 = fmul float %176, %159 - %186 = fadd float %185, %182 - %187 = fmul float %176, %162 - %188 = fadd float %187, %183 - %189 = fmul float %176, %165 - %190 = fadd float %189, %184 - %191 = fmul float %181, %168 - %192 = fadd float %191, %186 - %193 = fmul float %181, %171 - %194 = fadd float %193, %188 - %195 = fmul float %181, %174 - %196 = fadd float %195, %190 + %182 = fadd nexc nrnd float %150, %105 + %183 = fadd nexc nrnd float %153, %109 + %184 = fadd nexc nrnd float %156, %113 + %185 = fmul nexc nrnd float %176, %159 + %186 = fadd nexc nrnd float %185, %182 + %187 = fmul nexc nrnd float %176, %162 + %188 = fadd nexc nrnd float %187, %183 + %189 = fmul nexc nrnd float %176, %165 + %190 = fadd nexc nrnd float %189, %184 + %191 = fmul nexc nrnd float %181, %168 + %192 = fadd nexc nrnd float %191, %186 + %193 = fmul nexc nrnd float %181, %171 + %194 = fadd nexc nrnd float %193, %188 + %195 = fmul nexc nrnd float %181, %174 + %196 = fadd nexc nrnd float %195, %190 %197 = call float @llvm.AMDIL.clamp.(float %192, float 0.000000e+00, float 1.000000e+00) %198 = call float @llvm.AMDIL.clamp.(float %194, float 0.000000e+00, float 1.000000e+00) %199 = call float @llvm.AMDIL.clamp.(float %196, float 0.000000e+00, float 1.000000e+00) Index: test/CodeGen/AMDGPU/r600-encoding.ll =================================================================== --- test/CodeGen/AMDGPU/r600-encoding.ll +++ test/CodeGen/AMDGPU/r600-encoding.ll @@ -14,7 +14,7 @@ entry: %r0 = extractelement <4 x float> %reg0, i32 0 %r1 = extractelement <4 x float> %reg0, i32 1 - %r2 = fmul float %r0, %r1 + %r2 = fmul nexc nrnd float %r0, %r1 %vec = insertelement <4 x float> undef, float %r2, i32 0 call void @llvm.R600.store.swizzle(<4 x float> %vec, i32 0, i32 0) ret void Index: test/CodeGen/AMDGPU/r600-export-fix.ll =================================================================== --- test/CodeGen/AMDGPU/r600-export-fix.ll +++ test/CodeGen/AMDGPU/r600-export-fix.ll @@ -18,64 +18,64 @@ %3 = extractelement <4 x float> %reg1, i32 3 %4 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) %5 = extractelement <4 x float> %4, i32 0 - %6 = fmul float %5, %0 + %6 = fmul nexc nrnd float %5, %0 %7 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) %8 = extractelement <4 x float> %7, i32 1 - %9 = fmul float %8, %0 + %9 = fmul nexc nrnd float %8, %0 %10 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) %11 = extractelement <4 x float> %10, i32 2 - %12 = fmul float %11, %0 + %12 = fmul nexc nrnd float %11, %0 %13 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 4) %14 = extractelement <4 x float> %13, i32 3 - %15 = fmul float %14, %0 + %15 = fmul nexc nrnd float %14, %0 %16 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 5) %17 = extractelement <4 x float> %16, i32 0 - %18 = fmul float %17, %1 - %19 = fadd float %18, %6 + %18 = fmul nexc nrnd float %17, %1 + %19 = fadd nexc nrnd float %18, %6 %20 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 5) %21 = extractelement <4 x float> %20, i32 1 - %22 = fmul float %21, %1 - %23 = fadd float %22, %9 + %22 = fmul nexc nrnd float %21, %1 + %23 = fadd nexc nrnd float %22, %9 %24 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 5) %25 = extractelement <4 x float> %24, i32 2 - %26 = fmul float %25, %1 - %27 = fadd float %26, %12 + %26 = fmul nexc nrnd float %25, %1 + %27 = fadd nexc nrnd float %26, %12 %28 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 5) %29 = extractelement <4 x float> %28, i32 3 - %30 = fmul float %29, %1 - %31 = fadd float %30, %15 + %30 = fmul nexc nrnd float %29, %1 + %31 = fadd nexc nrnd float %30, %15 %32 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 6) %33 = extractelement <4 x float> %32, i32 0 - %34 = fmul float %33, %2 - %35 = fadd float %34, %19 + %34 = fmul nexc nrnd float %33, %2 + %35 = fadd nexc nrnd float %34, %19 %36 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 6) %37 = extractelement <4 x float> %36, i32 1 - %38 = fmul float %37, %2 - %39 = fadd float %38, %23 + %38 = fmul nexc nrnd float %37, %2 + %39 = fadd nexc nrnd float %38, %23 %40 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 6) %41 = extractelement <4 x float> %40, i32 2 - %42 = fmul float %41, %2 - %43 = fadd float %42, %27 + %42 = fmul nexc nrnd float %41, %2 + %43 = fadd nexc nrnd float %42, %27 %44 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 6) %45 = extractelement <4 x float> %44, i32 3 - %46 = fmul float %45, %2 - %47 = fadd float %46, %31 + %46 = fmul nexc nrnd float %45, %2 + %47 = fadd nexc nrnd float %46, %31 %48 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 7) %49 = extractelement <4 x float> %48, i32 0 - %50 = fmul float %49, %3 - %51 = fadd float %50, %35 + %50 = fmul nexc nrnd float %49, %3 + %51 = fadd nexc nrnd float %50, %35 %52 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 7) %53 = extractelement <4 x float> %52, i32 1 - %54 = fmul float %53, %3 - %55 = fadd float %54, %39 + %54 = fmul nexc nrnd float %53, %3 + %55 = fadd nexc nrnd float %54, %39 %56 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 7) %57 = extractelement <4 x float> %56, i32 2 - %58 = fmul float %57, %3 - %59 = fadd float %58, %43 + %58 = fmul nexc nrnd float %57, %3 + %59 = fadd nexc nrnd float %58, %43 %60 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 7) %61 = extractelement <4 x float> %60, i32 3 - %62 = fmul float %61, %3 - %63 = fadd float %62, %47 + %62 = fmul nexc nrnd float %61, %3 + %63 = fadd nexc nrnd float %62, %47 %64 = load <4 x float>, <4 x float> addrspace(8)* null %65 = extractelement <4 x float> %64, i32 0 %66 = load <4 x float>, <4 x float> addrspace(8)* null Index: test/CodeGen/AMDGPU/r600-infinite-loop-bug-while-reorganizing-vector.ll =================================================================== --- test/CodeGen/AMDGPU/r600-infinite-loop-bug-while-reorganizing-vector.ll +++ test/CodeGen/AMDGPU/r600-infinite-loop-bug-while-reorganizing-vector.ll @@ -16,11 +16,11 @@ %13 = extractelement <4 x float> %10, i32 2 %14 = extractelement <4 x float> %10, i32 3 %15 = call float @fabs(float %13) - %16 = fdiv float 1.000000e+00, %15 - %17 = fmul float %11, %16 - %18 = fadd float %17, 1.500000e+00 - %19 = fmul float %12, %16 - %20 = fadd float %19, 1.500000e+00 + %16 = fdiv nexc nrnd float 1.000000e+00, %15 + %17 = fmul nexc nrnd float %11, %16 + %18 = fadd nexc nrnd float %17, 1.500000e+00 + %19 = fmul nexc nrnd float %12, %16 + %20 = fadd nexc nrnd float %19, 1.500000e+00 %21 = insertelement <4 x float> undef, float %20, i32 0 %22 = insertelement <4 x float> %21, float %18, i32 1 %23 = insertelement <4 x float> %22, float %14, i32 2 Index: test/CodeGen/AMDGPU/reciprocal.ll =================================================================== --- test/CodeGen/AMDGPU/reciprocal.ll +++ test/CodeGen/AMDGPU/reciprocal.ll @@ -4,7 +4,7 @@ define void @test(<4 x float> inreg %reg0) #0 { %r0 = extractelement <4 x float> %reg0, i32 0 - %r1 = fdiv float 1.0, %r0 + %r1 = fdiv nexc nrnd float 1.0, %r0 %vec = insertelement <4 x float> undef, float %r1, i32 0 call void @llvm.R600.store.swizzle(<4 x float> %vec, i32 0, i32 0) ret void Index: test/CodeGen/AMDGPU/rsq.ll =================================================================== --- test/CodeGen/AMDGPU/rsq.ll +++ test/CodeGen/AMDGPU/rsq.ll @@ -11,7 +11,7 @@ define void @rsq_f32(float addrspace(1)* noalias %out, float addrspace(1)* noalias %in) nounwind { %val = load float, float addrspace(1)* %in, align 4 %sqrt = call float @llvm.sqrt.f32(float %val) nounwind readnone - %div = fdiv float 1.0, %sqrt + %div = fdiv nexc nrnd float 1.0, %sqrt store float %div, float addrspace(1)* %out, align 4 ret void } @@ -23,7 +23,7 @@ define void @rsq_f64(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) nounwind { %val = load double, double addrspace(1)* %in, align 4 %sqrt = call double @llvm.sqrt.f64(double %val) nounwind readnone - %div = fdiv double 1.0, %sqrt + %div = fdiv nexc nrnd double 1.0, %sqrt store double %div, double addrspace(1)* %out, align 4 ret void } @@ -33,7 +33,7 @@ ; SI: s_endpgm define void @rsq_f32_sgpr(float addrspace(1)* noalias %out, float %val) nounwind { %sqrt = call float @llvm.sqrt.f32(float %val) nounwind readnone - %div = fdiv float 1.0, %sqrt + %div = fdiv nexc nrnd float 1.0, %sqrt store float %div, float addrspace(1)* %out, align 4 ret void } @@ -67,8 +67,8 @@ %c = load float, float addrspace(1)* %gep.2 %x = call float @llvm.sqrt.f32(float %a) - %y = fmul float %x, %b - %z = fdiv float %c, %y + %y = fmul nexc nrnd float %x, %b + %z = fdiv nexc nrnd float %c, %y store float %z, float addrspace(1)* %out.gep ret void } Index: test/CodeGen/AMDGPU/rv7x0_count3.ll =================================================================== --- test/CodeGen/AMDGPU/rv7x0_count3.ll +++ test/CodeGen/AMDGPU/rv7x0_count3.ll @@ -21,15 +21,15 @@ %16 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %8, i32 7, i32 0, i32 1) %17 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %8, i32 8, i32 0, i32 1) %18 = call <4 x float> @llvm.AMDGPU.tex(<4 x float> %8, i32 9, i32 0, i32 1) - %19 = fadd <4 x float> %9, %10 - %20 = fadd <4 x float> %19, %11 - %21 = fadd <4 x float> %20, %12 - %22 = fadd <4 x float> %21, %13 - %23 = fadd <4 x float> %22, %14 - %24 = fadd <4 x float> %23, %15 - %25 = fadd <4 x float> %24, %16 - %26 = fadd <4 x float> %25, %17 - %27 = fadd <4 x float> %26, %18 + %19 = fadd nexc nrnd <4 x float> %9, %10 + %20 = fadd nexc nrnd <4 x float> %19, %11 + %21 = fadd nexc nrnd <4 x float> %20, %12 + %22 = fadd nexc nrnd <4 x float> %21, %13 + %23 = fadd nexc nrnd <4 x float> %22, %14 + %24 = fadd nexc nrnd <4 x float> %23, %15 + %25 = fadd nexc nrnd <4 x float> %24, %16 + %26 = fadd nexc nrnd <4 x float> %25, %17 + %27 = fadd nexc nrnd <4 x float> %26, %18 call void @llvm.R600.store.swizzle(<4 x float> %27, i32 0, i32 2) ret void } Index: test/CodeGen/AMDGPU/schedule-fs-loop-nested-if.ll =================================================================== --- test/CodeGen/AMDGPU/schedule-fs-loop-nested-if.ll +++ test/CodeGen/AMDGPU/schedule-fs-loop-nested-if.ll @@ -9,12 +9,12 @@ %3 = extractelement <4 x float> %reg1, i32 3 %4 = fcmp ult float %1, 0.000000e+00 %5 = select i1 %4, float 1.000000e+00, float 0.000000e+00 - %6 = fsub float -0.000000e+00, %5 + %6 = fsub nexc nrnd float -0.000000e+00, %5 %7 = fptosi float %6 to i32 %8 = bitcast i32 %7 to float %9 = fcmp ult float %0, 5.700000e+01 %10 = select i1 %9, float 1.000000e+00, float 0.000000e+00 - %11 = fsub float -0.000000e+00, %10 + %11 = fsub nexc nrnd float -0.000000e+00, %10 %12 = fptosi float %11 to i32 %13 = bitcast i32 %12 to float %14 = bitcast float %8 to i32 @@ -25,7 +25,7 @@ %19 = icmp ne i32 %18, 0 %20 = fcmp ult float %0, 0.000000e+00 %21 = select i1 %20, float 1.000000e+00, float 0.000000e+00 - %22 = fsub float -0.000000e+00, %21 + %22 = fsub nexc nrnd float -0.000000e+00, %21 %23 = fptosi float %22 to i32 %24 = bitcast i32 %23 to float %25 = bitcast float %24 to i32 @@ -56,21 +56,21 @@ ret void ELSE17: ; preds = %ELSE - %35 = fadd float 0.000000e+00, 0x3FC99999A0000000 - %36 = fadd float 0.000000e+00, 0x3FC99999A0000000 - %37 = fadd float 0.000000e+00, 0x3FC99999A0000000 - %38 = fadd float %35, 0x3FC99999A0000000 - %39 = fadd float %36, 0x3FC99999A0000000 - %40 = fadd float %37, 0x3FC99999A0000000 - %41 = fadd float %38, 0x3FC99999A0000000 - %42 = fadd float %39, 0x3FC99999A0000000 - %43 = fadd float %40, 0x3FC99999A0000000 - %44 = fadd float %41, 0x3FC99999A0000000 - %45 = fadd float %42, 0x3FC99999A0000000 - %46 = fadd float %43, 0x3FC99999A0000000 - %47 = fadd float %44, 0x3FC99999A0000000 - %48 = fadd float %45, 0x3FC99999A0000000 - %49 = fadd float %46, 0x3FC99999A0000000 + %35 = fadd nexc nrnd float 0.000000e+00, 0x3FC99999A0000000 + %36 = fadd nexc nrnd float 0.000000e+00, 0x3FC99999A0000000 + %37 = fadd nexc nrnd float 0.000000e+00, 0x3FC99999A0000000 + %38 = fadd nexc nrnd float %35, 0x3FC99999A0000000 + %39 = fadd nexc nrnd float %36, 0x3FC99999A0000000 + %40 = fadd nexc nrnd float %37, 0x3FC99999A0000000 + %41 = fadd nexc nrnd float %38, 0x3FC99999A0000000 + %42 = fadd nexc nrnd float %39, 0x3FC99999A0000000 + %43 = fadd nexc nrnd float %40, 0x3FC99999A0000000 + %44 = fadd nexc nrnd float %41, 0x3FC99999A0000000 + %45 = fadd nexc nrnd float %42, 0x3FC99999A0000000 + %46 = fadd nexc nrnd float %43, 0x3FC99999A0000000 + %47 = fadd nexc nrnd float %44, 0x3FC99999A0000000 + %48 = fadd nexc nrnd float %45, 0x3FC99999A0000000 + %49 = fadd nexc nrnd float %46, 0x3FC99999A0000000 br label %ENDIF } Index: test/CodeGen/AMDGPU/schedule-if-2.ll =================================================================== --- test/CodeGen/AMDGPU/schedule-if-2.ll +++ test/CodeGen/AMDGPU/schedule-if-2.ll @@ -5,7 +5,7 @@ main_body: %0 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 2) %1 = extractelement <4 x float> %0, i32 0 - %2 = fadd float 1.000000e+03, %1 + %2 = fadd nexc nrnd float 1.000000e+03, %1 %3 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) %4 = extractelement <4 x float> %3, i32 0 %5 = bitcast float %4 to i32 @@ -20,7 +20,7 @@ %11 = call float @fabs(float %2) %12 = fcmp ueq float %11, 0x7FF0000000000000 %13 = select i1 %12, float 1.000000e+00, float 0.000000e+00 - %14 = fsub float -0.000000e+00, %13 + %14 = fsub nexc nrnd float -0.000000e+00, %13 %15 = fptosi float %14 to i32 %16 = bitcast i32 %15 to float %17 = bitcast float %16 to i32 @@ -28,7 +28,7 @@ %. = select i1 %18, float 0x36A0000000000000, float 0.000000e+00 %19 = fcmp une float %2, %2 %20 = select i1 %19, float 1.000000e+00, float 0.000000e+00 - %21 = fsub float -0.000000e+00, %20 + %21 = fsub nexc nrnd float -0.000000e+00, %20 %22 = fptosi float %21 to i32 %23 = bitcast i32 %22 to float %24 = bitcast float %23 to i32 @@ -42,8 +42,8 @@ %31 = select i1 %30, float 1.000000e+00, float %2 %32 = fcmp uge float %31, 0.000000e+00 %33 = select i1 %32, float %31, float -1.000000e+00 - %34 = fadd float %33, 1.000000e+00 - %35 = fmul float %34, 5.000000e-01 + %34 = fadd nexc nrnd float %33, 1.000000e+00 + %35 = fmul nexc nrnd float %34, 5.000000e-01 br label %ENDIF ELSE: ; preds = %main_body @@ -72,7 +72,7 @@ IF23: ; preds = %ELSE %48 = fcmp ult float 0.000000e+00, %2 %49 = select i1 %48, float 1.000000e+00, float 0.000000e+00 - %50 = fsub float -0.000000e+00, %49 + %50 = fsub nexc nrnd float -0.000000e+00, %49 %51 = fptosi float %50 to i32 %52 = bitcast i32 %51 to float %53 = bitcast float %52 to i32 @@ -82,8 +82,8 @@ %56 = sitofp i32 %55 to float %57 = load <4 x float>, <4 x float> addrspace(8)* null %58 = extractelement <4 x float> %57, i32 0 - %59 = fsub float -0.000000e+00, %58 - %60 = fadd float %2, %59 + %59 = fsub nexc nrnd float -0.000000e+00, %58 + %60 = fadd nexc nrnd float %2, %59 br label %ENDIF } Index: test/CodeGen/AMDGPU/schedule-if.ll =================================================================== --- test/CodeGen/AMDGPU/schedule-if.ll +++ test/CodeGen/AMDGPU/schedule-if.ll @@ -38,8 +38,8 @@ IF13: ; preds = %ELSE %20 = load <4 x float>, <4 x float> addrspace(8)* null %21 = extractelement <4 x float> %20, i32 0 - %22 = fsub float -0.000000e+00, %21 - %23 = fadd float 1.000000e+03, %22 + %22 = fsub nexc nrnd float -0.000000e+00, %21 + %23 = fadd nexc nrnd float 1.000000e+03, %22 br label %ENDIF } Index: test/CodeGen/AMDGPU/schedule-vs-if-nested-loop.ll =================================================================== --- test/CodeGen/AMDGPU/schedule-vs-if-nested-loop.ll +++ test/CodeGen/AMDGPU/schedule-vs-if-nested-loop.ll @@ -9,7 +9,7 @@ %3 = extractelement <4 x float> %reg1, i32 3 %4 = fcmp ult float %0, 0.000000e+00 %5 = select i1 %4, float 1.000000e+00, float 0.000000e+00 - %6 = fsub float -0.000000e+00, %5 + %6 = fsub nexc nrnd float -0.000000e+00, %5 %7 = fptosi float %6 to i32 %8 = bitcast i32 %7 to float %9 = bitcast float %8 to i32 @@ -23,64 +23,64 @@ %temp3.0 = phi float [ 0.000000e+00, %main_body ], [ %temp3.1, %LOOP ], [ %temp3.1, %ENDIF16 ] %11 = load <4 x float>, <4 x float> addrspace(9)* null %12 = extractelement <4 x float> %11, i32 0 - %13 = fmul float %12, %0 + %13 = fmul nexc nrnd float %12, %0 %14 = load <4 x float>, <4 x float> addrspace(9)* null %15 = extractelement <4 x float> %14, i32 1 - %16 = fmul float %15, %0 + %16 = fmul nexc nrnd float %15, %0 %17 = load <4 x float>, <4 x float> addrspace(9)* null %18 = extractelement <4 x float> %17, i32 2 - %19 = fmul float %18, %0 + %19 = fmul nexc nrnd float %18, %0 %20 = load <4 x float>, <4 x float> addrspace(9)* null %21 = extractelement <4 x float> %20, i32 3 - %22 = fmul float %21, %0 + %22 = fmul nexc nrnd float %21, %0 %23 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) %24 = extractelement <4 x float> %23, i32 0 - %25 = fmul float %24, %1 - %26 = fadd float %25, %13 + %25 = fmul nexc nrnd float %24, %1 + %26 = fadd nexc nrnd float %25, %13 %27 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) %28 = extractelement <4 x float> %27, i32 1 - %29 = fmul float %28, %1 - %30 = fadd float %29, %16 + %29 = fmul nexc nrnd float %28, %1 + %30 = fadd nexc nrnd float %29, %16 %31 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) %32 = extractelement <4 x float> %31, i32 2 - %33 = fmul float %32, %1 - %34 = fadd float %33, %19 + %33 = fmul nexc nrnd float %32, %1 + %34 = fadd nexc nrnd float %33, %19 %35 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 1) %36 = extractelement <4 x float> %35, i32 3 - %37 = fmul float %36, %1 - %38 = fadd float %37, %22 + %37 = fmul nexc nrnd float %36, %1 + %38 = fadd nexc nrnd float %37, %22 %39 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) %40 = extractelement <4 x float> %39, i32 0 - %41 = fmul float %40, %2 - %42 = fadd float %41, %26 + %41 = fmul nexc nrnd float %40, %2 + %42 = fadd nexc nrnd float %41, %26 %43 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) %44 = extractelement <4 x float> %43, i32 1 - %45 = fmul float %44, %2 - %46 = fadd float %45, %30 + %45 = fmul nexc nrnd float %44, %2 + %46 = fadd nexc nrnd float %45, %30 %47 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) %48 = extractelement <4 x float> %47, i32 2 - %49 = fmul float %48, %2 - %50 = fadd float %49, %34 + %49 = fmul nexc nrnd float %48, %2 + %50 = fadd nexc nrnd float %49, %34 %51 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 2) %52 = extractelement <4 x float> %51, i32 3 - %53 = fmul float %52, %2 - %54 = fadd float %53, %38 + %53 = fmul nexc nrnd float %52, %2 + %54 = fadd nexc nrnd float %53, %38 %55 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) %56 = extractelement <4 x float> %55, i32 0 - %57 = fmul float %56, %3 - %58 = fadd float %57, %42 + %57 = fmul nexc nrnd float %56, %3 + %58 = fadd nexc nrnd float %57, %42 %59 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) %60 = extractelement <4 x float> %59, i32 1 - %61 = fmul float %60, %3 - %62 = fadd float %61, %46 + %61 = fmul nexc nrnd float %60, %3 + %62 = fadd nexc nrnd float %61, %46 %63 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) %64 = extractelement <4 x float> %63, i32 2 - %65 = fmul float %64, %3 - %66 = fadd float %65, %50 + %65 = fmul nexc nrnd float %64, %3 + %66 = fadd nexc nrnd float %65, %50 %67 = load <4 x float>, <4 x float> addrspace(9)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(9)* null, i64 0, i32 3) %68 = extractelement <4 x float> %67, i32 3 - %69 = fmul float %68, %3 - %70 = fadd float %69, %54 + %69 = fmul nexc nrnd float %68, %3 + %70 = fadd nexc nrnd float %69, %54 %71 = insertelement <4 x float> undef, float %58, i32 0 %72 = insertelement <4 x float> %71, float %62, i32 1 %73 = insertelement <4 x float> %72, float %66, i32 2 @@ -101,7 +101,7 @@ %temp4.0 = phi float [ %97, %ENDIF19 ], [ -2.000000e+00, %main_body ] %79 = fcmp uge float %temp4.0, %0 %80 = select i1 %79, float 1.000000e+00, float 0.000000e+00 - %81 = fsub float -0.000000e+00, %80 + %81 = fsub nexc nrnd float -0.000000e+00, %80 %82 = fptosi float %81 to i32 %83 = bitcast i32 %82 to float %84 = bitcast float %83 to i32 @@ -111,7 +111,7 @@ ENDIF16: ; preds = %LOOP %86 = fcmp une float %2, %temp4.0 %87 = select i1 %86, float 1.000000e+00, float 0.000000e+00 - %88 = fsub float -0.000000e+00, %87 + %88 = fsub nexc nrnd float -0.000000e+00, %87 %89 = fptosi float %88 to i32 %90 = bitcast i32 %89 to float %91 = bitcast float %90 to i32 @@ -119,11 +119,11 @@ br i1 %92, label %ENDIF, label %ENDIF19 ENDIF19: ; preds = %ENDIF16 - %93 = fadd float %temp.1, 1.000000e+00 - %94 = fadd float %temp1.1, 0.000000e+00 - %95 = fadd float %temp2.1, 0.000000e+00 - %96 = fadd float %temp3.1, 0.000000e+00 - %97 = fadd float %temp4.0, 1.000000e+00 + %93 = fadd nexc nrnd float %temp.1, 1.000000e+00 + %94 = fadd nexc nrnd float %temp1.1, 0.000000e+00 + %95 = fadd nexc nrnd float %temp2.1, 0.000000e+00 + %96 = fadd nexc nrnd float %temp3.1, 0.000000e+00 + %97 = fadd nexc nrnd float %temp4.0, 1.000000e+00 br label %LOOP } Index: test/CodeGen/AMDGPU/sgpr-copy.ll =================================================================== --- test/CodeGen/AMDGPU/sgpr-copy.ll +++ test/CodeGen/AMDGPU/sgpr-copy.ll @@ -19,12 +19,12 @@ br i1 %26, label %ENDIF, label %ELSE ELSE: ; preds = %main_body - %27 = fsub float -0.000000e+00, %22 + %27 = fsub nexc nrnd float -0.000000e+00, %22 br label %ENDIF ENDIF: ; preds = %main_body, %ELSE %temp.0 = phi float [ %27, %ELSE ], [ %22, %main_body ] - %28 = fadd float %temp.0, %24 + %28 = fadd nexc nrnd float %temp.0, %24 call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %28, float %28, float 0.000000e+00, float 1.000000e+00) ret void } @@ -66,25 +66,25 @@ %50 = call <4 x float> @llvm.SI.sample.v2i32(<2 x i32> %49, <32 x i8> %38, <16 x i8> %40, i32 2) %51 = extractelement <4 x float> %50, i32 2 %52 = call float @fabs(float %51) - %53 = fmul float %43, %43 - %54 = fmul float %44, %44 - %55 = fadd float %54, %53 - %56 = fmul float %45, %45 - %57 = fadd float %55, %56 + %53 = fmul nexc nrnd float %43, %43 + %54 = fmul nexc nrnd float %44, %44 + %55 = fadd nexc nrnd float %54, %53 + %56 = fmul nexc nrnd float %45, %45 + %57 = fadd nexc nrnd float %55, %56 %58 = call float @llvm.AMDGPU.rsq.f32(float %57) - %59 = fmul float %43, %58 - %60 = fmul float %44, %58 - %61 = fmul float %45, %58 - %62 = fmul float %59, %23 - %63 = fmul float %60, %24 - %64 = fadd float %63, %62 - %65 = fmul float %61, %25 - %66 = fadd float %64, %65 - %67 = fsub float -0.000000e+00, %26 - %68 = fmul float %66, %52 - %69 = fadd float %68, %67 - %70 = fmul float %27, %69 - %71 = fmul float %28, %69 + %59 = fmul nexc nrnd float %43, %58 + %60 = fmul nexc nrnd float %44, %58 + %61 = fmul nexc nrnd float %45, %58 + %62 = fmul nexc nrnd float %59, %23 + %63 = fmul nexc nrnd float %60, %24 + %64 = fadd nexc nrnd float %63, %62 + %65 = fmul nexc nrnd float %61, %25 + %66 = fadd nexc nrnd float %64, %65 + %67 = fsub nexc nrnd float -0.000000e+00, %26 + %68 = fmul nexc nrnd float %66, %52 + %69 = fadd nexc nrnd float %68, %67 + %70 = fmul nexc nrnd float %27, %69 + %71 = fmul nexc nrnd float %28, %69 %72 = call float @fabs(float %70) %73 = fcmp olt float 0x3EE4F8B580000000, %72 %74 = sext i1 %73 to i32 @@ -94,13 +94,13 @@ br i1 %77, label %IF, label %ENDIF IF: ; preds = %main_body - %78 = fsub float -0.000000e+00, %70 + %78 = fsub nexc nrnd float -0.000000e+00, %70 %79 = call float @llvm.AMDIL.exp.(float %78) - %80 = fsub float -0.000000e+00, %79 - %81 = fadd float 1.000000e+00, %80 - %82 = fdiv float 1.000000e+00, %70 - %83 = fmul float %81, %82 - %84 = fmul float %32, %83 + %80 = fsub nexc nrnd float -0.000000e+00, %79 + %81 = fadd nexc nrnd float 1.000000e+00, %80 + %82 = fdiv nexc nrnd float 1.000000e+00, %70 + %83 = fmul nexc nrnd float %81, %82 + %84 = fmul nexc nrnd float %32, %83 br label %ENDIF ENDIF: ; preds = %main_body, %IF @@ -114,33 +114,33 @@ br i1 %90, label %IF25, label %ENDIF24 IF25: ; preds = %ENDIF - %91 = fsub float -0.000000e+00, %71 + %91 = fsub nexc nrnd float -0.000000e+00, %71 %92 = call float @llvm.AMDIL.exp.(float %91) - %93 = fsub float -0.000000e+00, %92 - %94 = fadd float 1.000000e+00, %93 - %95 = fdiv float 1.000000e+00, %71 - %96 = fmul float %94, %95 - %97 = fmul float %36, %96 + %93 = fsub nexc nrnd float -0.000000e+00, %92 + %94 = fadd nexc nrnd float 1.000000e+00, %93 + %95 = fdiv nexc nrnd float 1.000000e+00, %71 + %96 = fmul nexc nrnd float %94, %95 + %97 = fmul nexc nrnd float %36, %96 br label %ENDIF24 ENDIF24: ; preds = %ENDIF, %IF25 %temp8.0 = phi float [ %97, %IF25 ], [ %36, %ENDIF ] - %98 = fmul float %29, %temp4.0 - %99 = fmul float %30, %temp4.0 - %100 = fmul float %31, %temp4.0 - %101 = fmul float %33, %temp8.0 - %102 = fadd float %101, %98 - %103 = fmul float %34, %temp8.0 - %104 = fadd float %103, %99 - %105 = fmul float %35, %temp8.0 - %106 = fadd float %105, %100 + %98 = fmul nexc nrnd float %29, %temp4.0 + %99 = fmul nexc nrnd float %30, %temp4.0 + %100 = fmul nexc nrnd float %31, %temp4.0 + %101 = fmul nexc nrnd float %33, %temp8.0 + %102 = fadd nexc nrnd float %101, %98 + %103 = fmul nexc nrnd float %34, %temp8.0 + %104 = fadd nexc nrnd float %103, %99 + %105 = fmul nexc nrnd float %35, %temp8.0 + %106 = fadd nexc nrnd float %105, %100 %107 = call float @llvm.pow.f32(float %52, float %22) - %108 = fsub float -0.000000e+00, %102 - %109 = fmul float %108, %107 - %110 = fsub float -0.000000e+00, %104 - %111 = fmul float %110, %107 - %112 = fsub float -0.000000e+00, %106 - %113 = fmul float %112, %107 + %108 = fsub nexc nrnd float -0.000000e+00, %102 + %109 = fmul nexc nrnd float %108, %107 + %110 = fsub nexc nrnd float -0.000000e+00, %104 + %111 = fmul nexc nrnd float %110, %107 + %112 = fsub nexc nrnd float -0.000000e+00, %106 + %113 = fmul nexc nrnd float %112, %107 %114 = call i32 @llvm.SI.packf16(float %109, float %111) %115 = bitcast i32 %114 to float %116 = call i32 @llvm.SI.packf16(float %113, float 1.000000e+00) Index: test/CodeGen/AMDGPU/shared-op-cycle.ll =================================================================== --- test/CodeGen/AMDGPU/shared-op-cycle.ll +++ test/CodeGen/AMDGPU/shared-op-cycle.ll @@ -8,12 +8,12 @@ %w0 = extractelement <4 x float> %reg0, i32 3 %w1 = extractelement <4 x float> %reg1, i32 3 %w2 = extractelement <4 x float> %reg2, i32 3 - %sq0 = fmul float %w0, %w0 - %r0 = fadd float %sq0, 2.0 - %sq1 = fmul float %w1, %w1 - %r1 = fadd float %sq1, 2.0 - %sq2 = fmul float %w2, %w2 - %r2 = fadd float %sq2, 2.0 + %sq0 = fmul nexc nrnd float %w0, %w0 + %r0 = fadd nexc nrnd float %sq0, 2.0 + %sq1 = fmul nexc nrnd float %w1, %w1 + %r1 = fadd nexc nrnd float %sq1, 2.0 + %sq2 = fmul nexc nrnd float %w2, %w2 + %r2 = fadd nexc nrnd float %sq2, 2.0 %v0 = insertelement <4 x float> undef, float %r0, i32 0 %v1 = insertelement <4 x float> %v0, float %r1, i32 1 %v2 = insertelement <4 x float> %v1, float %r2, i32 2 Index: test/CodeGen/AMDGPU/shl_add_ptr.ll =================================================================== --- test/CodeGen/AMDGPU/shl_add_ptr.ll +++ test/CodeGen/AMDGPU/shl_add_ptr.ll @@ -80,7 +80,7 @@ %val0 = load float, float addrspace(3)* %arrayidx0, align 4 %arrayidx1 = getelementptr inbounds [512 x float], [512 x float] addrspace(3)* @lds1, i32 0, i32 %idx.0 %val1 = load float, float addrspace(3)* %arrayidx1, align 4 - %sum = fadd float %val0, %val1 + %sum = fadd nexc nrnd float %val0, %val1 store float %sum, float addrspace(1)* %out, align 4 ret void } Index: test/CodeGen/AMDGPU/si-sgpr-spill.ll =================================================================== --- test/CodeGen/AMDGPU/si-sgpr-spill.ll +++ test/CodeGen/AMDGPU/si-sgpr-spill.ll @@ -130,24 +130,24 @@ %122 = bitcast i32 %121 to float %123 = load i32, i32 addrspace(3)* %119 %124 = bitcast i32 %123 to float - %125 = fsub float %124, %122 + %125 = fsub nexc nrnd float %124, %122 %126 = bitcast float %94 to i32 store i32 %126, i32 addrspace(3)* %115 %127 = load i32, i32 addrspace(3)* %117 %128 = bitcast i32 %127 to float %129 = load i32, i32 addrspace(3)* %119 %130 = bitcast i32 %129 to float - %131 = fsub float %130, %128 + %131 = fsub nexc nrnd float %130, %128 %132 = insertelement <4 x float> undef, float %125, i32 0 %133 = insertelement <4 x float> %132, float %131, i32 1 %134 = insertelement <4 x float> %133, float %131, i32 2 %135 = insertelement <4 x float> %134, float %131, i32 3 %136 = extractelement <4 x float> %135, i32 0 %137 = extractelement <4 x float> %135, i32 1 - %138 = fmul float %60, %93 - %139 = fmul float %60, %94 - %140 = fmul float %60, %94 - %141 = fmul float %60, %94 + %138 = fmul nexc nrnd float %60, %93 + %139 = fmul nexc nrnd float %60, %94 + %140 = fmul nexc nrnd float %60, %94 + %141 = fmul nexc nrnd float %60, %94 %142 = call i32 @llvm.SI.tid() %143 = getelementptr [64 x i32], [64 x i32] addrspace(3)* @ddxy_lds, i32 0, i32 %142 %144 = bitcast float %138 to i32 @@ -170,67 +170,67 @@ %156 = bitcast i32 %155 to float %157 = load i32, i32 addrspace(3)* %153 %158 = bitcast i32 %157 to float - %159 = fsub float %158, %156 + %159 = fsub nexc nrnd float %158, %156 %160 = bitcast float %139 to i32 store i32 %160, i32 addrspace(3)* %149 %161 = load i32, i32 addrspace(3)* %151 %162 = bitcast i32 %161 to float %163 = load i32, i32 addrspace(3)* %153 %164 = bitcast i32 %163 to float - %165 = fsub float %164, %162 + %165 = fsub nexc nrnd float %164, %162 %166 = bitcast float %140 to i32 store i32 %166, i32 addrspace(3)* %149 %167 = load i32, i32 addrspace(3)* %151 %168 = bitcast i32 %167 to float %169 = load i32, i32 addrspace(3)* %153 %170 = bitcast i32 %169 to float - %171 = fsub float %170, %168 + %171 = fsub nexc nrnd float %170, %168 %172 = bitcast float %141 to i32 store i32 %172, i32 addrspace(3)* %149 %173 = load i32, i32 addrspace(3)* %151 %174 = bitcast i32 %173 to float %175 = load i32, i32 addrspace(3)* %153 %176 = bitcast i32 %175 to float - %177 = fsub float %176, %174 + %177 = fsub nexc nrnd float %176, %174 %178 = insertelement <4 x float> undef, float %159, i32 0 %179 = insertelement <4 x float> %178, float %165, i32 1 %180 = insertelement <4 x float> %179, float %171, i32 2 %181 = insertelement <4 x float> %180, float %177, i32 3 %182 = extractelement <4 x float> %181, i32 0 %183 = extractelement <4 x float> %181, i32 1 - %184 = fdiv float 1.000000e+00, %97 - %185 = fmul float %33, %184 + %184 = fdiv nexc nrnd float 1.000000e+00, %97 + %185 = fmul nexc nrnd float %33, %184 %186 = fcmp uge float 1.000000e+00, %185 %187 = select i1 %186, float %185, float 1.000000e+00 - %188 = fmul float %187, %30 + %188 = fmul nexc nrnd float %187, %30 %189 = call float @ceil(float %188) %190 = fcmp uge float 3.000000e+00, %189 %191 = select i1 %190, float 3.000000e+00, float %189 - %192 = fdiv float 1.000000e+00, %191 - %193 = fdiv float 1.000000e+00, %30 - %194 = fmul float %191, %193 - %195 = fmul float %31, %194 - %196 = fmul float %95, %95 - %197 = fmul float %96, %96 - %198 = fadd float %197, %196 - %199 = fmul float %97, %97 - %200 = fadd float %198, %199 + %192 = fdiv nexc nrnd float 1.000000e+00, %191 + %193 = fdiv nexc nrnd float 1.000000e+00, %30 + %194 = fmul nexc nrnd float %191, %193 + %195 = fmul nexc nrnd float %31, %194 + %196 = fmul nexc nrnd float %95, %95 + %197 = fmul nexc nrnd float %96, %96 + %198 = fadd nexc nrnd float %197, %196 + %199 = fmul nexc nrnd float %97, %97 + %200 = fadd nexc nrnd float %198, %199 %201 = call float @llvm.AMDGPU.rsq.f32(float %200) - %202 = fmul float %95, %201 - %203 = fmul float %96, %201 - %204 = fmul float %202, %29 - %205 = fmul float %203, %29 - %206 = fmul float %204, -1.000000e+00 - %207 = fmul float %205, 1.000000e+00 - %208 = fmul float %206, %32 - %209 = fmul float %207, %32 - %210 = fsub float -0.000000e+00, %208 - %211 = fadd float %93, %210 - %212 = fsub float -0.000000e+00, %209 - %213 = fadd float %94, %212 - %214 = fmul float %206, %192 - %215 = fmul float %207, %192 - %216 = fmul float -1.000000e+00, %192 + %202 = fmul nexc nrnd float %95, %201 + %203 = fmul nexc nrnd float %96, %201 + %204 = fmul nexc nrnd float %202, %29 + %205 = fmul nexc nrnd float %203, %29 + %206 = fmul nexc nrnd float %204, -1.000000e+00 + %207 = fmul nexc nrnd float %205, 1.000000e+00 + %208 = fmul nexc nrnd float %206, %32 + %209 = fmul nexc nrnd float %207, %32 + %210 = fsub nexc nrnd float -0.000000e+00, %208 + %211 = fadd nexc nrnd float %93, %210 + %212 = fsub nexc nrnd float -0.000000e+00, %209 + %213 = fadd nexc nrnd float %94, %212 + %214 = fmul nexc nrnd float %206, %192 + %215 = fmul nexc nrnd float %207, %192 + %216 = fmul nexc nrnd float -1.000000e+00, %192 %217 = bitcast float %136 to i32 %218 = bitcast float %182 to i32 %219 = bitcast float %137 to i32 @@ -279,13 +279,13 @@ %249 = bitcast float %248 to i32 %250 = and i32 %249, 1065353216 %251 = bitcast i32 %250 to float - %252 = fmul float %214, %251 - %253 = fadd float %252, %temp28.0 - %254 = fmul float %215, %251 - %255 = fadd float %254, %temp29.0 - %256 = fmul float %216, %251 - %257 = fadd float %256, %temp30.0 - %258 = fadd float %temp24.0, 1.000000e+00 + %252 = fmul nexc nrnd float %214, %251 + %253 = fadd nexc nrnd float %252, %temp28.0 + %254 = fmul nexc nrnd float %215, %251 + %255 = fadd nexc nrnd float %254, %temp29.0 + %256 = fmul nexc nrnd float %216, %251 + %257 = fadd nexc nrnd float %256, %temp30.0 + %258 = fadd nexc nrnd float %temp24.0, 1.000000e+00 br label %LOOP LOOP65: ; preds = %ENDIF66, %IF @@ -321,7 +321,7 @@ %280 = extractelement <4 x float> %278, i32 1 %281 = extractelement <4 x float> %278, i32 2 %282 = extractelement <4 x float> %278, i32 3 - %283 = fmul float %282, %47 + %283 = fmul nexc nrnd float %282, %47 %284 = bitcast float %136 to i32 %285 = bitcast float %182 to i32 %286 = bitcast float %137 to i32 @@ -358,18 +358,18 @@ %317 = extractelement <4 x float> %316, i32 0 %318 = extractelement <4 x float> %316, i32 1 %319 = extractelement <4 x float> %316, i32 2 - %320 = fmul float %317, %23 - %321 = fmul float %318, %24 - %322 = fmul float %319, %25 - %323 = fmul float %299, %26 - %324 = fadd float %323, %320 - %325 = fmul float %300, %27 - %326 = fadd float %325, %321 - %327 = fmul float %301, %28 - %328 = fadd float %327, %322 - %329 = fadd float %279, %324 - %330 = fadd float %280, %326 - %331 = fadd float %281, %328 + %320 = fmul nexc nrnd float %317, %23 + %321 = fmul nexc nrnd float %318, %24 + %322 = fmul nexc nrnd float %319, %25 + %323 = fmul nexc nrnd float %299, %26 + %324 = fadd nexc nrnd float %323, %320 + %325 = fmul nexc nrnd float %300, %27 + %326 = fadd nexc nrnd float %325, %321 + %327 = fmul nexc nrnd float %301, %28 + %328 = fadd nexc nrnd float %327, %322 + %329 = fadd nexc nrnd float %279, %324 + %330 = fadd nexc nrnd float %280, %326 + %331 = fadd nexc nrnd float %281, %328 %332 = bitcast float %136 to i32 %333 = bitcast float %182 to i32 %334 = bitcast float %137 to i32 @@ -388,18 +388,18 @@ %347 = extractelement <4 x float> %346, i32 0 %348 = extractelement <4 x float> %346, i32 1 %349 = extractelement <4 x float> %346, i32 2 - %350 = fadd float %347, -5.000000e-01 - %351 = fadd float %348, -5.000000e-01 - %352 = fadd float %349, -5.000000e-01 - %353 = fmul float %350, %350 - %354 = fmul float %351, %351 - %355 = fadd float %354, %353 - %356 = fmul float %352, %352 - %357 = fadd float %355, %356 + %350 = fadd nexc nrnd float %347, -5.000000e-01 + %351 = fadd nexc nrnd float %348, -5.000000e-01 + %352 = fadd nexc nrnd float %349, -5.000000e-01 + %353 = fmul nexc nrnd float %350, %350 + %354 = fmul nexc nrnd float %351, %351 + %355 = fadd nexc nrnd float %354, %353 + %356 = fmul nexc nrnd float %352, %352 + %357 = fadd nexc nrnd float %355, %356 %358 = call float @llvm.AMDGPU.rsq.f32(float %357) - %359 = fmul float %350, %358 - %360 = fmul float %351, %358 - %361 = fmul float %352, %358 + %359 = fmul nexc nrnd float %350, %358 + %360 = fmul nexc nrnd float %351, %358 + %361 = fmul nexc nrnd float %352, %358 %362 = bitcast float %136 to i32 %363 = bitcast float %182 to i32 %364 = bitcast float %137 to i32 @@ -419,41 +419,41 @@ %378 = extractelement <4 x float> %376, i32 1 %379 = extractelement <4 x float> %376, i32 2 %380 = extractelement <4 x float> %376, i32 3 - %381 = fsub float -0.000000e+00, %95 - %382 = fsub float -0.000000e+00, %96 - %383 = fsub float -0.000000e+00, %97 - %384 = fmul float %359, %381 - %385 = fmul float %360, %382 - %386 = fadd float %385, %384 - %387 = fmul float %361, %383 - %388 = fadd float %386, %387 - %389 = fmul float %388, %359 - %390 = fmul float %388, %360 - %391 = fmul float %388, %361 - %392 = fmul float 2.000000e+00, %389 - %393 = fmul float 2.000000e+00, %390 - %394 = fmul float 2.000000e+00, %391 - %395 = fsub float -0.000000e+00, %392 - %396 = fadd float %381, %395 - %397 = fsub float -0.000000e+00, %393 - %398 = fadd float %382, %397 - %399 = fsub float -0.000000e+00, %394 - %400 = fadd float %383, %399 - %401 = fmul float %396, %98 - %402 = fmul float %396, %99 - %403 = fmul float %396, %100 - %404 = fmul float %398, %101 - %405 = fadd float %404, %401 - %406 = fmul float %398, %102 - %407 = fadd float %406, %402 - %408 = fmul float %398, %103 - %409 = fadd float %408, %403 - %410 = fmul float %400, %104 - %411 = fadd float %410, %405 - %412 = fmul float %400, %105 - %413 = fadd float %412, %407 - %414 = fmul float %400, %106 - %415 = fadd float %414, %409 + %381 = fsub nexc nrnd float -0.000000e+00, %95 + %382 = fsub nexc nrnd float -0.000000e+00, %96 + %383 = fsub nexc nrnd float -0.000000e+00, %97 + %384 = fmul nexc nrnd float %359, %381 + %385 = fmul nexc nrnd float %360, %382 + %386 = fadd nexc nrnd float %385, %384 + %387 = fmul nexc nrnd float %361, %383 + %388 = fadd nexc nrnd float %386, %387 + %389 = fmul nexc nrnd float %388, %359 + %390 = fmul nexc nrnd float %388, %360 + %391 = fmul nexc nrnd float %388, %361 + %392 = fmul nexc nrnd float 2.000000e+00, %389 + %393 = fmul nexc nrnd float 2.000000e+00, %390 + %394 = fmul nexc nrnd float 2.000000e+00, %391 + %395 = fsub nexc nrnd float -0.000000e+00, %392 + %396 = fadd nexc nrnd float %381, %395 + %397 = fsub nexc nrnd float -0.000000e+00, %393 + %398 = fadd nexc nrnd float %382, %397 + %399 = fsub nexc nrnd float -0.000000e+00, %394 + %400 = fadd nexc nrnd float %383, %399 + %401 = fmul nexc nrnd float %396, %98 + %402 = fmul nexc nrnd float %396, %99 + %403 = fmul nexc nrnd float %396, %100 + %404 = fmul nexc nrnd float %398, %101 + %405 = fadd nexc nrnd float %404, %401 + %406 = fmul nexc nrnd float %398, %102 + %407 = fadd nexc nrnd float %406, %402 + %408 = fmul nexc nrnd float %398, %103 + %409 = fadd nexc nrnd float %408, %403 + %410 = fmul nexc nrnd float %400, %104 + %411 = fadd nexc nrnd float %410, %405 + %412 = fmul nexc nrnd float %400, %105 + %413 = fadd nexc nrnd float %412, %407 + %414 = fmul nexc nrnd float %400, %106 + %415 = fadd nexc nrnd float %414, %409 %416 = bitcast float %136 to i32 %417 = bitcast float %182 to i32 %418 = bitcast float %137 to i32 @@ -472,21 +472,21 @@ %431 = extractelement <4 x float> %430, i32 0 %432 = extractelement <4 x float> %430, i32 1 %433 = extractelement <4 x float> %430, i32 2 - %434 = fmul float %48, %411 - %435 = fmul float %49, %411 - %436 = fmul float %50, %411 - %437 = fmul float %51, %413 - %438 = fadd float %437, %434 - %439 = fmul float %52, %413 - %440 = fadd float %439, %435 - %441 = fmul float %53, %413 - %442 = fadd float %441, %436 - %443 = fmul float %54, %415 - %444 = fadd float %443, %438 - %445 = fmul float %55, %415 - %446 = fadd float %445, %440 - %447 = fmul float %56, %415 - %448 = fadd float %447, %442 + %434 = fmul nexc nrnd float %48, %411 + %435 = fmul nexc nrnd float %49, %411 + %436 = fmul nexc nrnd float %50, %411 + %437 = fmul nexc nrnd float %51, %413 + %438 = fadd nexc nrnd float %437, %434 + %439 = fmul nexc nrnd float %52, %413 + %440 = fadd nexc nrnd float %439, %435 + %441 = fmul nexc nrnd float %53, %413 + %442 = fadd nexc nrnd float %441, %436 + %443 = fmul nexc nrnd float %54, %415 + %444 = fadd nexc nrnd float %443, %438 + %445 = fmul nexc nrnd float %55, %415 + %446 = fadd nexc nrnd float %445, %440 + %447 = fmul nexc nrnd float %56, %415 + %448 = fadd nexc nrnd float %447, %442 %449 = insertelement <4 x float> undef, float %444, i32 0 %450 = insertelement <4 x float> %449, float %446, i32 1 %451 = insertelement <4 x float> %450, float %448, i32 2 @@ -497,11 +497,11 @@ %456 = extractelement <4 x float> %453, i32 2 %457 = extractelement <4 x float> %453, i32 3 %458 = call float @fabs(float %456) - %459 = fdiv float 1.000000e+00, %458 - %460 = fmul float %454, %459 - %461 = fadd float %460, 1.500000e+00 - %462 = fmul float %455, %459 - %463 = fadd float %462, 1.500000e+00 + %459 = fdiv nexc nrnd float 1.000000e+00, %458 + %460 = fmul nexc nrnd float %454, %459 + %461 = fadd nexc nrnd float %460, 1.500000e+00 + %462 = fmul nexc nrnd float %455, %459 + %463 = fadd nexc nrnd float %462, 1.500000e+00 %464 = bitcast float %463 to i32 %465 = bitcast float %461 to i32 %466 = bitcast float %457 to i32 @@ -513,89 +513,89 @@ %472 = extractelement <4 x float> %471, i32 0 %473 = extractelement <4 x float> %471, i32 1 %474 = extractelement <4 x float> %471, i32 2 - %475 = fmul float %431, %472 - %476 = fadd float %475, %329 - %477 = fmul float %432, %473 - %478 = fadd float %477, %330 - %479 = fmul float %433, %474 - %480 = fadd float %479, %331 - %481 = fmul float %107, %107 - %482 = fmul float %108, %108 - %483 = fadd float %482, %481 - %484 = fmul float %109, %109 - %485 = fadd float %483, %484 + %475 = fmul nexc nrnd float %431, %472 + %476 = fadd nexc nrnd float %475, %329 + %477 = fmul nexc nrnd float %432, %473 + %478 = fadd nexc nrnd float %477, %330 + %479 = fmul nexc nrnd float %433, %474 + %480 = fadd nexc nrnd float %479, %331 + %481 = fmul nexc nrnd float %107, %107 + %482 = fmul nexc nrnd float %108, %108 + %483 = fadd nexc nrnd float %482, %481 + %484 = fmul nexc nrnd float %109, %109 + %485 = fadd nexc nrnd float %483, %484 %486 = call float @llvm.AMDGPU.rsq.f32(float %485) - %487 = fmul float %107, %486 - %488 = fmul float %108, %486 - %489 = fmul float %109, %486 - %490 = fmul float %377, %40 - %491 = fmul float %378, %41 - %492 = fmul float %379, %42 - %493 = fmul float %359, %487 - %494 = fmul float %360, %488 - %495 = fadd float %494, %493 - %496 = fmul float %361, %489 - %497 = fadd float %495, %496 - %498 = fmul float %497, %359 - %499 = fmul float %497, %360 - %500 = fmul float %497, %361 - %501 = fmul float 2.000000e+00, %498 - %502 = fmul float 2.000000e+00, %499 - %503 = fmul float 2.000000e+00, %500 - %504 = fsub float -0.000000e+00, %501 - %505 = fadd float %487, %504 - %506 = fsub float -0.000000e+00, %502 - %507 = fadd float %488, %506 - %508 = fsub float -0.000000e+00, %503 - %509 = fadd float %489, %508 - %510 = fmul float %95, %95 - %511 = fmul float %96, %96 - %512 = fadd float %511, %510 - %513 = fmul float %97, %97 - %514 = fadd float %512, %513 + %487 = fmul nexc nrnd float %107, %486 + %488 = fmul nexc nrnd float %108, %486 + %489 = fmul nexc nrnd float %109, %486 + %490 = fmul nexc nrnd float %377, %40 + %491 = fmul nexc nrnd float %378, %41 + %492 = fmul nexc nrnd float %379, %42 + %493 = fmul nexc nrnd float %359, %487 + %494 = fmul nexc nrnd float %360, %488 + %495 = fadd nexc nrnd float %494, %493 + %496 = fmul nexc nrnd float %361, %489 + %497 = fadd nexc nrnd float %495, %496 + %498 = fmul nexc nrnd float %497, %359 + %499 = fmul nexc nrnd float %497, %360 + %500 = fmul nexc nrnd float %497, %361 + %501 = fmul nexc nrnd float 2.000000e+00, %498 + %502 = fmul nexc nrnd float 2.000000e+00, %499 + %503 = fmul nexc nrnd float 2.000000e+00, %500 + %504 = fsub nexc nrnd float -0.000000e+00, %501 + %505 = fadd nexc nrnd float %487, %504 + %506 = fsub nexc nrnd float -0.000000e+00, %502 + %507 = fadd nexc nrnd float %488, %506 + %508 = fsub nexc nrnd float -0.000000e+00, %503 + %509 = fadd nexc nrnd float %489, %508 + %510 = fmul nexc nrnd float %95, %95 + %511 = fmul nexc nrnd float %96, %96 + %512 = fadd nexc nrnd float %511, %510 + %513 = fmul nexc nrnd float %97, %97 + %514 = fadd nexc nrnd float %512, %513 %515 = call float @llvm.AMDGPU.rsq.f32(float %514) - %516 = fmul float %95, %515 - %517 = fmul float %96, %515 - %518 = fmul float %97, %515 - %519 = fmul float %505, %516 - %520 = fmul float %507, %517 - %521 = fadd float %520, %519 - %522 = fmul float %509, %518 - %523 = fadd float %521, %522 - %524 = fsub float -0.000000e+00, %523 + %516 = fmul nexc nrnd float %95, %515 + %517 = fmul nexc nrnd float %96, %515 + %518 = fmul nexc nrnd float %97, %515 + %519 = fmul nexc nrnd float %505, %516 + %520 = fmul nexc nrnd float %507, %517 + %521 = fadd nexc nrnd float %520, %519 + %522 = fmul nexc nrnd float %509, %518 + %523 = fadd nexc nrnd float %521, %522 + %524 = fsub nexc nrnd float -0.000000e+00, %523 %525 = fcmp uge float %524, 0.000000e+00 %526 = select i1 %525, float %524, float 0.000000e+00 - %527 = fmul float %43, %380 - %528 = fadd float %527, 1.000000e+00 + %527 = fmul nexc nrnd float %43, %380 + %528 = fadd nexc nrnd float %527, 1.000000e+00 %529 = call float @llvm.pow.f32(float %526, float %528) - %530 = fmul float %476, %37 - %531 = fmul float %478, %38 - %532 = fmul float %480, %39 - %533 = fmul float %359, %487 - %534 = fmul float %360, %488 - %535 = fadd float %534, %533 - %536 = fmul float %361, %489 - %537 = fadd float %535, %536 + %530 = fmul nexc nrnd float %476, %37 + %531 = fmul nexc nrnd float %478, %38 + %532 = fmul nexc nrnd float %480, %39 + %533 = fmul nexc nrnd float %359, %487 + %534 = fmul nexc nrnd float %360, %488 + %535 = fadd nexc nrnd float %534, %533 + %536 = fmul nexc nrnd float %361, %489 + %537 = fadd nexc nrnd float %535, %536 %538 = fcmp uge float %537, 0.000000e+00 %539 = select i1 %538, float %537, float 0.000000e+00 - %540 = fmul float %530, %539 - %541 = fmul float %531, %539 - %542 = fmul float %532, %539 - %543 = fmul float %490, %529 - %544 = fadd float %543, %540 - %545 = fmul float %491, %529 - %546 = fadd float %545, %541 - %547 = fmul float %492, %529 - %548 = fadd float %547, %542 - %549 = fmul float %476, %34 - %550 = fmul float %478, %35 - %551 = fmul float %480, %36 - %552 = fmul float %544, %57 - %553 = fadd float %552, %549 - %554 = fmul float %546, %58 - %555 = fadd float %554, %550 - %556 = fmul float %548, %59 - %557 = fadd float %556, %551 + %540 = fmul nexc nrnd float %530, %539 + %541 = fmul nexc nrnd float %531, %539 + %542 = fmul nexc nrnd float %532, %539 + %543 = fmul nexc nrnd float %490, %529 + %544 = fadd nexc nrnd float %543, %540 + %545 = fmul nexc nrnd float %491, %529 + %546 = fadd nexc nrnd float %545, %541 + %547 = fmul nexc nrnd float %492, %529 + %548 = fadd nexc nrnd float %547, %542 + %549 = fmul nexc nrnd float %476, %34 + %550 = fmul nexc nrnd float %478, %35 + %551 = fmul nexc nrnd float %480, %36 + %552 = fmul nexc nrnd float %544, %57 + %553 = fadd nexc nrnd float %552, %549 + %554 = fmul nexc nrnd float %546, %58 + %555 = fadd nexc nrnd float %554, %550 + %556 = fmul nexc nrnd float %548, %59 + %557 = fadd nexc nrnd float %556, %551 %558 = bitcast float %136 to i32 %559 = bitcast float %182 to i32 %560 = bitcast float %137 to i32 @@ -614,12 +614,12 @@ %573 = extractelement <4 x float> %572, i32 0 %574 = extractelement <4 x float> %572, i32 1 %575 = extractelement <4 x float> %572, i32 2 - %576 = fmul float %573, %44 - %577 = fadd float %576, %553 - %578 = fmul float %574, %45 - %579 = fadd float %578, %555 - %580 = fmul float %575, %46 - %581 = fadd float %580, %557 + %576 = fmul nexc nrnd float %573, %44 + %577 = fadd nexc nrnd float %576, %553 + %578 = fmul nexc nrnd float %574, %45 + %579 = fadd nexc nrnd float %578, %555 + %580 = fmul nexc nrnd float %575, %46 + %581 = fadd nexc nrnd float %580, %557 %582 = call i32 @llvm.SI.packf16(float %577, float %579) %583 = bitcast i32 %582 to float %584 = call i32 @llvm.SI.packf16(float %581, float %283) @@ -642,18 +642,18 @@ %597 = bitcast float %596 to i32 %598 = and i32 %597, 1065353216 %599 = bitcast i32 %598 to float - %600 = fmul float 5.000000e-01, %temp32.0 - %601 = fsub float -0.000000e+00, %600 - %602 = fmul float %599, %temp32.0 - %603 = fadd float %602, %601 - %604 = fmul float %214, %603 - %605 = fadd float %604, %temp28.1 - %606 = fmul float %215, %603 - %607 = fadd float %606, %temp29.1 - %608 = fmul float %216, %603 - %609 = fadd float %608, %temp30.1 - %610 = fadd float %temp24.1, 1.000000e+00 - %611 = fmul float %temp32.0, 5.000000e-01 + %600 = fmul nexc nrnd float 5.000000e-01, %temp32.0 + %601 = fsub nexc nrnd float -0.000000e+00, %600 + %602 = fmul nexc nrnd float %599, %temp32.0 + %603 = fadd nexc nrnd float %602, %601 + %604 = fmul nexc nrnd float %214, %603 + %605 = fadd nexc nrnd float %604, %temp28.1 + %606 = fmul nexc nrnd float %215, %603 + %607 = fadd nexc nrnd float %606, %temp29.1 + %608 = fmul nexc nrnd float %216, %603 + %609 = fadd nexc nrnd float %608, %temp30.1 + %610 = fadd nexc nrnd float %temp24.1, 1.000000e+00 + %611 = fmul nexc nrnd float %temp32.0, 5.000000e-01 br label %LOOP65 } @@ -879,8 +879,8 @@ %193 = call float @llvm.SI.fs.interp(i32 1, i32 7, i32 %4, <2 x i32> %6) %194 = call float @llvm.SI.fs.interp(i32 2, i32 7, i32 %4, <2 x i32> %6) %195 = call float @llvm.SI.fs.interp(i32 3, i32 7, i32 %4, <2 x i32> %6) - %196 = fmul float %14, %124 - %197 = fadd float %196, %125 + %196 = fmul nexc nrnd float %14, %124 + %197 = fadd nexc nrnd float %196, %125 %198 = call float @llvm.AMDIL.clamp.(float %163, float 0.000000e+00, float 1.000000e+00) %199 = call float @llvm.AMDIL.clamp.(float 0.000000e+00, float 0.000000e+00, float 1.000000e+00) %200 = call float @llvm.AMDIL.clamp.(float 0.000000e+00, float 0.000000e+00, float 1.000000e+00) @@ -888,24 +888,24 @@ %202 = bitcast float %198 to i32 %203 = icmp ne i32 %202, 0 %. = select i1 %203, float -1.000000e+00, float 1.000000e+00 - %204 = fsub float -0.000000e+00, %164 - %205 = fadd float %44, %204 - %206 = fsub float -0.000000e+00, %165 - %207 = fadd float %45, %206 - %208 = fsub float -0.000000e+00, %166 - %209 = fadd float %46, %208 - %210 = fmul float %205, %205 - %211 = fmul float %207, %207 - %212 = fadd float %211, %210 - %213 = fmul float %209, %209 - %214 = fadd float %212, %213 + %204 = fsub nexc nrnd float -0.000000e+00, %164 + %205 = fadd nexc nrnd float %44, %204 + %206 = fsub nexc nrnd float -0.000000e+00, %165 + %207 = fadd nexc nrnd float %45, %206 + %208 = fsub nexc nrnd float -0.000000e+00, %166 + %209 = fadd nexc nrnd float %46, %208 + %210 = fmul nexc nrnd float %205, %205 + %211 = fmul nexc nrnd float %207, %207 + %212 = fadd nexc nrnd float %211, %210 + %213 = fmul nexc nrnd float %209, %209 + %214 = fadd nexc nrnd float %212, %213 %215 = call float @llvm.AMDGPU.rsq.f32(float %214) - %216 = fmul float %205, %215 - %217 = fmul float %207, %215 - %218 = fmul float %209, %215 - %219 = fmul float %., %54 - %220 = fmul float %13, %47 - %221 = fmul float %197, %48 + %216 = fmul nexc nrnd float %205, %215 + %217 = fmul nexc nrnd float %207, %215 + %218 = fmul nexc nrnd float %209, %215 + %219 = fmul nexc nrnd float %., %54 + %220 = fmul nexc nrnd float %13, %47 + %221 = fmul nexc nrnd float %197, %48 %222 = bitcast float %174 to i32 %223 = bitcast float %175 to i32 %224 = insertelement <2 x i32> undef, i32 %222, i32 0 @@ -915,55 +915,55 @@ %228 = extractelement <4 x float> %226, i32 1 %229 = extractelement <4 x float> %226, i32 2 %230 = extractelement <4 x float> %226, i32 3 - %231 = fmul float %227, 0x4012611180000000 - %232 = fmul float %228, 0x4012611180000000 - %233 = fmul float %229, 0x4012611180000000 + %231 = fmul nexc nrnd float %227, 0x4012611180000000 + %232 = fmul nexc nrnd float %228, 0x4012611180000000 + %233 = fmul nexc nrnd float %229, 0x4012611180000000 %234 = call float @llvm.AMDGPU.lrp(float %27, float %231, float 1.000000e+00) %235 = call float @llvm.AMDGPU.lrp(float %27, float %232, float 1.000000e+00) %236 = call float @llvm.AMDGPU.lrp(float %27, float %233, float 1.000000e+00) - %237 = fmul float %216, %184 - %238 = fmul float %217, %185 - %239 = fadd float %238, %237 - %240 = fmul float %218, %186 - %241 = fadd float %239, %240 - %242 = fmul float %216, %187 - %243 = fmul float %217, %188 - %244 = fadd float %243, %242 - %245 = fmul float %218, %189 - %246 = fadd float %244, %245 - %247 = fmul float %216, %190 - %248 = fmul float %217, %191 - %249 = fadd float %248, %247 - %250 = fmul float %218, %192 - %251 = fadd float %249, %250 + %237 = fmul nexc nrnd float %216, %184 + %238 = fmul nexc nrnd float %217, %185 + %239 = fadd nexc nrnd float %238, %237 + %240 = fmul nexc nrnd float %218, %186 + %241 = fadd nexc nrnd float %239, %240 + %242 = fmul nexc nrnd float %216, %187 + %243 = fmul nexc nrnd float %217, %188 + %244 = fadd nexc nrnd float %243, %242 + %245 = fmul nexc nrnd float %218, %189 + %246 = fadd nexc nrnd float %244, %245 + %247 = fmul nexc nrnd float %216, %190 + %248 = fmul nexc nrnd float %217, %191 + %249 = fadd nexc nrnd float %248, %247 + %250 = fmul nexc nrnd float %218, %192 + %251 = fadd nexc nrnd float %249, %250 %252 = call float @llvm.AMDIL.clamp.(float %251, float 0.000000e+00, float 1.000000e+00) - %253 = fmul float %214, 0x3F5A36E2E0000000 + %253 = fmul nexc nrnd float %214, 0x3F5A36E2E0000000 %254 = call float @llvm.AMDIL.clamp.(float %253, float 0.000000e+00, float 1.000000e+00) - %255 = fsub float -0.000000e+00, %254 - %256 = fadd float 1.000000e+00, %255 + %255 = fsub nexc nrnd float -0.000000e+00, %254 + %256 = fadd nexc nrnd float 1.000000e+00, %255 %257 = call float @llvm.pow.f32(float %252, float 2.500000e-01) - %258 = fmul float %39, %257 - %259 = fmul float %241, %258 - %260 = fmul float %246, %258 - %261 = fmul float %259, %230 - %262 = fmul float %260, %230 - %263 = fadd float %252, 0x3EE4F8B580000000 - %264 = fsub float -0.000000e+00, %252 - %265 = fadd float 1.000000e+00, %264 - %266 = fmul float 1.200000e+01, %265 - %267 = fadd float %266, 4.000000e+00 - %268 = fsub float -0.000000e+00, %267 - %269 = fmul float %268, %263 - %270 = fsub float -0.000000e+00, %267 - %271 = fmul float %270, %263 - %272 = fsub float -0.000000e+00, %267 - %273 = fmul float %272, %263 - %274 = fdiv float 1.000000e+00, %269 - %275 = fdiv float 1.000000e+00, %271 - %276 = fdiv float 1.000000e+00, %273 - %277 = fmul float %261, %274 - %278 = fmul float %262, %275 - %279 = fmul float %263, %276 + %258 = fmul nexc nrnd float %39, %257 + %259 = fmul nexc nrnd float %241, %258 + %260 = fmul nexc nrnd float %246, %258 + %261 = fmul nexc nrnd float %259, %230 + %262 = fmul nexc nrnd float %260, %230 + %263 = fadd nexc nrnd float %252, 0x3EE4F8B580000000 + %264 = fsub nexc nrnd float -0.000000e+00, %252 + %265 = fadd nexc nrnd float 1.000000e+00, %264 + %266 = fmul nexc nrnd float 1.200000e+01, %265 + %267 = fadd nexc nrnd float %266, 4.000000e+00 + %268 = fsub nexc nrnd float -0.000000e+00, %267 + %269 = fmul nexc nrnd float %268, %263 + %270 = fsub nexc nrnd float -0.000000e+00, %267 + %271 = fmul nexc nrnd float %270, %263 + %272 = fsub nexc nrnd float -0.000000e+00, %267 + %273 = fmul nexc nrnd float %272, %263 + %274 = fdiv nexc nrnd float 1.000000e+00, %269 + %275 = fdiv nexc nrnd float 1.000000e+00, %271 + %276 = fdiv nexc nrnd float 1.000000e+00, %273 + %277 = fmul nexc nrnd float %261, %274 + %278 = fmul nexc nrnd float %262, %275 + %279 = fmul nexc nrnd float %263, %276 br label %LOOP LOOP: ; preds = %LOOP, %main_body @@ -979,11 +979,11 @@ %285 = insertelement <4 x i32> %284, i32 undef, i32 3 %286 = call <4 x float> @llvm.SI.samplel.v4i32(<4 x i32> %285, <32 x i8> %147, <16 x i8> %149, i32 2) %287 = extractelement <4 x float> %286, i32 3 - %288 = fadd float %temp168.0, %277 - %289 = fadd float %temp169.0, %278 - %290 = fadd float %temp170.0, %279 - %291 = fsub float -0.000000e+00, %287 - %292 = fadd float %290, %291 + %288 = fadd nexc nrnd float %temp168.0, %277 + %289 = fadd nexc nrnd float %temp169.0, %278 + %290 = fadd nexc nrnd float %temp170.0, %279 + %291 = fsub nexc nrnd float -0.000000e+00, %287 + %292 = fadd nexc nrnd float %290, %291 %293 = fcmp oge float 0.000000e+00, %292 %294 = sext i1 %293 to i32 %295 = bitcast i32 %294 to float @@ -995,47 +995,47 @@ %298 = extractelement <4 x float> %286, i32 0 %299 = extractelement <4 x float> %286, i32 1 %300 = extractelement <4 x float> %286, i32 2 - %301 = fsub float -0.000000e+00, %292 - %302 = fadd float %temp144.0, %301 - %303 = fdiv float 1.000000e+00, %302 - %304 = fmul float %292, %303 - %305 = fadd float %304, -1.000000e+00 - %306 = fmul float %305, %277 - %307 = fadd float %306, %288 - %308 = fmul float %305, %278 - %309 = fadd float %308, %289 - %310 = fsub float -0.000000e+00, %176 - %311 = fadd float %307, %310 - %312 = fsub float -0.000000e+00, %177 - %313 = fadd float %309, %312 - %314 = fadd float %176, %311 - %315 = fadd float %177, %313 - %316 = fmul float %311, %67 - %317 = fmul float %313, %68 - %318 = fmul float %316, %55 - %319 = fmul float %316, %56 - %320 = fmul float %317, %57 - %321 = fadd float %320, %318 - %322 = fmul float %317, %58 - %323 = fadd float %322, %319 - %324 = fadd float %178, %321 - %325 = fadd float %179, %323 - %326 = fmul float %316, %59 - %327 = fmul float %316, %60 - %328 = fmul float %316, %61 - %329 = fmul float %316, %62 - %330 = fmul float %317, %63 - %331 = fadd float %330, %326 - %332 = fmul float %317, %64 - %333 = fadd float %332, %327 - %334 = fmul float %317, %65 - %335 = fadd float %334, %328 - %336 = fmul float %317, %66 - %337 = fadd float %336, %329 - %338 = fadd float %168, %331 - %339 = fadd float %169, %333 - %340 = fadd float %170, %335 - %341 = fadd float %171, %337 + %301 = fsub nexc nrnd float -0.000000e+00, %292 + %302 = fadd nexc nrnd float %temp144.0, %301 + %303 = fdiv nexc nrnd float 1.000000e+00, %302 + %304 = fmul nexc nrnd float %292, %303 + %305 = fadd nexc nrnd float %304, -1.000000e+00 + %306 = fmul nexc nrnd float %305, %277 + %307 = fadd nexc nrnd float %306, %288 + %308 = fmul nexc nrnd float %305, %278 + %309 = fadd nexc nrnd float %308, %289 + %310 = fsub nexc nrnd float -0.000000e+00, %176 + %311 = fadd nexc nrnd float %307, %310 + %312 = fsub nexc nrnd float -0.000000e+00, %177 + %313 = fadd nexc nrnd float %309, %312 + %314 = fadd nexc nrnd float %176, %311 + %315 = fadd nexc nrnd float %177, %313 + %316 = fmul nexc nrnd float %311, %67 + %317 = fmul nexc nrnd float %313, %68 + %318 = fmul nexc nrnd float %316, %55 + %319 = fmul nexc nrnd float %316, %56 + %320 = fmul nexc nrnd float %317, %57 + %321 = fadd nexc nrnd float %320, %318 + %322 = fmul nexc nrnd float %317, %58 + %323 = fadd nexc nrnd float %322, %319 + %324 = fadd nexc nrnd float %178, %321 + %325 = fadd nexc nrnd float %179, %323 + %326 = fmul nexc nrnd float %316, %59 + %327 = fmul nexc nrnd float %316, %60 + %328 = fmul nexc nrnd float %316, %61 + %329 = fmul nexc nrnd float %316, %62 + %330 = fmul nexc nrnd float %317, %63 + %331 = fadd nexc nrnd float %330, %326 + %332 = fmul nexc nrnd float %317, %64 + %333 = fadd nexc nrnd float %332, %327 + %334 = fmul nexc nrnd float %317, %65 + %335 = fadd nexc nrnd float %334, %328 + %336 = fmul nexc nrnd float %317, %66 + %337 = fadd nexc nrnd float %336, %329 + %338 = fadd nexc nrnd float %168, %331 + %339 = fadd nexc nrnd float %169, %333 + %340 = fadd nexc nrnd float %170, %335 + %341 = fadd nexc nrnd float %171, %337 %342 = bitcast float %338 to i32 %343 = bitcast float %339 to i32 %344 = insertelement <2 x i32> undef, i32 %342, i32 0 @@ -1045,17 +1045,17 @@ %348 = extractelement <4 x float> %346, i32 1 %349 = extractelement <4 x float> %346, i32 2 %350 = extractelement <4 x float> %346, i32 3 - %351 = fmul float %347, %23 - %352 = fmul float %348, %24 - %353 = fmul float %349, %25 - %354 = fmul float %350, %26 - %355 = fmul float %351, %180 - %356 = fmul float %352, %181 - %357 = fmul float %353, %182 - %358 = fmul float %354, %183 - %359 = fsub float -0.000000e+00, %350 - %360 = fadd float 1.000000e+00, %359 - %361 = fmul float %360, %49 + %351 = fmul nexc nrnd float %347, %23 + %352 = fmul nexc nrnd float %348, %24 + %353 = fmul nexc nrnd float %349, %25 + %354 = fmul nexc nrnd float %350, %26 + %355 = fmul nexc nrnd float %351, %180 + %356 = fmul nexc nrnd float %352, %181 + %357 = fmul nexc nrnd float %353, %182 + %358 = fmul nexc nrnd float %354, %183 + %359 = fsub nexc nrnd float -0.000000e+00, %350 + %360 = fadd nexc nrnd float 1.000000e+00, %359 + %361 = fmul nexc nrnd float %360, %49 %362 = call float @llvm.AMDGPU.lrp(float %361, float %347, float %355) %363 = call float @llvm.AMDGPU.lrp(float %361, float %348, float %356) %364 = call float @llvm.AMDGPU.lrp(float %361, float %349, float %357) @@ -1065,10 +1065,10 @@ %368 = insertelement <2 x i32> %367, i32 %366, i32 1 %369 = call <4 x float> @llvm.SI.sample.v2i32(<2 x i32> %368, <32 x i8> %151, <16 x i8> %153, i32 2) %370 = extractelement <4 x float> %369, i32 2 - %371 = fmul float %362, %234 - %372 = fmul float %363, %235 - %373 = fmul float %364, %236 - %374 = fmul float %358, %230 + %371 = fmul nexc nrnd float %362, %234 + %372 = fmul nexc nrnd float %363, %235 + %373 = fmul nexc nrnd float %364, %236 + %374 = fmul nexc nrnd float %358, %230 %375 = bitcast float %314 to i32 %376 = bitcast float %315 to i32 %377 = insertelement <2 x i32> undef, i32 %375, i32 0 @@ -1101,68 +1101,68 @@ %402 = icmp ne i32 %401, 0 %temp112.1 = select i1 %402, float %395, float %394 %temp113.1 = select i1 %402, float %397, float %395 - %403 = fmul float %.224, 2.000000e+00 - %404 = fadd float %403, -1.000000e+00 - %405 = fmul float %.225, 2.000000e+00 - %406 = fadd float %405, -1.000000e+00 - %407 = fmul float %temp112.1, 2.000000e+00 - %408 = fadd float %407, -1.000000e+00 - %409 = fmul float %temp113.1, 2.000000e+00 - %410 = fadd float %409, -1.000000e+00 - %411 = fsub float -0.000000e+00, %404 - %412 = fmul float %411, %35 - %413 = fsub float -0.000000e+00, %406 - %414 = fmul float %413, %35 - %415 = fsub float -0.000000e+00, %408 - %416 = fmul float %415, %36 - %417 = fsub float -0.000000e+00, %410 - %418 = fmul float %417, %36 - %419 = fmul float %416, %370 - %420 = fmul float %418, %370 + %403 = fmul nexc nrnd float %.224, 2.000000e+00 + %404 = fadd nexc nrnd float %403, -1.000000e+00 + %405 = fmul nexc nrnd float %.225, 2.000000e+00 + %406 = fadd nexc nrnd float %405, -1.000000e+00 + %407 = fmul nexc nrnd float %temp112.1, 2.000000e+00 + %408 = fadd nexc nrnd float %407, -1.000000e+00 + %409 = fmul nexc nrnd float %temp113.1, 2.000000e+00 + %410 = fadd nexc nrnd float %409, -1.000000e+00 + %411 = fsub nexc nrnd float -0.000000e+00, %404 + %412 = fmul nexc nrnd float %411, %35 + %413 = fsub nexc nrnd float -0.000000e+00, %406 + %414 = fmul nexc nrnd float %413, %35 + %415 = fsub nexc nrnd float -0.000000e+00, %408 + %416 = fmul nexc nrnd float %415, %36 + %417 = fsub nexc nrnd float -0.000000e+00, %410 + %418 = fmul nexc nrnd float %417, %36 + %419 = fmul nexc nrnd float %416, %370 + %420 = fmul nexc nrnd float %418, %370 %421 = call float @fabs(float %412) %422 = call float @fabs(float %414) - %423 = fsub float -0.000000e+00, %421 - %424 = fadd float 1.000000e+00, %423 - %425 = fsub float -0.000000e+00, %422 - %426 = fadd float 1.000000e+00, %425 - %427 = fmul float %424, %419 - %428 = fadd float %427, %412 - %429 = fmul float %426, %420 - %430 = fadd float %429, %414 - %431 = fmul float %428, %428 - %432 = fmul float %430, %430 - %433 = fadd float %431, %432 - %434 = fsub float -0.000000e+00, %433 - %435 = fadd float 0x3FF00068E0000000, %434 + %423 = fsub nexc nrnd float -0.000000e+00, %421 + %424 = fadd nexc nrnd float 1.000000e+00, %423 + %425 = fsub nexc nrnd float -0.000000e+00, %422 + %426 = fadd nexc nrnd float 1.000000e+00, %425 + %427 = fmul nexc nrnd float %424, %419 + %428 = fadd nexc nrnd float %427, %412 + %429 = fmul nexc nrnd float %426, %420 + %430 = fadd nexc nrnd float %429, %414 + %431 = fmul nexc nrnd float %428, %428 + %432 = fmul nexc nrnd float %430, %430 + %433 = fadd nexc nrnd float %431, %432 + %434 = fsub nexc nrnd float -0.000000e+00, %433 + %435 = fadd nexc nrnd float 0x3FF00068E0000000, %434 %436 = call float @llvm.AMDIL.clamp.(float %435, float 0.000000e+00, float 1.000000e+00) %437 = call float @llvm.AMDGPU.rsq.f32(float %436) - %438 = fmul float %437, %436 - %439 = fsub float -0.000000e+00, %436 + %438 = fmul nexc nrnd float %437, %436 + %439 = fsub nexc nrnd float -0.000000e+00, %436 %440 = call float @llvm.AMDGPU.cndlt(float %439, float %438, float 0.000000e+00) - %441 = fmul float %184, %428 - %442 = fmul float %185, %428 - %443 = fmul float %186, %428 - %444 = fmul float %187, %430 - %445 = fadd float %444, %441 - %446 = fmul float %188, %430 - %447 = fadd float %446, %442 - %448 = fmul float %189, %430 - %449 = fadd float %448, %443 - %450 = fmul float %190, %440 - %451 = fadd float %450, %445 - %452 = fmul float %191, %440 - %453 = fadd float %452, %447 - %454 = fmul float %192, %440 - %455 = fadd float %454, %449 - %456 = fmul float %451, %451 - %457 = fmul float %453, %453 - %458 = fadd float %457, %456 - %459 = fmul float %455, %455 - %460 = fadd float %458, %459 + %441 = fmul nexc nrnd float %184, %428 + %442 = fmul nexc nrnd float %185, %428 + %443 = fmul nexc nrnd float %186, %428 + %444 = fmul nexc nrnd float %187, %430 + %445 = fadd nexc nrnd float %444, %441 + %446 = fmul nexc nrnd float %188, %430 + %447 = fadd nexc nrnd float %446, %442 + %448 = fmul nexc nrnd float %189, %430 + %449 = fadd nexc nrnd float %448, %443 + %450 = fmul nexc nrnd float %190, %440 + %451 = fadd nexc nrnd float %450, %445 + %452 = fmul nexc nrnd float %191, %440 + %453 = fadd nexc nrnd float %452, %447 + %454 = fmul nexc nrnd float %192, %440 + %455 = fadd nexc nrnd float %454, %449 + %456 = fmul nexc nrnd float %451, %451 + %457 = fmul nexc nrnd float %453, %453 + %458 = fadd nexc nrnd float %457, %456 + %459 = fmul nexc nrnd float %455, %455 + %460 = fadd nexc nrnd float %458, %459 %461 = call float @llvm.AMDGPU.rsq.f32(float %460) - %462 = fmul float %451, %461 - %463 = fmul float %453, %461 - %464 = fmul float %455, %461 + %462 = fmul nexc nrnd float %451, %461 + %463 = fmul nexc nrnd float %453, %461 + %464 = fmul nexc nrnd float %455, %461 %465 = fcmp olt float 0.000000e+00, %219 %466 = sext i1 %465 to i32 %467 = bitcast i32 %466 to float @@ -1171,9 +1171,9 @@ br i1 %469, label %IF198, label %ENDIF197 IF198: ; preds = %IF189 - %470 = fsub float -0.000000e+00, %462 - %471 = fsub float -0.000000e+00, %463 - %472 = fsub float -0.000000e+00, %464 + %470 = fsub nexc nrnd float -0.000000e+00, %462 + %471 = fsub nexc nrnd float -0.000000e+00, %463 + %472 = fsub nexc nrnd float -0.000000e+00, %464 br label %ENDIF197 ENDIF197: ; preds = %IF189, %IF198 @@ -1189,14 +1189,14 @@ %479 = extractelement <4 x float> %477, i32 1 %480 = extractelement <4 x float> %477, i32 2 %481 = extractelement <4 x float> %477, i32 3 - %482 = fmul float %478, %40 - %483 = fadd float %482, %41 - %484 = fmul float %479, %40 - %485 = fadd float %484, %41 - %486 = fmul float %480, %40 - %487 = fadd float %486, %41 - %488 = fmul float %481, %42 - %489 = fadd float %488, %43 + %482 = fmul nexc nrnd float %478, %40 + %483 = fadd nexc nrnd float %482, %41 + %484 = fmul nexc nrnd float %479, %40 + %485 = fadd nexc nrnd float %484, %41 + %486 = fmul nexc nrnd float %480, %40 + %487 = fadd nexc nrnd float %486, %41 + %488 = fmul nexc nrnd float %481, %42 + %489 = fadd nexc nrnd float %488, %43 %490 = bitcast float %172 to i32 %491 = bitcast float %173 to i32 %492 = insertelement <2 x i32> undef, i32 %490, i32 0 @@ -1206,91 +1206,91 @@ %496 = extractelement <4 x float> %494, i32 1 %497 = extractelement <4 x float> %494, i32 2 %498 = extractelement <4 x float> %494, i32 3 - %499 = fmul float %498, 3.200000e+01 - %500 = fadd float %499, -1.600000e+01 + %499 = fmul nexc nrnd float %498, 3.200000e+01 + %500 = fadd nexc nrnd float %499, -1.600000e+01 %501 = call float @llvm.AMDIL.exp.(float %500) - %502 = fmul float %495, %501 - %503 = fmul float %496, %501 - %504 = fmul float %497, %501 - %505 = fmul float %28, %502 - %506 = fadd float %505, %193 - %507 = fmul float %29, %503 - %508 = fadd float %507, %194 - %509 = fmul float %30, %504 - %510 = fadd float %509, %195 - %511 = fmul float %506, %489 - %512 = fmul float %508, %489 - %513 = fmul float %510, %489 - %514 = fmul float %489, 5.000000e-01 - %515 = fadd float %514, 5.000000e-01 - %516 = fmul float %483, %515 - %517 = fadd float %516, %511 - %518 = fmul float %485, %515 - %519 = fadd float %518, %512 - %520 = fmul float %487, %515 - %521 = fadd float %520, %513 - %522 = fmul float %517, %371 - %523 = fmul float %519, %372 - %524 = fmul float %521, %373 - %525 = fmul float %428, 0x3FDB272440000000 - %526 = fmul float %430, 0xBFDB272440000000 - %527 = fadd float %526, %525 - %528 = fmul float %440, 0x3FE99999A0000000 - %529 = fadd float %527, %528 - %530 = fmul float %529, 5.000000e-01 - %531 = fadd float %530, 0x3FE3333340000000 - %532 = fmul float %531, %531 - %533 = fmul float %522, %532 - %534 = fmul float %523, %532 - %535 = fmul float %524, %532 - %536 = fsub float -0.000000e+00, %72 - %537 = fsub float -0.000000e+00, %73 - %538 = fsub float -0.000000e+00, %74 - %539 = fmul float %temp12.0, %536 - %540 = fmul float %temp13.0, %537 - %541 = fadd float %540, %539 - %542 = fmul float %temp14.0, %538 - %543 = fadd float %541, %542 + %502 = fmul nexc nrnd float %495, %501 + %503 = fmul nexc nrnd float %496, %501 + %504 = fmul nexc nrnd float %497, %501 + %505 = fmul nexc nrnd float %28, %502 + %506 = fadd nexc nrnd float %505, %193 + %507 = fmul nexc nrnd float %29, %503 + %508 = fadd nexc nrnd float %507, %194 + %509 = fmul nexc nrnd float %30, %504 + %510 = fadd nexc nrnd float %509, %195 + %511 = fmul nexc nrnd float %506, %489 + %512 = fmul nexc nrnd float %508, %489 + %513 = fmul nexc nrnd float %510, %489 + %514 = fmul nexc nrnd float %489, 5.000000e-01 + %515 = fadd nexc nrnd float %514, 5.000000e-01 + %516 = fmul nexc nrnd float %483, %515 + %517 = fadd nexc nrnd float %516, %511 + %518 = fmul nexc nrnd float %485, %515 + %519 = fadd nexc nrnd float %518, %512 + %520 = fmul nexc nrnd float %487, %515 + %521 = fadd nexc nrnd float %520, %513 + %522 = fmul nexc nrnd float %517, %371 + %523 = fmul nexc nrnd float %519, %372 + %524 = fmul nexc nrnd float %521, %373 + %525 = fmul nexc nrnd float %428, 0x3FDB272440000000 + %526 = fmul nexc nrnd float %430, 0xBFDB272440000000 + %527 = fadd nexc nrnd float %526, %525 + %528 = fmul nexc nrnd float %440, 0x3FE99999A0000000 + %529 = fadd nexc nrnd float %527, %528 + %530 = fmul nexc nrnd float %529, 5.000000e-01 + %531 = fadd nexc nrnd float %530, 0x3FE3333340000000 + %532 = fmul nexc nrnd float %531, %531 + %533 = fmul nexc nrnd float %522, %532 + %534 = fmul nexc nrnd float %523, %532 + %535 = fmul nexc nrnd float %524, %532 + %536 = fsub nexc nrnd float -0.000000e+00, %72 + %537 = fsub nexc nrnd float -0.000000e+00, %73 + %538 = fsub nexc nrnd float -0.000000e+00, %74 + %539 = fmul nexc nrnd float %temp12.0, %536 + %540 = fmul nexc nrnd float %temp13.0, %537 + %541 = fadd nexc nrnd float %540, %539 + %542 = fmul nexc nrnd float %temp14.0, %538 + %543 = fadd nexc nrnd float %541, %542 %544 = call float @llvm.AMDIL.clamp.(float %543, float 0.000000e+00, float 1.000000e+00) - %545 = fmul float %371, %544 - %546 = fmul float %372, %544 - %547 = fmul float %373, %544 - %548 = fmul float %545, %69 - %549 = fmul float %546, %70 - %550 = fmul float %547, %71 - %551 = fsub float -0.000000e+00, %164 - %552 = fadd float %97, %551 - %553 = fsub float -0.000000e+00, %165 - %554 = fadd float %98, %553 - %555 = fsub float -0.000000e+00, %166 - %556 = fadd float %99, %555 - %557 = fmul float %552, %552 - %558 = fmul float %554, %554 - %559 = fadd float %558, %557 - %560 = fmul float %556, %556 - %561 = fadd float %559, %560 + %545 = fmul nexc nrnd float %371, %544 + %546 = fmul nexc nrnd float %372, %544 + %547 = fmul nexc nrnd float %373, %544 + %548 = fmul nexc nrnd float %545, %69 + %549 = fmul nexc nrnd float %546, %70 + %550 = fmul nexc nrnd float %547, %71 + %551 = fsub nexc nrnd float -0.000000e+00, %164 + %552 = fadd nexc nrnd float %97, %551 + %553 = fsub nexc nrnd float -0.000000e+00, %165 + %554 = fadd nexc nrnd float %98, %553 + %555 = fsub nexc nrnd float -0.000000e+00, %166 + %556 = fadd nexc nrnd float %99, %555 + %557 = fmul nexc nrnd float %552, %552 + %558 = fmul nexc nrnd float %554, %554 + %559 = fadd nexc nrnd float %558, %557 + %560 = fmul nexc nrnd float %556, %556 + %561 = fadd nexc nrnd float %559, %560 %562 = call float @llvm.AMDGPU.rsq.f32(float %561) - %563 = fmul float %562, %561 - %564 = fsub float -0.000000e+00, %561 + %563 = fmul nexc nrnd float %562, %561 + %564 = fsub nexc nrnd float -0.000000e+00, %561 %565 = call float @llvm.AMDGPU.cndlt(float %564, float %563, float 0.000000e+00) - %566 = fsub float -0.000000e+00, %84 - %567 = fadd float %565, %566 - %568 = fsub float -0.000000e+00, %83 - %569 = fadd float %565, %568 - %570 = fsub float -0.000000e+00, %82 - %571 = fadd float %565, %570 - %572 = fsub float -0.000000e+00, %84 - %573 = fadd float %83, %572 - %574 = fsub float -0.000000e+00, %83 - %575 = fadd float %82, %574 - %576 = fsub float -0.000000e+00, %82 - %577 = fadd float %81, %576 - %578 = fdiv float 1.000000e+00, %573 - %579 = fdiv float 1.000000e+00, %575 - %580 = fdiv float 1.000000e+00, %577 - %581 = fmul float %567, %578 - %582 = fmul float %569, %579 - %583 = fmul float %571, %580 + %566 = fsub nexc nrnd float -0.000000e+00, %84 + %567 = fadd nexc nrnd float %565, %566 + %568 = fsub nexc nrnd float -0.000000e+00, %83 + %569 = fadd nexc nrnd float %565, %568 + %570 = fsub nexc nrnd float -0.000000e+00, %82 + %571 = fadd nexc nrnd float %565, %570 + %572 = fsub nexc nrnd float -0.000000e+00, %84 + %573 = fadd nexc nrnd float %83, %572 + %574 = fsub nexc nrnd float -0.000000e+00, %83 + %575 = fadd nexc nrnd float %82, %574 + %576 = fsub nexc nrnd float -0.000000e+00, %82 + %577 = fadd nexc nrnd float %81, %576 + %578 = fdiv nexc nrnd float 1.000000e+00, %573 + %579 = fdiv nexc nrnd float 1.000000e+00, %575 + %580 = fdiv nexc nrnd float 1.000000e+00, %577 + %581 = fmul nexc nrnd float %567, %578 + %582 = fmul nexc nrnd float %569, %579 + %583 = fmul nexc nrnd float %571, %580 %584 = fcmp olt float %565, %83 %585 = sext i1 %584 to i32 %586 = bitcast i32 %585 to float @@ -1347,29 +1347,29 @@ %temp69.0 = phi float [ %113, %ENDIF200 ], [ %.231, %ELSE214 ], [ %109, %ELSE211 ] %temp70.0 = phi float [ %114, %ENDIF200 ], [ %.232, %ELSE214 ], [ %110, %ELSE211 ] %temp71.0 = phi float [ %115, %ENDIF200 ], [ %.233, %ELSE214 ], [ %111, %ELSE211 ] - %609 = fmul float %164, %85 - %610 = fmul float %165, %86 - %611 = fadd float %609, %610 - %612 = fmul float %166, %87 - %613 = fadd float %611, %612 - %614 = fmul float %167, %88 - %615 = fadd float %613, %614 - %616 = fmul float %164, %89 - %617 = fmul float %165, %90 - %618 = fadd float %616, %617 - %619 = fmul float %166, %91 - %620 = fadd float %618, %619 - %621 = fmul float %167, %92 - %622 = fadd float %620, %621 - %623 = fmul float %164, %93 - %624 = fmul float %165, %94 - %625 = fadd float %623, %624 - %626 = fmul float %166, %95 - %627 = fadd float %625, %626 - %628 = fmul float %167, %96 - %629 = fadd float %627, %628 - %630 = fsub float -0.000000e+00, %78 - %631 = fadd float 1.000000e+00, %630 + %609 = fmul nexc nrnd float %164, %85 + %610 = fmul nexc nrnd float %165, %86 + %611 = fadd nexc nrnd float %609, %610 + %612 = fmul nexc nrnd float %166, %87 + %613 = fadd nexc nrnd float %611, %612 + %614 = fmul nexc nrnd float %167, %88 + %615 = fadd nexc nrnd float %613, %614 + %616 = fmul nexc nrnd float %164, %89 + %617 = fmul nexc nrnd float %165, %90 + %618 = fadd nexc nrnd float %616, %617 + %619 = fmul nexc nrnd float %166, %91 + %620 = fadd nexc nrnd float %618, %619 + %621 = fmul nexc nrnd float %167, %92 + %622 = fadd nexc nrnd float %620, %621 + %623 = fmul nexc nrnd float %164, %93 + %624 = fmul nexc nrnd float %165, %94 + %625 = fadd nexc nrnd float %623, %624 + %626 = fmul nexc nrnd float %166, %95 + %627 = fadd nexc nrnd float %625, %626 + %628 = fmul nexc nrnd float %167, %96 + %629 = fadd nexc nrnd float %627, %628 + %630 = fsub nexc nrnd float -0.000000e+00, %78 + %631 = fadd nexc nrnd float 1.000000e+00, %630 %632 = call float @fabs(float %615) %633 = call float @fabs(float %622) %634 = fcmp oge float %631, %632 @@ -1384,19 +1384,19 @@ %643 = bitcast float %642 to i32 %644 = and i32 %643, 1065353216 %645 = bitcast i32 %644 to float - %646 = fmul float %639, %645 - %647 = fmul float %629, %646 - %648 = fmul float %615, %temp68.0 - %649 = fadd float %648, %temp70.0 - %650 = fmul float %622, %temp69.0 - %651 = fadd float %650, %temp71.0 - %652 = fmul float %615, %temp52.0 - %653 = fadd float %652, %temp54.0 - %654 = fmul float %622, %temp53.0 - %655 = fadd float %654, %temp55.0 - %656 = fadd float %temp80.0, -1.000000e+00 - %657 = fmul float %656, %77 - %658 = fadd float %657, 1.000000e+00 + %646 = fmul nexc nrnd float %639, %645 + %647 = fmul nexc nrnd float %629, %646 + %648 = fmul nexc nrnd float %615, %temp68.0 + %649 = fadd nexc nrnd float %648, %temp70.0 + %650 = fmul nexc nrnd float %622, %temp69.0 + %651 = fadd nexc nrnd float %650, %temp71.0 + %652 = fmul nexc nrnd float %615, %temp52.0 + %653 = fadd nexc nrnd float %652, %temp54.0 + %654 = fmul nexc nrnd float %622, %temp53.0 + %655 = fadd nexc nrnd float %654, %temp55.0 + %656 = fadd nexc nrnd float %temp80.0, -1.000000e+00 + %657 = fmul nexc nrnd float %656, %77 + %658 = fadd nexc nrnd float %657, 1.000000e+00 %659 = call float @llvm.AMDIL.clamp.(float %658, float 0.000000e+00, float 1.000000e+00) %660 = bitcast float %649 to i32 %661 = bitcast float %651 to i32 @@ -1418,44 +1418,44 @@ %677 = call <4 x float> @llvm.SI.samplel.v4i32(<4 x i32> %676, <32 x i8> %127, <16 x i8> %129, i32 2) %678 = extractelement <4 x float> %677, i32 0 %679 = extractelement <4 x float> %677, i32 1 - %680 = fsub float -0.000000e+00, %669 - %681 = fadd float 1.000000e+00, %680 - %682 = fsub float -0.000000e+00, %679 - %683 = fadd float 1.000000e+00, %682 - %684 = fmul float %681, 2.500000e-01 - %685 = fmul float %683, 2.500000e-01 - %686 = fsub float -0.000000e+00, %684 - %687 = fadd float %668, %686 - %688 = fsub float -0.000000e+00, %685 - %689 = fadd float %678, %688 - %690 = fmul float %647, %temp88.0 - %691 = fadd float %690, %temp89.0 - %692 = fmul float %647, %temp90.0 - %693 = fadd float %692, %temp91.0 + %680 = fsub nexc nrnd float -0.000000e+00, %669 + %681 = fadd nexc nrnd float 1.000000e+00, %680 + %682 = fsub nexc nrnd float -0.000000e+00, %679 + %683 = fadd nexc nrnd float 1.000000e+00, %682 + %684 = fmul nexc nrnd float %681, 2.500000e-01 + %685 = fmul nexc nrnd float %683, 2.500000e-01 + %686 = fsub nexc nrnd float -0.000000e+00, %684 + %687 = fadd nexc nrnd float %668, %686 + %688 = fsub nexc nrnd float -0.000000e+00, %685 + %689 = fadd nexc nrnd float %678, %688 + %690 = fmul nexc nrnd float %647, %temp88.0 + %691 = fadd nexc nrnd float %690, %temp89.0 + %692 = fmul nexc nrnd float %647, %temp90.0 + %693 = fadd nexc nrnd float %692, %temp91.0 %694 = call float @llvm.AMDIL.clamp.(float %691, float 0.000000e+00, float 1.000000e+00) %695 = call float @llvm.AMDIL.clamp.(float %693, float 0.000000e+00, float 1.000000e+00) - %696 = fsub float -0.000000e+00, %694 - %697 = fadd float %668, %696 - %698 = fsub float -0.000000e+00, %695 - %699 = fadd float %678, %698 - %700 = fmul float %668, %668 - %701 = fmul float %678, %678 - %702 = fsub float -0.000000e+00, %700 - %703 = fadd float %687, %702 - %704 = fsub float -0.000000e+00, %701 - %705 = fadd float %689, %704 + %696 = fsub nexc nrnd float -0.000000e+00, %694 + %697 = fadd nexc nrnd float %668, %696 + %698 = fsub nexc nrnd float -0.000000e+00, %695 + %699 = fadd nexc nrnd float %678, %698 + %700 = fmul nexc nrnd float %668, %668 + %701 = fmul nexc nrnd float %678, %678 + %702 = fsub nexc nrnd float -0.000000e+00, %700 + %703 = fadd nexc nrnd float %687, %702 + %704 = fsub nexc nrnd float -0.000000e+00, %701 + %705 = fadd nexc nrnd float %689, %704 %706 = fcmp uge float %703, %75 %707 = select i1 %706, float %703, float %75 %708 = fcmp uge float %705, %75 %709 = select i1 %708, float %705, float %75 - %710 = fmul float %697, %697 - %711 = fadd float %710, %707 - %712 = fmul float %699, %699 - %713 = fadd float %712, %709 - %714 = fdiv float 1.000000e+00, %711 - %715 = fdiv float 1.000000e+00, %713 - %716 = fmul float %707, %714 - %717 = fmul float %709, %715 + %710 = fmul nexc nrnd float %697, %697 + %711 = fadd nexc nrnd float %710, %707 + %712 = fmul nexc nrnd float %699, %699 + %713 = fadd nexc nrnd float %712, %709 + %714 = fdiv nexc nrnd float 1.000000e+00, %711 + %715 = fdiv nexc nrnd float 1.000000e+00, %713 + %716 = fmul nexc nrnd float %707, %714 + %717 = fmul nexc nrnd float %709, %715 %718 = fcmp oge float %697, 0.000000e+00 %719 = sext i1 %718 to i32 %720 = bitcast i32 %719 to float @@ -1470,50 +1470,50 @@ %temp28.0 = select i1 %727, float 1.000000e+00, float %717 %728 = call float @llvm.AMDGPU.lrp(float %659, float %temp28.0, float %.229) %729 = call float @llvm.pow.f32(float %728, float %76) - %730 = fmul float %729, %79 - %731 = fadd float %730, %80 + %730 = fmul nexc nrnd float %729, %79 + %731 = fadd nexc nrnd float %730, %80 %732 = call float @llvm.AMDIL.clamp.(float %731, float 0.000000e+00, float 1.000000e+00) - %733 = fmul float %732, %732 - %734 = fmul float 2.000000e+00, %732 - %735 = fsub float -0.000000e+00, %734 - %736 = fadd float 3.000000e+00, %735 - %737 = fmul float %733, %736 - %738 = fmul float %548, %737 - %739 = fmul float %549, %737 - %740 = fmul float %550, %737 - %741 = fmul float %738, %515 - %742 = fadd float %741, %533 - %743 = fmul float %739, %515 - %744 = fadd float %743, %534 - %745 = fmul float %740, %515 - %746 = fadd float %745, %535 + %733 = fmul nexc nrnd float %732, %732 + %734 = fmul nexc nrnd float 2.000000e+00, %732 + %735 = fsub nexc nrnd float -0.000000e+00, %734 + %736 = fadd nexc nrnd float 3.000000e+00, %735 + %737 = fmul nexc nrnd float %733, %736 + %738 = fmul nexc nrnd float %548, %737 + %739 = fmul nexc nrnd float %549, %737 + %740 = fmul nexc nrnd float %550, %737 + %741 = fmul nexc nrnd float %738, %515 + %742 = fadd nexc nrnd float %741, %533 + %743 = fmul nexc nrnd float %739, %515 + %744 = fadd nexc nrnd float %743, %534 + %745 = fmul nexc nrnd float %740, %515 + %746 = fadd nexc nrnd float %745, %535 %747 = call float @llvm.AMDGPU.lrp(float %230, float %287, float 1.000000e+00) %748 = call float @llvm.AMDGPU.lrp(float %37, float %298, float 1.000000e+00) %749 = call float @llvm.AMDGPU.lrp(float %37, float %299, float 1.000000e+00) %750 = call float @llvm.AMDGPU.lrp(float %37, float %300, float 1.000000e+00) %751 = call float @llvm.AMDGPU.lrp(float %38, float %747, float 1.000000e+00) - %752 = fmul float %748, %751 - %753 = fmul float %749, %751 - %754 = fmul float %750, %751 - %755 = fmul float %742, %752 - %756 = fmul float %744, %753 - %757 = fmul float %746, %754 - %758 = fmul float %temp12.0, %216 - %759 = fmul float %temp13.0, %217 - %760 = fadd float %759, %758 - %761 = fmul float %temp14.0, %218 - %762 = fadd float %760, %761 + %752 = fmul nexc nrnd float %748, %751 + %753 = fmul nexc nrnd float %749, %751 + %754 = fmul nexc nrnd float %750, %751 + %755 = fmul nexc nrnd float %742, %752 + %756 = fmul nexc nrnd float %744, %753 + %757 = fmul nexc nrnd float %746, %754 + %758 = fmul nexc nrnd float %temp12.0, %216 + %759 = fmul nexc nrnd float %temp13.0, %217 + %760 = fadd nexc nrnd float %759, %758 + %761 = fmul nexc nrnd float %temp14.0, %218 + %762 = fadd nexc nrnd float %760, %761 %763 = call float @fabs(float %762) - %764 = fmul float %763, %763 - %765 = fmul float %764, %50 - %766 = fadd float %765, %51 + %764 = fmul nexc nrnd float %763, %763 + %765 = fmul nexc nrnd float %764, %50 + %766 = fadd nexc nrnd float %765, %51 %767 = call float @llvm.AMDIL.clamp.(float %766, float 0.000000e+00, float 1.000000e+00) - %768 = fsub float -0.000000e+00, %767 - %769 = fadd float 1.000000e+00, %768 - %770 = fmul float %33, %769 - %771 = fmul float %33, %769 - %772 = fmul float %33, %769 - %773 = fmul float %34, %769 + %768 = fsub nexc nrnd float -0.000000e+00, %767 + %769 = fadd nexc nrnd float 1.000000e+00, %768 + %770 = fmul nexc nrnd float %33, %769 + %771 = fmul nexc nrnd float %33, %769 + %772 = fmul nexc nrnd float %33, %769 + %773 = fmul nexc nrnd float %34, %769 %774 = call float @llvm.AMDGPU.lrp(float %770, float %31, float %755) %775 = call float @llvm.AMDGPU.lrp(float %771, float %31, float %756) %776 = call float @llvm.AMDGPU.lrp(float %772, float %31, float %757) @@ -1530,8 +1530,8 @@ %787 = select i1 %786, float 6.550400e+04, float %781 %788 = fcmp uge float %783, 6.550400e+04 %789 = select i1 %788, float 6.550400e+04, float %783 - %790 = fmul float %777, %52 - %791 = fadd float %790, %53 + %790 = fmul nexc nrnd float %777, %52 + %791 = fadd nexc nrnd float %790, %53 %792 = call float @llvm.AMDIL.clamp.(float %791, float 0.000000e+00, float 1.000000e+00) %793 = call i32 @llvm.SI.packf16(float %785, float %787) %794 = bitcast i32 %793 to float Index: test/CodeGen/AMDGPU/si-spill-cf.ll =================================================================== --- test/CodeGen/AMDGPU/si-spill-cf.ll +++ test/CodeGen/AMDGPU/si-spill-cf.ll @@ -89,34 +89,34 @@ ret void ENDIF: ; preds = %LOOP - %69 = fsub float %2, undef - %70 = fsub float %3, undef - %71 = fsub float %4, undef - %72 = fmul float %69, 0.000000e+00 - %73 = fmul float %70, undef - %74 = fmul float %71, undef - %75 = fsub float %6, undef - %76 = fsub float %7, undef - %77 = fmul float %75, undef - %78 = fmul float %76, 0.000000e+00 + %69 = fsub nexc nrnd float %2, undef + %70 = fsub nexc nrnd float %3, undef + %71 = fsub nexc nrnd float %4, undef + %72 = fmul nexc nrnd float %69, 0.000000e+00 + %73 = fmul nexc nrnd float %70, undef + %74 = fmul nexc nrnd float %71, undef + %75 = fsub nexc nrnd float %6, undef + %76 = fsub nexc nrnd float %7, undef + %77 = fmul nexc nrnd float %75, undef + %78 = fmul nexc nrnd float %76, 0.000000e+00 %79 = call float @llvm.minnum.f32(float %74, float %78) %80 = call float @llvm.maxnum.f32(float %72, float 0.000000e+00) %81 = call float @llvm.maxnum.f32(float %73, float %77) %82 = call float @llvm.maxnum.f32(float undef, float %79) %83 = call float @llvm.minnum.f32(float %80, float %81) %84 = call float @llvm.minnum.f32(float %83, float undef) - %85 = fsub float %14, undef - %86 = fsub float %15, undef - %87 = fsub float %16, undef - %88 = fmul float %85, undef - %89 = fmul float %86, undef - %90 = fmul float %87, undef - %91 = fsub float %17, undef - %92 = fsub float %18, undef - %93 = fsub float %19, undef - %94 = fmul float %91, 0.000000e+00 - %95 = fmul float %92, undef - %96 = fmul float %93, undef + %85 = fsub nexc nrnd float %14, undef + %86 = fsub nexc nrnd float %15, undef + %87 = fsub nexc nrnd float %16, undef + %88 = fmul nexc nrnd float %85, undef + %89 = fmul nexc nrnd float %86, undef + %90 = fmul nexc nrnd float %87, undef + %91 = fsub nexc nrnd float %17, undef + %92 = fsub nexc nrnd float %18, undef + %93 = fsub nexc nrnd float %19, undef + %94 = fmul nexc nrnd float %91, 0.000000e+00 + %95 = fmul nexc nrnd float %92, undef + %96 = fmul nexc nrnd float %93, undef %97 = call float @llvm.minnum.f32(float %89, float %95) %98 = call float @llvm.maxnum.f32(float %88, float %94) %99 = call float @llvm.maxnum.f32(float %90, float %96) @@ -124,94 +124,94 @@ %101 = call float @llvm.maxnum.f32(float %100, float undef) %102 = call float @llvm.minnum.f32(float %98, float undef) %103 = call float @llvm.minnum.f32(float %102, float %99) - %104 = fsub float %30, undef - %105 = fsub float %31, undef - %106 = fmul float %104, 0.000000e+00 - %107 = fmul float %105, 0.000000e+00 + %104 = fsub nexc nrnd float %30, undef + %105 = fsub nexc nrnd float %31, undef + %106 = fmul nexc nrnd float %104, 0.000000e+00 + %107 = fmul nexc nrnd float %105, 0.000000e+00 %108 = call float @llvm.minnum.f32(float undef, float %106) %109 = call float @llvm.maxnum.f32(float undef, float %107) %110 = call float @llvm.maxnum.f32(float undef, float %108) %111 = call float @llvm.maxnum.f32(float %110, float undef) %112 = call float @llvm.minnum.f32(float undef, float %109) - %113 = fsub float %32, undef - %114 = fsub float %33, undef - %115 = fsub float %34, undef - %116 = fmul float %113, 0.000000e+00 - %117 = fmul float %114, undef - %118 = fmul float %115, undef - %119 = fsub float %35, undef - %120 = fsub float %36, undef - %121 = fsub float %37, undef - %122 = fmul float %119, undef - %123 = fmul float %120, undef - %124 = fmul float %121, undef + %113 = fsub nexc nrnd float %32, undef + %114 = fsub nexc nrnd float %33, undef + %115 = fsub nexc nrnd float %34, undef + %116 = fmul nexc nrnd float %113, 0.000000e+00 + %117 = fmul nexc nrnd float %114, undef + %118 = fmul nexc nrnd float %115, undef + %119 = fsub nexc nrnd float %35, undef + %120 = fsub nexc nrnd float %36, undef + %121 = fsub nexc nrnd float %37, undef + %122 = fmul nexc nrnd float %119, undef + %123 = fmul nexc nrnd float %120, undef + %124 = fmul nexc nrnd float %121, undef %125 = call float @llvm.minnum.f32(float %116, float %122) %126 = call float @llvm.minnum.f32(float %117, float %123) %127 = call float @llvm.minnum.f32(float %118, float %124) %128 = call float @llvm.maxnum.f32(float %125, float %126) %129 = call float @llvm.maxnum.f32(float %128, float %127) - %130 = fsub float %38, undef - %131 = fsub float %39, undef - %132 = fsub float %40, undef - %133 = fmul float %130, 0.000000e+00 - %134 = fmul float %131, undef - %135 = fmul float %132, undef - %136 = fsub float %41, undef - %137 = fsub float %42, undef - %138 = fsub float %43, undef - %139 = fmul float %136, undef - %140 = fmul float %137, undef - %141 = fmul float %138, undef + %130 = fsub nexc nrnd float %38, undef + %131 = fsub nexc nrnd float %39, undef + %132 = fsub nexc nrnd float %40, undef + %133 = fmul nexc nrnd float %130, 0.000000e+00 + %134 = fmul nexc nrnd float %131, undef + %135 = fmul nexc nrnd float %132, undef + %136 = fsub nexc nrnd float %41, undef + %137 = fsub nexc nrnd float %42, undef + %138 = fsub nexc nrnd float %43, undef + %139 = fmul nexc nrnd float %136, undef + %140 = fmul nexc nrnd float %137, undef + %141 = fmul nexc nrnd float %138, undef %142 = call float @llvm.minnum.f32(float %133, float %139) %143 = call float @llvm.minnum.f32(float %134, float %140) %144 = call float @llvm.minnum.f32(float %135, float %141) %145 = call float @llvm.maxnum.f32(float %142, float %143) %146 = call float @llvm.maxnum.f32(float %145, float %144) - %147 = fsub float %44, undef - %148 = fsub float %45, undef - %149 = fsub float %46, undef - %150 = fmul float %147, 0.000000e+00 - %151 = fmul float %148, 0.000000e+00 - %152 = fmul float %149, undef - %153 = fsub float %47, undef - %154 = fsub float %48, undef - %155 = fsub float %49, undef - %156 = fmul float %153, undef - %157 = fmul float %154, 0.000000e+00 - %158 = fmul float %155, undef + %147 = fsub nexc nrnd float %44, undef + %148 = fsub nexc nrnd float %45, undef + %149 = fsub nexc nrnd float %46, undef + %150 = fmul nexc nrnd float %147, 0.000000e+00 + %151 = fmul nexc nrnd float %148, 0.000000e+00 + %152 = fmul nexc nrnd float %149, undef + %153 = fsub nexc nrnd float %47, undef + %154 = fsub nexc nrnd float %48, undef + %155 = fsub nexc nrnd float %49, undef + %156 = fmul nexc nrnd float %153, undef + %157 = fmul nexc nrnd float %154, 0.000000e+00 + %158 = fmul nexc nrnd float %155, undef %159 = call float @llvm.minnum.f32(float %150, float %156) %160 = call float @llvm.minnum.f32(float %151, float %157) %161 = call float @llvm.minnum.f32(float %152, float %158) %162 = call float @llvm.maxnum.f32(float %159, float %160) %163 = call float @llvm.maxnum.f32(float %162, float %161) - %164 = fsub float %50, undef - %165 = fsub float %51, undef - %166 = fsub float %52, undef - %167 = fmul float %164, undef - %168 = fmul float %165, 0.000000e+00 - %169 = fmul float %166, 0.000000e+00 - %170 = fsub float %53, undef - %171 = fsub float %54, undef - %172 = fsub float %55, undef - %173 = fdiv float 1.000000e+00, %temp18.0 - %174 = fmul float %170, undef - %175 = fmul float %171, undef - %176 = fmul float %172, %173 + %164 = fsub nexc nrnd float %50, undef + %165 = fsub nexc nrnd float %51, undef + %166 = fsub nexc nrnd float %52, undef + %167 = fmul nexc nrnd float %164, undef + %168 = fmul nexc nrnd float %165, 0.000000e+00 + %169 = fmul nexc nrnd float %166, 0.000000e+00 + %170 = fsub nexc nrnd float %53, undef + %171 = fsub nexc nrnd float %54, undef + %172 = fsub nexc nrnd float %55, undef + %173 = fdiv nexc nrnd float 1.000000e+00, %temp18.0 + %174 = fmul nexc nrnd float %170, undef + %175 = fmul nexc nrnd float %171, undef + %176 = fmul nexc nrnd float %172, %173 %177 = call float @llvm.minnum.f32(float %167, float %174) %178 = call float @llvm.minnum.f32(float %168, float %175) %179 = call float @llvm.minnum.f32(float %169, float %176) %180 = call float @llvm.maxnum.f32(float %177, float %178) %181 = call float @llvm.maxnum.f32(float %180, float %179) - %182 = fsub float %62, undef - %183 = fsub float %63, undef - %184 = fsub float %64, undef - %185 = fmul float %182, 0.000000e+00 - %186 = fmul float %183, undef - %187 = fmul float %184, undef - %188 = fsub float %65, undef - %189 = fsub float %66, undef - %190 = fmul float %188, undef - %191 = fmul float %189, undef + %182 = fsub nexc nrnd float %62, undef + %183 = fsub nexc nrnd float %63, undef + %184 = fsub nexc nrnd float %64, undef + %185 = fmul nexc nrnd float %182, 0.000000e+00 + %186 = fmul nexc nrnd float %183, undef + %187 = fmul nexc nrnd float %184, undef + %188 = fsub nexc nrnd float %65, undef + %189 = fsub nexc nrnd float %66, undef + %190 = fmul nexc nrnd float %188, undef + %191 = fmul nexc nrnd float %189, undef %192 = call float @llvm.maxnum.f32(float %185, float %190) %193 = call float @llvm.maxnum.f32(float %186, float %191) %194 = call float @llvm.maxnum.f32(float %187, float undef) @@ -238,8 +238,8 @@ ENDIF2564: ; preds = %ENDIF2594, %ENDIF2588 %temp894.1 = phi float [ undef, %ENDIF2588 ], [ %temp894.2, %ENDIF2594 ] %temp18.1 = phi float [ %219, %ENDIF2588 ], [ undef, %ENDIF2594 ] - %203 = fsub float %5, undef - %204 = fmul float %203, undef + %203 = fsub nexc nrnd float %5, undef + %204 = fmul nexc nrnd float %203, undef %205 = call float @llvm.maxnum.f32(float undef, float %204) %206 = call float @llvm.minnum.f32(float %205, float undef) %207 = call float @llvm.minnum.f32(float %206, float undef) @@ -254,8 +254,8 @@ br label %ENDIF2582 ENDIF2582: ; preds = %ELSE2584, %IF2565 - %213 = fadd float %1, undef - %214 = fadd float 0.000000e+00, %213 + %213 = fadd nexc nrnd float %1, undef + %214 = fadd nexc nrnd float 0.000000e+00, %213 %215 = call float @llvm.AMDIL.fraction.(float %214) br i1 undef, label %IF2589, label %ELSE2590 @@ -266,10 +266,10 @@ br label %ENDIF2588 ENDIF2588: ; preds = %ELSE2590, %IF2589 - %216 = fsub float 1.000000e+00, %215 + %216 = fsub nexc nrnd float 1.000000e+00, %215 %217 = call float @llvm.sqrt.f32(float %216) - %218 = fmul float %217, undef - %219 = fadd float %218, undef + %218 = fmul nexc nrnd float %217, undef + %219 = fadd nexc nrnd float %218, undef br label %ENDIF2564 ELSE2593: ; preds = %ELSE2566 @@ -286,7 +286,7 @@ ENDIF2594: ; preds = %ELSE2788, %ELSE2785, %ELSE2782, %ELSE2779, %IF2775, %ELSE2761, %ELSE2758, %IF2757, %ELSE2704, %ELSE2686, %ELSE2671, %ELSE2668, %IF2667, %ELSE2632, %ELSE2596, %ELSE2593 %temp894.2 = phi float [ 0.000000e+00, %IF2667 ], [ 0.000000e+00, %ELSE2671 ], [ 0.000000e+00, %IF2757 ], [ 0.000000e+00, %ELSE2761 ], [ %temp894.0, %ELSE2758 ], [ 0.000000e+00, %IF2775 ], [ 0.000000e+00, %ELSE2779 ], [ 0.000000e+00, %ELSE2782 ], [ %.2848, %ELSE2788 ], [ 0.000000e+00, %ELSE2785 ], [ 0.000000e+00, %ELSE2593 ], [ 0.000000e+00, %ELSE2632 ], [ 0.000000e+00, %ELSE2704 ], [ 0.000000e+00, %ELSE2686 ], [ 0.000000e+00, %ELSE2668 ], [ 0.000000e+00, %ELSE2596 ] - %226 = fmul float %temp894.2, undef + %226 = fmul nexc nrnd float %temp894.2, undef br label %ENDIF2564 ELSE2632: ; preds = %ELSE2596 @@ -354,18 +354,18 @@ br label %ENDIF2594 ELSE2797: ; preds = %ENDIF2564 - %242 = fsub float %8, undef - %243 = fsub float %9, undef - %244 = fsub float %10, undef - %245 = fmul float %242, undef - %246 = fmul float %243, undef - %247 = fmul float %244, undef - %248 = fsub float %11, undef - %249 = fsub float %12, undef - %250 = fsub float %13, undef - %251 = fmul float %248, undef - %252 = fmul float %249, undef - %253 = fmul float %250, undef + %242 = fsub nexc nrnd float %8, undef + %243 = fsub nexc nrnd float %9, undef + %244 = fsub nexc nrnd float %10, undef + %245 = fmul nexc nrnd float %242, undef + %246 = fmul nexc nrnd float %243, undef + %247 = fmul nexc nrnd float %244, undef + %248 = fsub nexc nrnd float %11, undef + %249 = fsub nexc nrnd float %12, undef + %250 = fsub nexc nrnd float %13, undef + %251 = fmul nexc nrnd float %248, undef + %252 = fmul nexc nrnd float %249, undef + %253 = fmul nexc nrnd float %250, undef %254 = call float @llvm.minnum.f32(float %245, float %251) %255 = call float @llvm.minnum.f32(float %246, float %252) %256 = call float @llvm.maxnum.f32(float %247, float %253) @@ -386,18 +386,18 @@ br i1 undef, label %ENDIF2795, label %ELSE2803 ELSE2803: ; preds = %ELSE2800 - %265 = fsub float %20, undef - %266 = fsub float %21, undef - %267 = fsub float %22, undef - %268 = fmul float %265, undef - %269 = fmul float %266, undef - %270 = fmul float %267, 0.000000e+00 - %271 = fsub float %23, undef - %272 = fsub float %24, undef - %273 = fsub float %25, undef - %274 = fmul float %271, undef - %275 = fmul float %272, undef - %276 = fmul float %273, undef + %265 = fsub nexc nrnd float %20, undef + %266 = fsub nexc nrnd float %21, undef + %267 = fsub nexc nrnd float %22, undef + %268 = fmul nexc nrnd float %265, undef + %269 = fmul nexc nrnd float %266, undef + %270 = fmul nexc nrnd float %267, 0.000000e+00 + %271 = fsub nexc nrnd float %23, undef + %272 = fsub nexc nrnd float %24, undef + %273 = fsub nexc nrnd float %25, undef + %274 = fmul nexc nrnd float %271, undef + %275 = fmul nexc nrnd float %272, undef + %276 = fmul nexc nrnd float %273, undef %277 = call float @llvm.minnum.f32(float %268, float %274) %278 = call float @llvm.maxnum.f32(float %269, float %275) %279 = call float @llvm.maxnum.f32(float %270, float %276) @@ -413,14 +413,14 @@ br i1 %288, label %ENDIF2795, label %ELSE2806 ELSE2806: ; preds = %ELSE2803 - %289 = fsub float %26, undef - %290 = fsub float %27, undef - %291 = fsub float %28, undef - %292 = fmul float %289, undef - %293 = fmul float %290, 0.000000e+00 - %294 = fmul float %291, undef - %295 = fsub float %29, undef - %296 = fmul float %295, undef + %289 = fsub nexc nrnd float %26, undef + %290 = fsub nexc nrnd float %27, undef + %291 = fsub nexc nrnd float %28, undef + %292 = fmul nexc nrnd float %289, undef + %293 = fmul nexc nrnd float %290, 0.000000e+00 + %294 = fmul nexc nrnd float %291, undef + %295 = fsub nexc nrnd float %29, undef + %296 = fmul nexc nrnd float %295, undef %297 = call float @llvm.minnum.f32(float %292, float %296) %298 = call float @llvm.minnum.f32(float %293, float undef) %299 = call float @llvm.maxnum.f32(float %294, float undef) @@ -447,18 +447,18 @@ br i1 undef, label %ENDIF2795, label %ELSE2821 ELSE2821: ; preds = %ELSE2818 - %308 = fsub float %56, undef - %309 = fsub float %57, undef - %310 = fsub float %58, undef - %311 = fmul float %308, undef - %312 = fmul float %309, 0.000000e+00 - %313 = fmul float %310, undef - %314 = fsub float %59, undef - %315 = fsub float %60, undef - %316 = fsub float %61, undef - %317 = fmul float %314, undef - %318 = fmul float %315, undef - %319 = fmul float %316, undef + %308 = fsub nexc nrnd float %56, undef + %309 = fsub nexc nrnd float %57, undef + %310 = fsub nexc nrnd float %58, undef + %311 = fmul nexc nrnd float %308, undef + %312 = fmul nexc nrnd float %309, 0.000000e+00 + %313 = fmul nexc nrnd float %310, undef + %314 = fsub nexc nrnd float %59, undef + %315 = fsub nexc nrnd float %60, undef + %316 = fsub nexc nrnd float %61, undef + %317 = fmul nexc nrnd float %314, undef + %318 = fmul nexc nrnd float %315, undef + %319 = fmul nexc nrnd float %316, undef %320 = call float @llvm.maxnum.f32(float %311, float %317) %321 = call float @llvm.maxnum.f32(float %312, float %318) %322 = call float @llvm.maxnum.f32(float %313, float %319) Index: test/CodeGen/AMDGPU/subreg-coalescer-crash.ll =================================================================== --- test/CodeGen/AMDGPU/subreg-coalescer-crash.ll +++ test/CodeGen/AMDGPU/subreg-coalescer-crash.ll @@ -63,7 +63,7 @@ br i1 undef, label %bb7, label %bb4 bb7: ; preds = %bb6 - %tmp8 = fmul float undef, undef + %tmp8 = fmul nexc nrnd float undef, undef br label %bb4 bb9: ; preds = %bb2 @@ -78,8 +78,8 @@ bb14: ; preds = %bb27, %bb24, %bb9 %tmp15 = phi float [ %tmp12, %bb9 ], [ undef, %bb27 ], [ 0.000000e+00, %bb24 ] %tmp16 = phi float [ %tmp11, %bb9 ], [ undef, %bb27 ], [ %tmp25, %bb24 ] - %tmp17 = fmul float 10.5, %tmp16 - %tmp18 = fmul float 11.5, %tmp15 + %tmp17 = fmul nexc nrnd float 10.5, %tmp16 + %tmp18 = fmul nexc nrnd float 11.5, %tmp15 call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %tmp18, float %tmp17, float %tmp17, float %tmp17) ret void Index: test/CodeGen/AMDGPU/swizzle-export.ll =================================================================== --- test/CodeGen/AMDGPU/swizzle-export.ll +++ test/CodeGen/AMDGPU/swizzle-export.ll @@ -18,52 +18,52 @@ %7 = extractelement <4 x float> %6, i32 2 %8 = load <4 x float>, <4 x float> addrspace(8)* null %9 = extractelement <4 x float> %8, i32 0 - %10 = fmul float 0.000000e+00, %9 + %10 = fmul nexc nrnd float 0.000000e+00, %9 %11 = load <4 x float>, <4 x float> addrspace(8)* null %12 = extractelement <4 x float> %11, i32 0 - %13 = fmul float %5, %12 + %13 = fmul nexc nrnd float %5, %12 %14 = load <4 x float>, <4 x float> addrspace(8)* null %15 = extractelement <4 x float> %14, i32 0 - %16 = fmul float 0.000000e+00, %15 + %16 = fmul nexc nrnd float 0.000000e+00, %15 %17 = load <4 x float>, <4 x float> addrspace(8)* null %18 = extractelement <4 x float> %17, i32 0 - %19 = fmul float 0.000000e+00, %18 + %19 = fmul nexc nrnd float 0.000000e+00, %18 %20 = load <4 x float>, <4 x float> addrspace(8)* null %21 = extractelement <4 x float> %20, i32 0 - %22 = fmul float %7, %21 + %22 = fmul nexc nrnd float %7, %21 %23 = load <4 x float>, <4 x float> addrspace(8)* null %24 = extractelement <4 x float> %23, i32 0 - %25 = fmul float 0.000000e+00, %24 + %25 = fmul nexc nrnd float 0.000000e+00, %24 %26 = load <4 x float>, <4 x float> addrspace(8)* null %27 = extractelement <4 x float> %26, i32 0 - %28 = fmul float 0.000000e+00, %27 + %28 = fmul nexc nrnd float 0.000000e+00, %27 %29 = load <4 x float>, <4 x float> addrspace(8)* null %30 = extractelement <4 x float> %29, i32 0 - %31 = fmul float 0.000000e+00, %30 + %31 = fmul nexc nrnd float 0.000000e+00, %30 %32 = load <4 x float>, <4 x float> addrspace(8)* null %33 = extractelement <4 x float> %32, i32 0 - %34 = fmul float 0.000000e+00, %33 + %34 = fmul nexc nrnd float 0.000000e+00, %33 %35 = load <4 x float>, <4 x float> addrspace(8)* null %36 = extractelement <4 x float> %35, i32 0 - %37 = fmul float 0.000000e+00, %36 + %37 = fmul nexc nrnd float 0.000000e+00, %36 %38 = load <4 x float>, <4 x float> addrspace(8)* null %39 = extractelement <4 x float> %38, i32 0 - %40 = fmul float 1.000000e+00, %39 + %40 = fmul nexc nrnd float 1.000000e+00, %39 %41 = load <4 x float>, <4 x float> addrspace(8)* null %42 = extractelement <4 x float> %41, i32 0 - %43 = fmul float 0.000000e+00, %42 + %43 = fmul nexc nrnd float 0.000000e+00, %42 %44 = load <4 x float>, <4 x float> addrspace(8)* null %45 = extractelement <4 x float> %44, i32 0 - %46 = fmul float 0.000000e+00, %45 + %46 = fmul nexc nrnd float 0.000000e+00, %45 %47 = load <4 x float>, <4 x float> addrspace(8)* null %48 = extractelement <4 x float> %47, i32 0 - %49 = fmul float 0.000000e+00, %48 + %49 = fmul nexc nrnd float 0.000000e+00, %48 %50 = load <4 x float>, <4 x float> addrspace(8)* null %51 = extractelement <4 x float> %50, i32 0 - %52 = fmul float 0.000000e+00, %51 + %52 = fmul nexc nrnd float 0.000000e+00, %51 %53 = load <4 x float>, <4 x float> addrspace(8)* null %54 = extractelement <4 x float> %53, i32 0 - %55 = fmul float 1.000000e+00, %54 + %55 = fmul nexc nrnd float 1.000000e+00, %54 %56 = insertelement <4 x float> undef, float %0, i32 0 %57 = insertelement <4 x float> %56, float %1, i32 1 %58 = insertelement <4 x float> %57, float %2, i32 2 @@ -100,8 +100,8 @@ main_body: %0 = extractelement <4 x float> %reg1, i32 0 %1 = extractelement <4 x float> %reg1, i32 1 - %2 = fadd float %0, 2.5 - %3 = fmul float %1, 3.5 + %2 = fadd nexc nrnd float %0, 2.5 + %3 = fmul nexc nrnd float %1, 3.5 %4 = load <4 x float>, <4 x float> addrspace(8)* getelementptr ([1024 x <4 x float>], [1024 x <4 x float>] addrspace(8)* null, i64 0, i32 1) %5 = extractelement <4 x float> %4, i32 0 %6 = call float @llvm.cos.f32(float %5) Index: test/CodeGen/AMDGPU/tex-clause-antidep.ll =================================================================== --- test/CodeGen/AMDGPU/tex-clause-antidep.ll +++ test/CodeGen/AMDGPU/tex-clause-antidep.ll @@ -14,7 +14,7 @@ %8 = insertelement <4 x float> %7, float %4, i32 3 %9 = call <4 x float> @llvm.R600.tex(<4 x float> %8, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) %10 = call <4 x float> @llvm.R600.tex(<4 x float> %8, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) - %11 = fadd <4 x float> %9, %10 + %11 = fadd nexc nrnd <4 x float> %9, %10 call void @llvm.R600.store.swizzle(<4 x float> %11, i32 0, i32 0) ret void } Index: test/CodeGen/AMDGPU/texture-input-merge.ll =================================================================== --- test/CodeGen/AMDGPU/texture-input-merge.ll +++ test/CodeGen/AMDGPU/texture-input-merge.ll @@ -7,10 +7,10 @@ %2 = extractelement <4 x float> %reg0, i32 1 %3 = extractelement <4 x float> %reg0, i32 2 %4 = extractelement <4 x float> %reg0, i32 3 - %5 = fmul float %1, 3.0 - %6 = fmul float %2, 3.0 - %7 = fmul float %3, 3.0 - %8 = fmul float %4, 3.0 + %5 = fmul nexc nrnd float %1, 3.0 + %6 = fmul nexc nrnd float %2, 3.0 + %7 = fmul nexc nrnd float %3, 3.0 + %8 = fmul nexc nrnd float %4, 3.0 %9 = insertelement <4 x float> undef, float %5, i32 0 %10 = insertelement <4 x float> %9, float %6, i32 1 %11 = insertelement <4 x float> undef, float %7, i32 0 @@ -19,8 +19,8 @@ %14 = call <4 x float> @llvm.R600.tex(<4 x float> %10, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) %15 = call <4 x float> @llvm.R600.tex(<4 x float> %12, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) %16 = call <4 x float> @llvm.R600.tex(<4 x float> %13, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) - %17 = fadd <4 x float> %14, %15 - %18 = fadd <4 x float> %17, %16 + %17 = fadd nexc nrnd <4 x float> %14, %15 + %18 = fadd nexc nrnd <4 x float> %17, %16 call void @llvm.R600.store.swizzle(<4 x float> %18, i32 0, i32 0) ret void } Index: test/CodeGen/AMDGPU/use-sgpr-multiple-times.ll =================================================================== --- test/CodeGen/AMDGPU/use-sgpr-multiple-times.ll +++ test/CodeGen/AMDGPU/use-sgpr-multiple-times.ll @@ -12,7 +12,7 @@ ; GCN: v_add_f32_e64 [[RESULT:v[0-9]+]], [[SGPR]], [[SGPR]] ; GCN: buffer_store_dword [[RESULT]] define void @test_sgpr_use_twice_binop(float addrspace(1)* %out, float %a) #0 { - %dbl = fadd float %a, %a + %dbl = fadd nexc nrnd float %a, %a store float %dbl, float addrspace(1)* %out, align 4 ret void } Index: test/CodeGen/AMDGPU/v_mac.ll =================================================================== --- test/CodeGen/AMDGPU/v_mac.ll +++ test/CodeGen/AMDGPU/v_mac.ll @@ -16,8 +16,8 @@ %b = load float, float addrspace(1)* %b_ptr %c = load float, float addrspace(1)* %c_ptr - %tmp0 = fmul float %a, %b - %tmp1 = fadd float %tmp0, %c + %tmp0 = fmul nexc nrnd float %a, %b + %tmp1 = fadd nexc nrnd float %tmp0, %c store float %tmp1, float addrspace(1)* %out ret void } @@ -27,8 +27,8 @@ ; GCN: v_mad_f32 v{{[0-9]}}, 0.5, s{{[0-9]+}}, 0.5 define void @mad_inline_sgpr_inline(float addrspace(1)* %out, float %in) { entry: - %tmp0 = fmul float 0.5, %in - %tmp1 = fadd float %tmp0, 0.5 + %tmp0 = fmul nexc nrnd float 0.5, %in + %tmp1 = fadd nexc nrnd float %tmp0, 0.5 store float %tmp1, float addrspace(1)* %out ret void } @@ -43,8 +43,8 @@ %a = load float, float addrspace(1)* %in %b = load float, float addrspace(1)* %b_ptr - %tmp0 = fmul float %a, %b - %tmp1 = fadd float %tmp0, %c + %tmp0 = fmul nexc nrnd float %a, %b + %tmp1 = fadd nexc nrnd float %tmp0, %c store float %tmp1, float addrspace(1)* %out ret void } @@ -55,8 +55,8 @@ entry: %c = load float, float addrspace(1)* %in - %tmp0 = fmul float %a, %a - %tmp1 = fadd float %tmp0, %c + %tmp0 = fmul nexc nrnd float %a, %a + %tmp1 = fadd nexc nrnd float %tmp0, %c store float %tmp1, float addrspace(1)* %out ret void } @@ -77,11 +77,11 @@ %d = load float, float addrspace(1)* %d_ptr %e = load float, float addrspace(1)* %e_ptr - %tmp0 = fmul float %a, %b - %tmp1 = fadd float %tmp0, %c + %tmp0 = fmul nexc nrnd float %a, %b + %tmp1 = fadd nexc nrnd float %tmp0, %c - %tmp2 = fmul float %d, %e - %tmp3 = fadd float %tmp2, %c + %tmp2 = fmul nexc nrnd float %d, %e + %tmp3 = fadd nexc nrnd float %tmp2, %c %out1 = getelementptr float, float addrspace(1)* %out, i32 1 store float %tmp1, float addrspace(1)* %out @@ -104,9 +104,9 @@ %b = load float, float addrspace(1)* %b_ptr %c = load float, float addrspace(1)* %c_ptr - %neg_a = fsub float 0.0, %a - %tmp0 = fmul float %neg_a, %b - %tmp1 = fadd float %tmp0, %c + %neg_a = fsub nexc nrnd float 0.0, %a + %tmp0 = fmul nexc nrnd float %neg_a, %b + %tmp1 = fadd nexc nrnd float %tmp0, %c store float %tmp1, float addrspace(1)* %out ret void @@ -124,9 +124,9 @@ %b = load float, float addrspace(1)* %b_ptr %c = load float, float addrspace(1)* %c_ptr - %neg_b = fsub float 0.0, %b - %tmp0 = fmul float %a, %neg_b - %tmp1 = fadd float %tmp0, %c + %neg_b = fsub nexc nrnd float 0.0, %b + %tmp0 = fmul nexc nrnd float %a, %neg_b + %tmp1 = fadd nexc nrnd float %tmp0, %c store float %tmp1, float addrspace(1)* %out ret void @@ -144,9 +144,9 @@ %b = load float, float addrspace(1)* %b_ptr %c = load float, float addrspace(1)* %c_ptr - %neg_c = fsub float 0.0, %c - %tmp0 = fmul float %a, %b - %tmp1 = fadd float %tmp0, %neg_c + %neg_c = fsub nexc nrnd float 0.0, %c + %tmp0 = fmul nexc nrnd float %a, %b + %tmp1 = fadd nexc nrnd float %tmp0, %neg_c store float %tmp1, float addrspace(1)* %out ret void Index: test/CodeGen/AMDGPU/vop-shrink.ll =================================================================== --- test/CodeGen/AMDGPU/vop-shrink.ll +++ test/CodeGen/AMDGPU/vop-shrink.ll @@ -39,7 +39,7 @@ entry: %tmp = call i32 @llvm.r600.read.tidig.x() %tmp1 = uitofp i32 %tmp to float - %tmp2 = fadd float %tmp1, 1.024000e+03 + %tmp2 = fadd nexc nrnd float %tmp1, 1.024000e+03 store float %tmp2, float addrspace(1)* %out ret void } Index: test/CodeGen/ARM/2009-11-07-SubRegAsmPrinting.ll =================================================================== --- test/CodeGen/ARM/2009-11-07-SubRegAsmPrinting.ll +++ test/CodeGen/ARM/2009-11-07-SubRegAsmPrinting.ll @@ -7,48 +7,48 @@ define arm_aapcs_vfpcc void @foo() { entry: %0 = load float, float* null, align 4 ; [#uses=2] - %1 = fmul float %0, undef ; [#uses=2] - %2 = fmul float 0.000000e+00, %1 ; [#uses=2] - %3 = fmul float %0, %1 ; [#uses=1] - %4 = fadd float 0.000000e+00, %3 ; [#uses=1] - %5 = fsub float 1.000000e+00, %4 ; [#uses=1] + %1 = fmul nexc nrnd float %0, undef ; [#uses=2] + %2 = fmul nexc nrnd float 0.000000e+00, %1 ; [#uses=2] + %3 = fmul nexc nrnd float %0, %1 ; [#uses=1] + %4 = fadd nexc nrnd float 0.000000e+00, %3 ; [#uses=1] + %5 = fsub nexc nrnd float 1.000000e+00, %4 ; [#uses=1] ; CHECK-LABEL: foo: ; CHECK: vmov.f32 s{{[0-9]+}}, #1.000000e+00 - %6 = fsub float 1.000000e+00, undef ; [#uses=2] - %7 = fsub float %2, undef ; [#uses=1] - %8 = fsub float 0.000000e+00, undef ; [#uses=3] - %9 = fadd float %2, undef ; [#uses=3] + %6 = fsub nexc nrnd float 1.000000e+00, undef ; [#uses=2] + %7 = fsub nexc nrnd float %2, undef ; [#uses=1] + %8 = fsub nexc nrnd float 0.000000e+00, undef ; [#uses=3] + %9 = fadd nexc nrnd float %2, undef ; [#uses=3] %10 = load float, float* undef, align 8 ; [#uses=3] - %11 = fmul float %8, %10 ; [#uses=1] - %12 = fadd float undef, %11 ; [#uses=2] - %13 = fmul float undef, undef ; [#uses=1] - %14 = fmul float %6, 0.000000e+00 ; [#uses=1] - %15 = fadd float %13, %14 ; [#uses=1] - %16 = fmul float %9, %10 ; [#uses=1] - %17 = fadd float %15, %16 ; [#uses=2] - %18 = fmul float 0.000000e+00, undef ; [#uses=1] - %19 = fadd float %18, 0.000000e+00 ; [#uses=1] - %20 = fmul float undef, %10 ; [#uses=1] - %21 = fadd float %19, %20 ; [#uses=1] + %11 = fmul nexc nrnd float %8, %10 ; [#uses=1] + %12 = fadd nexc nrnd float undef, %11 ; [#uses=2] + %13 = fmul nexc nrnd float undef, undef ; [#uses=1] + %14 = fmul nexc nrnd float %6, 0.000000e+00 ; [#uses=1] + %15 = fadd nexc nrnd float %13, %14 ; [#uses=1] + %16 = fmul nexc nrnd float %9, %10 ; [#uses=1] + %17 = fadd nexc nrnd float %15, %16 ; [#uses=2] + %18 = fmul nexc nrnd float 0.000000e+00, undef ; [#uses=1] + %19 = fadd nexc nrnd float %18, 0.000000e+00 ; [#uses=1] + %20 = fmul nexc nrnd float undef, %10 ; [#uses=1] + %21 = fadd nexc nrnd float %19, %20 ; [#uses=1] %22 = load float, float* undef, align 8 ; [#uses=1] - %23 = fmul float %5, %22 ; [#uses=1] - %24 = fadd float %23, undef ; [#uses=1] + %23 = fmul nexc nrnd float %5, %22 ; [#uses=1] + %24 = fadd nexc nrnd float %23, undef ; [#uses=1] %25 = load float, float* undef, align 8 ; [#uses=2] - %26 = fmul float %8, %25 ; [#uses=1] - %27 = fadd float %24, %26 ; [#uses=1] - %28 = fmul float %9, %25 ; [#uses=1] - %29 = fadd float undef, %28 ; [#uses=1] - %30 = fmul float %8, undef ; [#uses=1] - %31 = fadd float undef, %30 ; [#uses=1] - %32 = fmul float %6, undef ; [#uses=1] - %33 = fadd float undef, %32 ; [#uses=1] - %34 = fmul float %9, undef ; [#uses=1] - %35 = fadd float %33, %34 ; [#uses=1] - %36 = fmul float 0.000000e+00, undef ; [#uses=1] - %37 = fmul float %7, undef ; [#uses=1] - %38 = fadd float %36, %37 ; [#uses=1] - %39 = fmul float undef, undef ; [#uses=1] - %40 = fadd float %38, %39 ; [#uses=1] + %26 = fmul nexc nrnd float %8, %25 ; [#uses=1] + %27 = fadd nexc nrnd float %24, %26 ; [#uses=1] + %28 = fmul nexc nrnd float %9, %25 ; [#uses=1] + %29 = fadd nexc nrnd float undef, %28 ; [#uses=1] + %30 = fmul nexc nrnd float %8, undef ; [#uses=1] + %31 = fadd nexc nrnd float undef, %30 ; [#uses=1] + %32 = fmul nexc nrnd float %6, undef ; [#uses=1] + %33 = fadd nexc nrnd float undef, %32 ; [#uses=1] + %34 = fmul nexc nrnd float %9, undef ; [#uses=1] + %35 = fadd nexc nrnd float %33, %34 ; [#uses=1] + %36 = fmul nexc nrnd float 0.000000e+00, undef ; [#uses=1] + %37 = fmul nexc nrnd float %7, undef ; [#uses=1] + %38 = fadd nexc nrnd float %36, %37 ; [#uses=1] + %39 = fmul nexc nrnd float undef, undef ; [#uses=1] + %40 = fadd nexc nrnd float %38, %39 ; [#uses=1] store float %12, float* undef, align 8 store float %17, float* undef, align 4 store float %21, float* undef, align 8 @@ -57,10 +57,10 @@ store float %31, float* undef, align 8 store float %40, float* undef, align 8 store float %12, float* null, align 8 - %41 = fmul float %17, undef ; [#uses=1] - %42 = fadd float %41, undef ; [#uses=1] - %43 = fmul float %35, undef ; [#uses=1] - %44 = fadd float %42, %43 ; [#uses=1] + %41 = fmul nexc nrnd float %17, undef ; [#uses=1] + %42 = fadd nexc nrnd float %41, undef ; [#uses=1] + %43 = fmul nexc nrnd float %35, undef ; [#uses=1] + %44 = fadd nexc nrnd float %42, %43 ; [#uses=1] store float %44, float* null, align 4 unreachable } Index: test/CodeGen/ARM/a15-mla.ll =================================================================== --- test/CodeGen/ARM/a15-mla.ll +++ test/CodeGen/ARM/a15-mla.ll @@ -17,8 +17,8 @@ ; CHECK: fun_b: define <4 x float> @fun_b(<4 x float> %x, <4 x float> %y, <4 x float> %z) nounwind{ ; CHECK: vmla.f32 - %t = fmul <4 x float> %x, %y - %r = fadd <4 x float> %t, %z + %t = fmul nexc nrnd <4 x float> %x, %y + %r = fadd nexc nrnd <4 x float> %t, %z ret <4 x float> %r } @@ -27,11 +27,11 @@ ; CHECK: fun_c: define <4 x float> @fun_c(<4 x float> %x, <4 x float> %y, <4 x float> %z, <4 x float> %u, <4 x float> %v) nounwind{ ; CHECK: vmla.f32 - %t1 = fmul <4 x float> %x, %y - %r1 = fadd <4 x float> %t1, %z + %t1 = fmul nexc nrnd <4 x float> %x, %y + %r1 = fadd nexc nrnd <4 x float> %t1, %z ; CHECK: vmla.f32 - %t2 = fmul <4 x float> %u, %v - %r2 = fadd <4 x float> %t2, %r1 + %t2 = fmul nexc nrnd <4 x float> %u, %v + %r2 = fadd nexc nrnd <4 x float> %t2, %r1 ret <4 x float> %r2 } Index: test/CodeGen/ARM/crash-greedy.ll =================================================================== --- test/CodeGen/ARM/crash-greedy.ll +++ test/CodeGen/ARM/crash-greedy.ll @@ -10,50 +10,50 @@ define void @remat_subreg(float* nocapture %x, i32* %y, i32 %n, i32 %z, float %c, float %lambda, float* nocapture %ret_f, float* nocapture %ret_df) nounwind { entry: %conv16 = fpext float %lambda to double - %mul17 = fmul double %conv16, -1.000000e+00 + %mul17 = fmul nexc nrnd double %conv16, -1.000000e+00 br i1 undef, label %cond.end.us, label %cond.end cond.end.us: ; preds = %entry unreachable cond.end: ; preds = %cond.end, %entry - %mul = fmul double undef, 0.000000e+00 - %add = fadd double undef, %mul - %add46 = fadd double undef, undef - %add75 = fadd double 0.000000e+00, undef + %mul = fmul nexc nrnd double undef, 0.000000e+00 + %add = fadd nexc nrnd double undef, %mul + %add46 = fadd nexc nrnd double undef, undef + %add75 = fadd nexc nrnd double 0.000000e+00, undef br i1 undef, label %for.end, label %cond.end for.end: ; preds = %cond.end %conv78 = sitofp i32 %z to double %conv83 = fpext float %c to double - %mul84 = fmul double %mul17, %conv83 + %mul84 = fmul nexc nrnd double %mul17, %conv83 %call85 = tail call double @exp(double %mul84) nounwind - %mul86 = fmul double %conv78, %call85 - %add88 = fadd double 0.000000e+00, %mul86 + %mul86 = fmul nexc nrnd double %conv78, %call85 + %add88 = fadd nexc nrnd double 0.000000e+00, %mul86 ; CHECK: blx _exp %call100 = tail call double @exp(double %mul84) nounwind - %mul101 = fmul double undef, %call100 - %add103 = fadd double %add46, %mul101 - %mul111 = fmul double undef, %conv83 - %mul119 = fmul double %mul111, undef - %add121 = fadd double undef, %mul119 - %div = fdiv double 1.000000e+00, %conv16 - %div126 = fdiv double %add, %add75 - %sub = fsub double %div, %div126 - %div129 = fdiv double %add103, %add88 - %add130 = fadd double %sub, %div129 + %mul101 = fmul nexc nrnd double undef, %call100 + %add103 = fadd nexc nrnd double %add46, %mul101 + %mul111 = fmul nexc nrnd double undef, %conv83 + %mul119 = fmul nexc nrnd double %mul111, undef + %add121 = fadd nexc nrnd double undef, %mul119 + %div = fdiv nexc nrnd double 1.000000e+00, %conv16 + %div126 = fdiv nexc nrnd double %add, %add75 + %sub = fsub nexc nrnd double %div, %div126 + %div129 = fdiv nexc nrnd double %add103, %add88 + %add130 = fadd nexc nrnd double %sub, %div129 %conv131 = fptrunc double %add130 to float store float %conv131, float* %ret_f, align 4 - %mul139 = fmul double %div129, %div129 - %div142 = fdiv double %add121, %add88 - %sub143 = fsub double %mul139, %div142 + %mul139 = fmul nexc nrnd double %div129, %div129 + %div142 = fdiv nexc nrnd double %add121, %add88 + %sub143 = fsub nexc nrnd double %mul139, %div142 ; %lambda is passed on the stack, and the stack slot load is rematerialized. ; The rematted load of a float constrains the D register used for the mul. ; CHECK: vldr - %mul146 = fmul float %lambda, %lambda + %mul146 = fmul nexc nrnd float %lambda, %lambda %conv147 = fpext float %mul146 to double - %div148 = fdiv double 1.000000e+00, %conv147 - %sub149 = fsub double %sub143, %div148 + %div148 = fdiv nexc nrnd double 1.000000e+00, %conv147 + %sub149 = fsub nexc nrnd double %sub143, %div148 %conv150 = fptrunc double %sub149 to float store float %conv150, float* %ret_df, align 4 ret void @@ -71,11 +71,11 @@ br i1 undef, label %if.end251, label %if.then195 if.then195: ; preds = %if.then84 - %div = fdiv float 1.000000e+00, undef + %div = fdiv nexc nrnd float 1.000000e+00, undef %vecinit207 = insertelement <4 x float> undef, float %div, i32 1 %vecinit208 = insertelement <4 x float> %vecinit207, float 1.000000e+00, i32 2 %vecinit209 = insertelement <4 x float> %vecinit208, float 1.000000e+00, i32 3 - %mul216 = fmul <4 x float> zeroinitializer, %vecinit209 + %mul216 = fmul nexc nrnd <4 x float> zeroinitializer, %vecinit209 store <4 x float> %mul216, <4 x float>* undef, align 16 br label %if.end251 Index: test/CodeGen/ARM/darwin-eabi.ll =================================================================== --- test/CodeGen/ARM/darwin-eabi.ll +++ test/CodeGen/ARM/darwin-eabi.ll @@ -4,7 +4,7 @@ ; RUN: llc -mtriple=thumbv7-apple-darwin -mcpu=cortex-m4 < %s | FileCheck %s --check-prefix=CHECK-M4 define float @float_op(float %lhs, float %rhs) { - %sum = fadd float %lhs, %rhs + %sum = fadd nexc nrnd float %lhs, %rhs ret float %sum ; CHECK-M3-LABEL: float_op: ; CHECK-M3: bl ___addsf3 @@ -14,7 +14,7 @@ } define double @double_op(double %lhs, double %rhs) { - %sum = fadd double %lhs, %rhs + %sum = fadd nexc nrnd double %lhs, %rhs ret double %sum ; CHECK-M3-LABEL: double_op: ; CHECK-M3: bl ___adddf3 Index: test/CodeGen/ARM/debug-info-branch-folding.ll =================================================================== --- test/CodeGen/ARM/debug-info-branch-folding.ll +++ test/CodeGen/ARM/debug-info-branch-folding.ll @@ -19,9 +19,9 @@ br label %for.body9 for.body9: ; preds = %for.body9, %entry - %add19 = fadd <4 x float> undef, , !dbg !39 + %add19 = fadd nexc nrnd <4 x float> undef, , !dbg !39 tail call void @llvm.dbg.value(metadata <4 x float> %add19, i64 0, metadata !27, metadata !DIExpression()), !dbg !39 - %add20 = fadd <4 x float> undef, , !dbg !39 + %add20 = fadd nexc nrnd <4 x float> undef, , !dbg !39 tail call void @llvm.dbg.value(metadata <4 x float> %add20, i64 0, metadata !28, metadata !DIExpression()), !dbg !39 br i1 %cond, label %for.end54, label %for.body9, !dbg !44 Index: test/CodeGen/ARM/debug-info-d16-reg.ll =================================================================== --- test/CodeGen/ARM/debug-info-d16-reg.ll +++ test/CodeGen/ARM/debug-info-d16-reg.ll @@ -39,7 +39,7 @@ tail call void @llvm.dbg.value(metadata i32 %argc, i64 0, metadata !22, metadata !DIExpression()), !dbg !34 tail call void @llvm.dbg.value(metadata i8** %argv, i64 0, metadata !23, metadata !DIExpression()), !dbg !34 %0 = sitofp i32 %argc to double, !dbg !35 - %1 = fadd double %0, 5.555552e+05, !dbg !35 + %1 = fadd nexc nrnd double %0, 5.555552e+05, !dbg !35 tail call void @llvm.dbg.value(metadata double %1, i64 0, metadata !24, metadata !DIExpression()), !dbg !35 %2 = tail call i32 @puts(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str1, i32 0, i32 0)) nounwind, !dbg !36 %3 = getelementptr inbounds i8, i8* bitcast (i32 (i32, i8**)* @main to i8*), i32 %argc, !dbg !37 Index: test/CodeGen/ARM/debug-info-qreg.ll =================================================================== --- test/CodeGen/ARM/debug-info-qreg.ll +++ test/CodeGen/ARM/debug-info-qreg.ll @@ -20,7 +20,7 @@ br label %for.body9 for.body9: ; preds = %for.body9, %entry - %add19 = fadd <4 x float> undef, , !dbg !39 + %add19 = fadd nexc nrnd <4 x float> undef, , !dbg !39 br i1 undef, label %for.end54, label %for.body9, !dbg !44 for.end54: ; preds = %for.body9 Index: test/CodeGen/ARM/fmacs.ll =================================================================== --- test/CodeGen/ARM/fmacs.ll +++ test/CodeGen/ARM/fmacs.ll @@ -15,8 +15,8 @@ ; A8-LABEL: t1: ; A8: vmul.f32 ; A8: vadd.f32 - %0 = fmul float %a, %b - %1 = fadd float %acc, %0 + %0 = fmul nexc nrnd float %a, %b + %1 = fadd nexc nrnd float %acc, %0 ret float %1 } @@ -31,8 +31,8 @@ ; A8-LABEL: t2: ; A8: vmul.f64 ; A8: vadd.f64 - %0 = fmul double %a, %b - %1 = fadd double %acc, %0 + %0 = fmul nexc nrnd double %a, %b + %1 = fadd nexc nrnd double %acc, %0 ret double %1 } @@ -47,8 +47,8 @@ ; A8-LABEL: t3: ; A8: vmul.f32 ; A8: vadd.f32 - %0 = fmul float %a, %b - %1 = fadd float %0, %acc + %0 = fmul nexc nrnd float %a, %b + %1 = fadd nexc nrnd float %0, %acc ret float %1 } @@ -70,10 +70,10 @@ ; HARD-LABEL: t4: ; HARD: vmla.f32 s0, s1, s2 ; HARD: vmla.f32 s3, s1, s4 - %0 = fmul float %a, %b - %1 = fadd float %acc1, %0 - %2 = fmul float %a, %c - %3 = fadd float %acc2, %2 + %0 = fmul nexc nrnd float %a, %b + %1 = fadd nexc nrnd float %acc1, %0 + %2 = fmul nexc nrnd float %a, %c + %3 = fadd nexc nrnd float %acc2, %2 store float %1, float* %P1 store float %3, float* %P2 ret void @@ -96,9 +96,9 @@ ; HARD: vmla.f32 s4, s0, s1 ; HARD: vmul.f32 s0, s2, s3 ; HARD: vadd.f32 s0, s4, s0 - %0 = fmul float %a, %b - %1 = fadd float %e, %0 - %2 = fmul float %c, %d - %3 = fadd float %1, %2 + %0 = fmul nexc nrnd float %a, %b + %1 = fadd nexc nrnd float %e, %0 + %2 = fmul nexc nrnd float %c, %d + %3 = fadd nexc nrnd float %1, %2 ret float %3 } Index: test/CodeGen/ARM/fmscs.ll =================================================================== --- test/CodeGen/ARM/fmscs.ll +++ test/CodeGen/ARM/fmscs.ll @@ -13,8 +13,8 @@ ; A8-LABEL: t1: ; A8: vmul.f32 ; A8: vsub.f32 - %0 = fmul float %a, %b - %1 = fsub float %0, %acc + %0 = fmul nexc nrnd float %a, %b + %1 = fsub nexc nrnd float %0, %acc ret float %1 } @@ -29,7 +29,7 @@ ; A8-LABEL: t2: ; A8: vmul.f64 ; A8: vsub.f64 - %0 = fmul double %a, %b - %1 = fsub double %0, %acc + %0 = fmul nexc nrnd double %a, %b + %1 = fsub nexc nrnd double %0, %acc ret double %1 } Index: test/CodeGen/ARM/fnegs.ll =================================================================== --- test/CodeGen/ARM/fnegs.ll +++ test/CodeGen/ARM/fnegs.ll @@ -22,7 +22,7 @@ define float @test1(float* %a) { entry: %0 = load float, float* %a, align 4 ; [#uses=2] - %1 = fsub float -0.000000e+00, %0 ; [#uses=2] + %1 = fsub nexc nrnd float -0.000000e+00, %0 ; [#uses=2] %2 = fpext float %1 to double ; [#uses=1] %3 = fcmp olt double %2, 1.234000e+00 ; [#uses=1] %retval = select i1 %3, float %1, float %0 ; [#uses=1] @@ -49,7 +49,7 @@ define float @test2(float* %a) { entry: %0 = load float, float* %a, align 4 ; [#uses=2] - %1 = fmul float -1.000000e+00, %0 ; [#uses=2] + %1 = fmul nexc nrnd float -1.000000e+00, %0 ; [#uses=2] %2 = fpext float %1 to double ; [#uses=1] %3 = fcmp olt double %2, 1.234000e+00 ; [#uses=1] %retval = select i1 %3, float %1, float %0 ; [#uses=1] @@ -86,7 +86,7 @@ define <2 x float> @fneg_bitcast(i64 %i) { %bitcast = bitcast i64 %i to <2 x float> - %fneg = fsub <2 x float> , %bitcast + %fneg = fsub nexc nrnd <2 x float> , %bitcast ret <2 x float> %fneg } ; VFP2-LABEL: fneg_bitcast: Index: test/CodeGen/ARM/fnmacs.ll =================================================================== --- test/CodeGen/ARM/fnmacs.ll +++ test/CodeGen/ARM/fnmacs.ll @@ -13,8 +13,8 @@ ; A8-LABEL: t1: ; A8: vmul.f32 ; A8: vsub.f32 - %0 = fmul float %a, %b - %1 = fsub float %acc, %0 + %0 = fmul nexc nrnd float %a, %b + %1 = fsub nexc nrnd float %acc, %0 ret float %1 } @@ -29,7 +29,7 @@ ; A8-LABEL: t2: ; A8: vmul.f64 ; A8: vsub.f64 - %0 = fmul double %a, %b - %1 = fsub double %acc, %0 + %0 = fmul nexc nrnd double %a, %b + %1 = fsub nexc nrnd double %acc, %0 ret double %1 } Index: test/CodeGen/ARM/fnmscs.ll =================================================================== --- test/CodeGen/ARM/fnmscs.ll +++ test/CodeGen/ARM/fnmscs.ll @@ -31,9 +31,9 @@ ; A8-LABEL: t1: ; A8: vnmul.f32 s{{[0-9]}}, s{{[0-9]}}, s{{[0-9]}} ; A8: vsub.f32 s{{[0-9]}}, s{{[0-9]}}, s{{[0-9]}} - %0 = fmul float %a, %b - %1 = fsub float -0.0, %0 - %2 = fsub float %1, %acc + %0 = fmul nexc nrnd float %a, %b + %1 = fsub nexc nrnd float -0.0, %0 + %2 = fsub nexc nrnd float %1, %acc ret float %2 } @@ -52,9 +52,9 @@ ; A8-LABEL: t2: ; A8: vnmul.f32 s{{[01234]}}, s{{[01234]}}, s{{[01234]}} ; A8: vsub.f32 s{{[0-9]}}, s{{[0-9]}}, s{{[0-9]}} - %0 = fmul float %a, %b - %1 = fmul float -1.0, %0 - %2 = fsub float %1, %acc + %0 = fmul nexc nrnd float %a, %b + %1 = fmul nexc nrnd float -1.0, %0 + %2 = fsub nexc nrnd float %1, %acc ret float %2 } @@ -73,9 +73,9 @@ ; A8-LABEL: t3: ; A8: vnmul.f64 d ; A8: vsub.f64 d - %0 = fmul double %a, %b - %1 = fsub double -0.0, %0 - %2 = fsub double %1, %acc + %0 = fmul nexc nrnd double %a, %b + %1 = fsub nexc nrnd double -0.0, %0 + %2 = fsub nexc nrnd double %1, %acc ret double %2 } @@ -94,8 +94,8 @@ ; A8-LABEL: t4: ; A8: vnmul.f64 d ; A8: vsub.f64 d - %0 = fmul double %a, %b - %1 = fmul double -1.0, %0 - %2 = fsub double %1, %acc + %0 = fmul nexc nrnd double %a, %b + %1 = fmul nexc nrnd double -1.0, %0 + %2 = fsub nexc nrnd double %1, %acc ret double %2 } Index: test/CodeGen/ARM/fnmul.ll =================================================================== --- test/CodeGen/ARM/fnmul.ll +++ test/CodeGen/ARM/fnmul.ll @@ -7,8 +7,8 @@ define double @t1(double %a, double %b) { entry: - %tmp2 = fsub double -0.000000e+00, %a ; [#uses=1] - %tmp4 = fmul double %tmp2, %b ; [#uses=1] + %tmp2 = fsub nexc nrnd double -0.000000e+00, %a ; [#uses=1] + %tmp4 = fmul nexc nrnd double %tmp2, %b ; [#uses=1] ret double %tmp4 } Index: test/CodeGen/ARM/fnmuls.ll =================================================================== --- test/CodeGen/ARM/fnmuls.ll +++ test/CodeGen/ARM/fnmuls.ll @@ -6,16 +6,16 @@ define arm_aapcs_vfpcc float @test1(float %a, float %b) nounwind { ; CHECK: vnmul.f32 s0, s0, s1 entry: - %0 = fmul float %a, %b - %1 = fsub float -0.0, %0 + %0 = fmul nexc nrnd float %a, %b + %1 = fsub nexc nrnd float -0.0, %0 ret float %1 } define arm_aapcs_vfpcc float @test2(float %a, float %b) nounwind { ; CHECK: vnmul.f32 s0, s0, s1 entry: - %0 = fmul float %a, %b - %1 = fmul float -1.0, %0 + %0 = fmul nexc nrnd float %a, %b + %1 = fmul nexc nrnd float -1.0, %0 ret float %1 } Index: test/CodeGen/ARM/fp-fast.ll =================================================================== --- test/CodeGen/ARM/fp-fast.ll +++ test/CodeGen/ARM/fp-fast.ll @@ -6,7 +6,7 @@ ; CHECK-NOT: vfma ; CHECK: vmul.f32 ; CHECK-NOT: vfma - %t1 = fmul float %x, 3.0 + %t1 = fmul nexc nrnd float %x, 3.0 %t2 = call float @llvm.fma.f32(float %x, float 2.0, float %t1) ret float %t2 } @@ -16,7 +16,7 @@ ; CHECK-NOT: vmul ; CHECK: vfma.f32 ; CHECK-NOT: vmul - %t1 = fmul float %x, 3.0 + %t1 = fmul nexc nrnd float %x, 3.0 %t2 = call float @llvm.fma.f32(float %t1, float 2.0, float %y) ret float %t2 } @@ -53,7 +53,7 @@ ; CHECK-NOT: vfma ; CHECK: vmul.f32 ; CHECK-NOT: vfma - %t1 = fsub float -0.0, %x + %t1 = fsub nexc nrnd float -0.0, %x %t2 = call float @llvm.fma.f32(float %x, float 5.0, float %t1) ret float %t2 } Index: test/CodeGen/ARM/fusedMAC.ll =================================================================== --- test/CodeGen/ARM/fusedMAC.ll +++ test/CodeGen/ARM/fusedMAC.ll @@ -4,98 +4,98 @@ define double @fusedMACTest1(double %d1, double %d2, double %d3) { ;CHECK-LABEL: fusedMACTest1: ;CHECK: vfma.f64 - %1 = fmul double %d1, %d2 - %2 = fadd double %1, %d3 + %1 = fmul nexc nrnd double %d1, %d2 + %2 = fadd nexc nrnd double %1, %d3 ret double %2 } define float @fusedMACTest2(float %f1, float %f2, float %f3) { ;CHECK-LABEL: fusedMACTest2: ;CHECK: vfma.f32 - %1 = fmul float %f1, %f2 - %2 = fadd float %1, %f3 + %1 = fmul nexc nrnd float %f1, %f2 + %2 = fadd nexc nrnd float %1, %f3 ret float %2 } define double @fusedMACTest3(double %d1, double %d2, double %d3) { ;CHECK-LABEL: fusedMACTest3: ;CHECK: vfms.f64 - %1 = fmul double %d2, %d3 - %2 = fsub double %d1, %1 + %1 = fmul nexc nrnd double %d2, %d3 + %2 = fsub nexc nrnd double %d1, %1 ret double %2 } define float @fusedMACTest4(float %f1, float %f2, float %f3) { ;CHECK-LABEL: fusedMACTest4: ;CHECK: vfms.f32 - %1 = fmul float %f2, %f3 - %2 = fsub float %f1, %1 + %1 = fmul nexc nrnd float %f2, %f3 + %2 = fsub nexc nrnd float %f1, %1 ret float %2 } define double @fusedMACTest5(double %d1, double %d2, double %d3) { ;CHECK-LABEL: fusedMACTest5: ;CHECK: vfnma.f64 - %1 = fmul double %d1, %d2 - %2 = fsub double -0.0, %1 - %3 = fsub double %2, %d3 + %1 = fmul nexc nrnd double %d1, %d2 + %2 = fsub nexc nrnd double -0.0, %1 + %3 = fsub nexc nrnd double %2, %d3 ret double %3 } define float @fusedMACTest6(float %f1, float %f2, float %f3) { ;CHECK-LABEL: fusedMACTest6: ;CHECK: vfnma.f32 - %1 = fmul float %f1, %f2 - %2 = fsub float -0.0, %1 - %3 = fsub float %2, %f3 + %1 = fmul nexc nrnd float %f1, %f2 + %2 = fsub nexc nrnd float -0.0, %1 + %3 = fsub nexc nrnd float %2, %f3 ret float %3 } define double @fusedMACTest7(double %d1, double %d2, double %d3) { ;CHECK-LABEL: fusedMACTest7: ;CHECK: vfnms.f64 - %1 = fmul double %d1, %d2 - %2 = fsub double %1, %d3 + %1 = fmul nexc nrnd double %d1, %d2 + %2 = fsub nexc nrnd double %1, %d3 ret double %2 } define float @fusedMACTest8(float %f1, float %f2, float %f3) { ;CHECK-LABEL: fusedMACTest8: ;CHECK: vfnms.f32 - %1 = fmul float %f1, %f2 - %2 = fsub float %1, %f3 + %1 = fmul nexc nrnd float %f1, %f2 + %2 = fsub nexc nrnd float %1, %f3 ret float %2 } define <2 x float> @fusedMACTest9(<2 x float> %a, <2 x float> %b) { ;CHECK-LABEL: fusedMACTest9: ;CHECK: vfma.f32 - %mul = fmul <2 x float> %a, %b - %add = fadd <2 x float> %mul, %a + %mul = fmul nexc nrnd <2 x float> %a, %b + %add = fadd nexc nrnd <2 x float> %mul, %a ret <2 x float> %add } define <2 x float> @fusedMACTest10(<2 x float> %a, <2 x float> %b) { ;CHECK-LABEL: fusedMACTest10: ;CHECK: vfms.f32 - %mul = fmul <2 x float> %a, %b - %sub = fsub <2 x float> %a, %mul + %mul = fmul nexc nrnd <2 x float> %a, %b + %sub = fsub nexc nrnd <2 x float> %a, %mul ret <2 x float> %sub } define <4 x float> @fusedMACTest11(<4 x float> %a, <4 x float> %b) { ;CHECK-LABEL: fusedMACTest11: ;CHECK: vfma.f32 - %mul = fmul <4 x float> %a, %b - %add = fadd <4 x float> %mul, %a + %mul = fmul nexc nrnd <4 x float> %a, %b + %add = fadd nexc nrnd <4 x float> %mul, %a ret <4 x float> %add } define <4 x float> @fusedMACTest12(<4 x float> %a, <4 x float> %b) { ;CHECK-LABEL: fusedMACTest12: ;CHECK: vfms.f32 - %mul = fmul <4 x float> %a, %b - %sub = fsub <4 x float> %a, %mul + %mul = fmul nexc nrnd <4 x float> %a, %b + %sub = fsub nexc nrnd <4 x float> %a, %mul ret <4 x float> %sub } @@ -127,7 +127,7 @@ entry: ; CHECK: test_fms_f64 ; CHECK: vfms.f64 - %tmp1 = fsub double -0.0, %a + %tmp1 = fsub nexc nrnd double -0.0, %a %tmp2 = tail call double @llvm.fma.f64(double %tmp1, double %b, double %c) nounwind readnone ret double %tmp2 } @@ -136,7 +136,7 @@ entry: ; CHECK: test_fms_f64_2 ; CHECK: vfms.f64 - %tmp1 = fsub double -0.0, %b + %tmp1 = fsub nexc nrnd double -0.0, %b %tmp2 = tail call double @llvm.fma.f64(double %a, double %tmp1, double %c) nounwind readnone ret double %tmp2 } @@ -145,7 +145,7 @@ ; CHECK: test_fnms_f32 ; CHECK: vfnms.f32 %tmp1 = load float, float* %c, align 4 - %tmp2 = fsub float -0.0, %tmp1 + %tmp2 = fsub nexc nrnd float -0.0, %tmp1 %tmp3 = tail call float @llvm.fma.f32(float %a, float %b, float %tmp2) nounwind readnone ret float %tmp3 } @@ -154,9 +154,9 @@ entry: ; CHECK: test_fnms_f64 ; CHECK: vfnms.f64 - %tmp1 = fsub double -0.0, %a + %tmp1 = fsub nexc nrnd double -0.0, %a %tmp2 = tail call double @llvm.fma.f64(double %tmp1, double %b, double %c) nounwind readnone - %tmp3 = fsub double -0.0, %tmp2 + %tmp3 = fsub nexc nrnd double -0.0, %tmp2 ret double %tmp3 } @@ -164,9 +164,9 @@ entry: ; CHECK: test_fnms_f64_2 ; CHECK: vfnms.f64 - %tmp1 = fsub double -0.0, %b + %tmp1 = fsub nexc nrnd double -0.0, %b %tmp2 = tail call double @llvm.fma.f64(double %a, double %tmp1, double %c) nounwind readnone - %tmp3 = fsub double -0.0, %tmp2 + %tmp3 = fsub nexc nrnd double -0.0, %tmp2 ret double %tmp3 } @@ -175,7 +175,7 @@ ; CHECK: test_fnma_f64 ; CHECK: vfnma.f64 %tmp1 = tail call double @llvm.fma.f64(double %a, double %b, double %c) nounwind readnone - %tmp2 = fsub double -0.0, %tmp1 + %tmp2 = fsub nexc nrnd double -0.0, %tmp1 ret double %tmp2 } @@ -183,8 +183,8 @@ entry: ; CHECK: test_fnma_f64_2 ; CHECK: vfnma.f64 - %tmp1 = fsub double -0.0, %a - %tmp2 = fsub double -0.0, %c + %tmp1 = fsub nexc nrnd double -0.0, %a + %tmp2 = fsub nexc nrnd double -0.0, %c %tmp3 = tail call double @llvm.fma.f64(double %tmp1, double %b, double %tmp2) nounwind readnone ret double %tmp3 } Index: test/CodeGen/ARM/ifcvt10.ll =================================================================== --- test/CodeGen/ARM/ifcvt10.ll +++ test/CodeGen/ARM/ifcvt10.ll @@ -15,19 +15,19 @@ br i1 undef, label %if.else, label %if.then if.then: ; preds = %entry - %mul73 = fmul double undef, 0.000000e+00 - %sub76 = fsub double %mul73, undef + %mul73 = fmul nexc nrnd double undef, 0.000000e+00 + %sub76 = fsub nexc nrnd double %mul73, undef store double %sub76, double* undef, align 4 %call88 = tail call double @cos(double 0.000000e+00) nounwind - %mul89 = fmul double undef, %call88 - %sub92 = fsub double %mul89, undef + %mul89 = fmul nexc nrnd double undef, %call88 + %sub92 = fsub nexc nrnd double %mul89, undef store double %sub92, double* undef, align 4 ret void if.else: ; preds = %entry %tmp101 = tail call double @llvm.pow.f64(double undef, double 0x3FD5555555555555) - %add112 = fadd double %tmp101, undef - %mul118 = fmul double %add112, undef + %add112 = fadd nexc nrnd double %tmp101, undef + %mul118 = fmul nexc nrnd double %add112, undef store double 0.000000e+00, double* %x, align 4 ret void } Index: test/CodeGen/ARM/isel-v8i32-crash.ll =================================================================== --- test/CodeGen/ARM/isel-v8i32-crash.ll +++ test/CodeGen/ARM/isel-v8i32-crash.ll @@ -16,7 +16,7 @@ entry: %0 = bitcast float* %pf to <8 x float>* %1 = load <8 x float>, <8 x float>* %0, align 4 - %2 = fmul <8 x float> %1, + %2 = fmul nexc nrnd <8 x float> %1, %3 = fptosi <8 x float> %2 to <8 x i16> %4 = bitcast i16* %pb to <8 x i16>* store <8 x i16> %3, <8 x i16>* %4, align 2 Index: test/CodeGen/ARM/reg_sequence.ll =================================================================== --- test/CodeGen/ARM/reg_sequence.ll +++ test/CodeGen/ARM/reg_sequence.ll @@ -205,8 +205,8 @@ bb.i25: ; preds = %bb.i25, %bb5 %0 = shufflevector <2 x float> undef, <2 x float> undef, <4 x i32> ; <<4 x float>> [#uses=1] %1 = call <4 x float> @llvm.arm.neon.vrsqrte.v4f32(<4 x float> %0) nounwind ; <<4 x float>> [#uses=1] - %2 = fmul <4 x float> %1, undef ; <<4 x float>> [#uses=1] - %3 = fmul <4 x float> undef, %2 ; <<4 x float>> [#uses=1] + %2 = fmul nexc nrnd <4 x float> %1, undef ; <<4 x float>> [#uses=1] + %3 = fmul nexc nrnd <4 x float> undef, %2 ; <<4 x float>> [#uses=1] %tmp26.i = bitcast <4 x float> %3 to <2 x double> ; <<2 x double>> [#uses=1] %4 = extractelement <2 x double> %tmp26.i, i32 0 ; [#uses=1] %5 = bitcast double %4 to <2 x float> ; <<2 x float>> [#uses=1] @@ -283,17 +283,17 @@ %4 = extractelement <2 x double> %tmp54.i, i32 1 ; [#uses=1] %5 = bitcast double %4 to <2 x float> ; <<2 x float>> [#uses=1] %6 = shufflevector <2 x float> %5, <2 x float> undef, <4 x i32> zeroinitializer ; <<4 x float>> [#uses=1] - %7 = fmul <4 x float> undef, %6 ; <<4 x float>> [#uses=1] - %8 = fadd <4 x float> %7, undef ; <<4 x float>> [#uses=1] - %9 = fadd <4 x float> %8, undef ; <<4 x float>> [#uses=1] + %7 = fmul nexc nrnd <4 x float> undef, %6 ; <<4 x float>> [#uses=1] + %8 = fadd nexc nrnd <4 x float> %7, undef ; <<4 x float>> [#uses=1] + %9 = fadd nexc nrnd <4 x float> %8, undef ; <<4 x float>> [#uses=1] %10 = shufflevector <4 x float> undef, <4 x float> %9, <4 x i32> ; <<4 x float>> [#uses=1] - %11 = fmul <4 x float> %10, ; <<4 x float>> [#uses=1] + %11 = fmul nexc nrnd <4 x float> %10, ; <<4 x float>> [#uses=1] %12 = shufflevector <4 x float> %11, <4 x float> undef, <4 x i32> ; <<4 x float>> [#uses=1] %13 = shufflevector <4 x float> %12, <4 x float> undef, <4 x i32> zeroinitializer ; <<4 x float>> [#uses=1] - %14 = fmul <4 x float> %13, undef ; <<4 x float>> [#uses=1] - %15 = fadd <4 x float> undef, %14 ; <<4 x float>> [#uses=1] + %14 = fmul nexc nrnd <4 x float> %13, undef ; <<4 x float>> [#uses=1] + %15 = fadd nexc nrnd <4 x float> undef, %14 ; <<4 x float>> [#uses=1] %16 = shufflevector <4 x float> undef, <4 x float> %15, <4 x i32> ; <<4 x float>> [#uses=1] - %17 = fmul <4 x float> %16, undef ; <<4 x float>> [#uses=1] + %17 = fmul nexc nrnd <4 x float> %16, undef ; <<4 x float>> [#uses=1] %18 = extractelement <4 x float> %17, i32 2 ; [#uses=1] store float %18, float* undef, align 4 br i1 undef, label %exit, label %bb14 Index: test/CodeGen/ARM/saxpy10-a9.ll =================================================================== --- test/CodeGen/ARM/saxpy10-a9.ll +++ test/CodeGen/ARM/saxpy10-a9.ll @@ -64,72 +64,72 @@ define float @saxpy10(float* nocapture readonly %data1, float* nocapture readonly %data2, float %a) { entry: %0 = load float, float* %data1, align 4 - %mul = fmul float %0, %a + %mul = fmul nexc nrnd float %0, %a %1 = load float, float* %data2, align 4 - %add = fadd float %mul, %1 - %add2 = fadd float %add, 0.000000e+00 + %add = fadd nexc nrnd float %mul, %1 + %add2 = fadd nexc nrnd float %add, 0.000000e+00 %arrayidx.1 = getelementptr inbounds float, float* %data1, i32 1 %2 = load float, float* %arrayidx.1, align 4 - %mul.1 = fmul float %2, %a + %mul.1 = fmul nexc nrnd float %2, %a %arrayidx1.1 = getelementptr inbounds float, float* %data2, i32 1 %3 = load float, float* %arrayidx1.1, align 4 - %add.1 = fadd float %mul.1, %3 - %add2.1 = fadd float %add2, %add.1 + %add.1 = fadd nexc nrnd float %mul.1, %3 + %add2.1 = fadd nexc nrnd float %add2, %add.1 %arrayidx.2 = getelementptr inbounds float, float* %data1, i32 2 %4 = load float, float* %arrayidx.2, align 4 - %mul.2 = fmul float %4, %a + %mul.2 = fmul nexc nrnd float %4, %a %arrayidx1.2 = getelementptr inbounds float, float* %data2, i32 2 %5 = load float, float* %arrayidx1.2, align 4 - %add.2 = fadd float %mul.2, %5 - %add2.2 = fadd float %add2.1, %add.2 + %add.2 = fadd nexc nrnd float %mul.2, %5 + %add2.2 = fadd nexc nrnd float %add2.1, %add.2 %arrayidx.3 = getelementptr inbounds float, float* %data1, i32 3 %6 = load float, float* %arrayidx.3, align 4 - %mul.3 = fmul float %6, %a + %mul.3 = fmul nexc nrnd float %6, %a %arrayidx1.3 = getelementptr inbounds float, float* %data2, i32 3 %7 = load float, float* %arrayidx1.3, align 4 - %add.3 = fadd float %mul.3, %7 - %add2.3 = fadd float %add2.2, %add.3 + %add.3 = fadd nexc nrnd float %mul.3, %7 + %add2.3 = fadd nexc nrnd float %add2.2, %add.3 %arrayidx.4 = getelementptr inbounds float, float* %data1, i32 4 %8 = load float, float* %arrayidx.4, align 4 - %mul.4 = fmul float %8, %a + %mul.4 = fmul nexc nrnd float %8, %a %arrayidx1.4 = getelementptr inbounds float, float* %data2, i32 4 %9 = load float, float* %arrayidx1.4, align 4 - %add.4 = fadd float %mul.4, %9 - %add2.4 = fadd float %add2.3, %add.4 + %add.4 = fadd nexc nrnd float %mul.4, %9 + %add2.4 = fadd nexc nrnd float %add2.3, %add.4 %arrayidx.5 = getelementptr inbounds float, float* %data1, i32 5 %10 = load float, float* %arrayidx.5, align 4 - %mul.5 = fmul float %10, %a + %mul.5 = fmul nexc nrnd float %10, %a %arrayidx1.5 = getelementptr inbounds float, float* %data2, i32 5 %11 = load float, float* %arrayidx1.5, align 4 - %add.5 = fadd float %mul.5, %11 - %add2.5 = fadd float %add2.4, %add.5 + %add.5 = fadd nexc nrnd float %mul.5, %11 + %add2.5 = fadd nexc nrnd float %add2.4, %add.5 %arrayidx.6 = getelementptr inbounds float, float* %data1, i32 6 %12 = load float, float* %arrayidx.6, align 4 - %mul.6 = fmul float %12, %a + %mul.6 = fmul nexc nrnd float %12, %a %arrayidx1.6 = getelementptr inbounds float, float* %data2, i32 6 %13 = load float, float* %arrayidx1.6, align 4 - %add.6 = fadd float %mul.6, %13 - %add2.6 = fadd float %add2.5, %add.6 + %add.6 = fadd nexc nrnd float %mul.6, %13 + %add2.6 = fadd nexc nrnd float %add2.5, %add.6 %arrayidx.7 = getelementptr inbounds float, float* %data1, i32 7 %14 = load float, float* %arrayidx.7, align 4 - %mul.7 = fmul float %14, %a + %mul.7 = fmul nexc nrnd float %14, %a %arrayidx1.7 = getelementptr inbounds float, float* %data2, i32 7 %15 = load float, float* %arrayidx1.7, align 4 - %add.7 = fadd float %mul.7, %15 - %add2.7 = fadd float %add2.6, %add.7 + %add.7 = fadd nexc nrnd float %mul.7, %15 + %add2.7 = fadd nexc nrnd float %add2.6, %add.7 %arrayidx.8 = getelementptr inbounds float, float* %data1, i32 8 %16 = load float, float* %arrayidx.8, align 4 - %mul.8 = fmul float %16, %a + %mul.8 = fmul nexc nrnd float %16, %a %arrayidx1.8 = getelementptr inbounds float, float* %data2, i32 8 %17 = load float, float* %arrayidx1.8, align 4 - %add.8 = fadd float %mul.8, %17 - %add2.8 = fadd float %add2.7, %add.8 + %add.8 = fadd nexc nrnd float %mul.8, %17 + %add2.8 = fadd nexc nrnd float %add2.7, %add.8 %arrayidx.9 = getelementptr inbounds float, float* %data1, i32 9 %18 = load float, float* %arrayidx.9, align 4 - %mul.9 = fmul float %18, %a + %mul.9 = fmul nexc nrnd float %18, %a %arrayidx1.9 = getelementptr inbounds float, float* %data2, i32 9 %19 = load float, float* %arrayidx1.9, align 4 - %add.9 = fadd float %mul.9, %19 - %add2.9 = fadd float %add2.8, %add.9 + %add.9 = fadd nexc nrnd float %mul.9, %19 + %add2.9 = fadd nexc nrnd float %add2.8, %add.9 ret float %add2.9 } Index: test/CodeGen/ARM/unsafe-fsub.ll =================================================================== --- test/CodeGen/ARM/unsafe-fsub.ll +++ test/CodeGen/ARM/unsafe-fsub.ll @@ -10,8 +10,8 @@ ; SAFE: vmul.f32 ; SAFE: vsub.f32 ; FAST: mov r0, #0 - %0 = fmul float %x, %y - %1 = fsub float %0, %0 + %0 = fmul nexc nrnd float %x, %y + %1 = fsub nexc nrnd float %0, %0 ret float %1 } Index: test/CodeGen/ARM/vcvt.ll =================================================================== --- test/CodeGen/ARM/vcvt.ll +++ test/CodeGen/ARM/vcvt.ll @@ -163,7 +163,7 @@ ; CHECK: vcvt.u32.f32 [[TMP:q[0-9]+]], {{q[0-9]+}}, #1 ; CHECK: vmovn.i32 {{d[0-9]+}}, [[TMP]] - %scale = fmul <4 x float> %in, + %scale = fmul nexc nrnd <4 x float> %in, %conv = fptoui <4 x float> %scale to <4 x i16> ret <4 x i16> %conv } @@ -173,7 +173,7 @@ ; CHECK: bl ; CHECK: bl - %scale = fmul <2 x float> %in, + %scale = fmul nexc nrnd <2 x float> %in, %conv = fptoui <2 x float> %scale to <2 x i64> ret <2 x i64> %conv } @@ -183,7 +183,7 @@ ; CHECK: vcvt.u32.f64 ; CHECK: vcvt.u32.f64 - %scale = fmul <4 x double> %in, + %scale = fmul nexc nrnd <4 x double> %in, %conv = fptoui <4 x double> %scale to <4 x i16> ret <4 x i16> %conv } @@ -192,7 +192,7 @@ ; CHECK-LABEL: fix_double_to_i64: ; CHECK: bl ; CHECK: bl - %scale = fmul <2 x double> %in, + %scale = fmul nexc nrnd <2 x double> %in, %conv = fptoui <2 x double> %scale to <2 x i64> ret <2 x i64> %conv } Index: test/CodeGen/ARM/vcvt_combine.ll =================================================================== --- test/CodeGen/ARM/vcvt_combine.ll +++ test/CodeGen/ARM/vcvt_combine.ll @@ -5,7 +5,7 @@ ; CHECK: vcvt.s32.f32 d{{[0-9]+}}, d{{[0-9]+}}, #2 ; CHECK: bx lr define <2 x i32> @t0(<2 x float> %in) { - %mul.i = fmul <2 x float> %in, + %mul.i = fmul nexc nrnd <2 x float> %in, %vcvt.i = fptosi <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -15,7 +15,7 @@ ; CHECK: vcvt.u32.f32 d{{[0-9]+}}, d{{[0-9]+}}, #3 ; CHECK: bx lr define <2 x i32> @t1(<2 x float> %in) { - %mul.i = fmul <2 x float> %in, + %mul.i = fmul nexc nrnd <2 x float> %in, %vcvt.i = fptoui <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -27,7 +27,7 @@ ; CHECK: bx lr define <2 x i32> @t2(<2 x float> %in) { entry: - %mul.i = fmul <2 x float> %in, + %mul.i = fmul nexc nrnd <2 x float> %in, %vcvt.i = fptosi <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -38,7 +38,7 @@ ; CHECK: vcvt.s32.f32 d{{[0-9]+}}, d{{[0-9]+}} ; CHECK: bx lr define <2 x i32> @t3(<2 x float> %in) { - %mul.i = fmul <2 x float> %in, + %mul.i = fmul nexc nrnd <2 x float> %in, %vcvt.i = fptosi <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -48,7 +48,7 @@ ; CHECK: vcvt.s32.f32 d{{[0-9]+}}, d{{[0-9]+}}, #32 ; CHECK: bx lr define <2 x i32> @t4(<2 x float> %in) { - %mul.i = fmul <2 x float> %in, + %mul.i = fmul nexc nrnd <2 x float> %in, %vcvt.i = fptosi <2 x float> %mul.i to <2 x i32> ret <2 x i32> %vcvt.i } @@ -58,7 +58,7 @@ ; CHECK: vcvt.s32.f32 q{{[0-9]+}}, q{{[0-9]+}}, #3 ; CHECK: bx lr define <4 x i32> @t5(<4 x float> %in) { - %mul.i = fmul <4 x float> %in, + %mul.i = fmul nexc nrnd <4 x float> %in, %vcvt.i = fptosi <4 x float> %mul.i to <4 x i32> ret <4 x i32> %vcvt.i } Index: test/CodeGen/ARM/vdiv_combine.ll =================================================================== --- test/CodeGen/ARM/vdiv_combine.ll +++ test/CodeGen/ARM/vdiv_combine.ll @@ -15,7 +15,7 @@ %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0 %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1 %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float> - %div.i = fdiv <2 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <2 x float> %vcvt.i, tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind ret void } @@ -31,7 +31,7 @@ %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0 %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1 %vcvt.i = uitofp <2 x i32> %vecinit2.i to <2 x float> - %div.i = fdiv <2 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <2 x float> %vcvt.i, tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind ret void } @@ -45,7 +45,7 @@ %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0 %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1 %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float> - %div.i = fdiv <2 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <2 x float> %vcvt.i, tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind ret void } @@ -59,7 +59,7 @@ %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0 %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1 %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float> - %div.i = fdiv <2 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <2 x float> %vcvt.i, tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind ret void } @@ -73,7 +73,7 @@ %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0 %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1 %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float> - %div.i = fdiv <2 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <2 x float> %vcvt.i, tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind ret void } @@ -89,7 +89,7 @@ %vecinit4.i = insertelement <4 x i32> %vecinit2.i, i32 %tmp, i32 2 %vecinit6.i = insertelement <4 x i32> %vecinit4.i, i32 %tmp, i32 3 %vcvt.i = sitofp <4 x i32> %vecinit6.i to <4 x float> - %div.i = fdiv <4 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <4 x float> %vcvt.i, tail call void @foo_float32x4_t(<4 x float> %div.i) nounwind ret void } @@ -102,7 +102,7 @@ ; CHECK: vcvt.f32.u32 {{q[0-9]+}}, [[TMP]], #1 %conv = uitofp <4 x i16> %in to <4 x float> - %shift = fdiv <4 x float> %conv, + %shift = fdiv nexc nrnd <4 x float> %conv, ret <4 x float> %shift } @@ -112,7 +112,7 @@ ; CHECK: vcvt.f32.s32 {{q[0-9]+}}, [[TMP]], #1 %conv = sitofp <4 x i16> %in to <4 x float> - %shift = fdiv <4 x float> %conv, + %shift = fdiv nexc nrnd <4 x float> %conv, ret <4 x float> %shift } @@ -122,7 +122,7 @@ ; CHECK: bl %conv = uitofp <2 x i64> %in to <2 x float> - %shift = fdiv <2 x float> %conv, + %shift = fdiv nexc nrnd <2 x float> %conv, ret <2 x float> %shift } @@ -132,7 +132,7 @@ ; CHECK: bl %conv = uitofp <2 x i64> %in to <2 x double> - %shift = fdiv <2 x double> %conv, + %shift = fdiv nexc nrnd <2 x double> %conv, ret <2 x double> %shift } @@ -141,7 +141,7 @@ define <8 x float> @test7(<8 x i32> %in) nounwind { entry: %vcvt.i = sitofp <8 x i32> %in to <8 x float> - %div.i = fdiv <8 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <8 x float> %vcvt.i, ret <8 x float> %div.i } @@ -150,6 +150,6 @@ ; CHECK: vcvt.f32.s32 q{{[0-9]+}}, q{{[0-9]+}}, #1 define <4 x float> @test8(<4 x i32> %in) { %vcvt.i = sitofp <4 x i32> %in to <4 x float> - %div.i = fdiv <4 x float> %vcvt.i, + %div.i = fdiv nexc nrnd <4 x float> %vcvt.i, ret <4 x float> %div.i } Index: test/CodeGen/ARM/vfp.ll =================================================================== --- test/CodeGen/ARM/vfp.ll +++ test/CodeGen/ARM/vfp.ll @@ -29,10 +29,10 @@ define void @test_add(float* %P, double* %D) { ;CHECK-LABEL: test_add: %a = load float, float* %P ; [#uses=2] - %b = fadd float %a, %a ; [#uses=1] + %b = fadd nexc nrnd float %a, %a ; [#uses=1] store float %b, float* %P %A = load double, double* %D ; [#uses=2] - %B = fadd double %A, %A ; [#uses=1] + %B = fadd nexc nrnd double %A, %A ; [#uses=1] store double %B, double* %D ret void } @@ -56,8 +56,8 @@ %a2 = load float, float* %P2 ; [#uses=1] %a3 = load float, float* %P3 ; [#uses=1] ;CHECK: vnmls.f32 - %X = fmul float %a1, %a2 ; [#uses=1] - %Y = fsub float %X, %a3 ; [#uses=1] + %X = fmul nexc nrnd float %a1, %a2 ; [#uses=1] + %Y = fsub nexc nrnd float %X, %a3 ; [#uses=1] store float %Y, float* %P1 ret void } Index: test/CodeGen/ARM/vmla.ll =================================================================== --- test/CodeGen/ARM/vmla.ll +++ test/CodeGen/ARM/vmla.ll @@ -39,8 +39,8 @@ %tmp1 = load <2 x float>, <2 x float>* %A %tmp2 = load <2 x float>, <2 x float>* %B %tmp3 = load <2 x float>, <2 x float>* %C - %tmp4 = fmul <2 x float> %tmp2, %tmp3 - %tmp5 = fadd <2 x float> %tmp1, %tmp4 + %tmp4 = fmul nexc nrnd <2 x float> %tmp2, %tmp3 + %tmp5 = fadd nexc nrnd <2 x float> %tmp1, %tmp4 ret <2 x float> %tmp5 } @@ -83,8 +83,8 @@ %tmp1 = load <4 x float>, <4 x float>* %A %tmp2 = load <4 x float>, <4 x float>* %B %tmp3 = load <4 x float>, <4 x float>* %C - %tmp4 = fmul <4 x float> %tmp2, %tmp3 - %tmp5 = fadd <4 x float> %tmp1, %tmp4 + %tmp4 = fmul nexc nrnd <4 x float> %tmp2, %tmp3 + %tmp5 = fadd nexc nrnd <4 x float> %tmp1, %tmp4 ret <4 x float> %tmp5 } Index: test/CodeGen/ARM/vmls.ll =================================================================== --- test/CodeGen/ARM/vmls.ll +++ test/CodeGen/ARM/vmls.ll @@ -39,8 +39,8 @@ %tmp1 = load <2 x float>, <2 x float>* %A %tmp2 = load <2 x float>, <2 x float>* %B %tmp3 = load <2 x float>, <2 x float>* %C - %tmp4 = fmul <2 x float> %tmp2, %tmp3 - %tmp5 = fsub <2 x float> %tmp1, %tmp4 + %tmp4 = fmul nexc nrnd <2 x float> %tmp2, %tmp3 + %tmp5 = fsub nexc nrnd <2 x float> %tmp1, %tmp4 ret <2 x float> %tmp5 } @@ -83,8 +83,8 @@ %tmp1 = load <4 x float>, <4 x float>* %A %tmp2 = load <4 x float>, <4 x float>* %B %tmp3 = load <4 x float>, <4 x float>* %C - %tmp4 = fmul <4 x float> %tmp2, %tmp3 - %tmp5 = fsub <4 x float> %tmp1, %tmp4 + %tmp4 = fmul nexc nrnd <4 x float> %tmp2, %tmp3 + %tmp5 = fsub nexc nrnd <4 x float> %tmp1, %tmp4 ret <4 x float> %tmp5 } Index: test/CodeGen/ARM/vmul.ll =================================================================== --- test/CodeGen/ARM/vmul.ll +++ test/CodeGen/ARM/vmul.ll @@ -32,7 +32,7 @@ ;CHECK: vmul.f32 %tmp1 = load <2 x float>, <2 x float>* %A %tmp2 = load <2 x float>, <2 x float>* %B - %tmp3 = fmul <2 x float> %tmp1, %tmp2 + %tmp3 = fmul nexc nrnd <2 x float> %tmp1, %tmp2 ret <2 x float> %tmp3 } @@ -77,7 +77,7 @@ ;CHECK: vmul.f32 %tmp1 = load <4 x float>, <4 x float>* %A %tmp2 = load <4 x float>, <4 x float>* %B - %tmp3 = fmul <4 x float> %tmp1, %tmp2 + %tmp3 = fmul nexc nrnd <4 x float> %tmp1, %tmp2 ret <4 x float> %tmp3 } @@ -98,7 +98,7 @@ ; CHECK-LABEL: test_vmul_lanef32: ; CHECK: vmul.f32 d0, d0, d1[0] %0 = shufflevector <2 x float> %arg1_float32x2_t, <2 x float> undef, <2 x i32> zeroinitializer ; <<2 x float>> [#uses=1] - %1 = fmul <2 x float> %0, %arg0_float32x2_t ; <<2 x float>> [#uses=1] + %1 = fmul nexc nrnd <2 x float> %0, %arg0_float32x2_t ; <<2 x float>> [#uses=1] ret <2 x float> %1 } @@ -125,7 +125,7 @@ ; CHECK-LABEL: test_vmulQ_lanef32: ; CHECK: vmul.f32 q0, q0, d2[1] %0 = shufflevector <2 x float> %arg1_float32x2_t, <2 x float> undef, <4 x i32> ; <<4 x float>$ - %1 = fmul <4 x float> %0, %arg0_float32x4_t ; <<4 x float>> [#uses=1] + %1 = fmul nexc nrnd <4 x float> %0, %arg0_float32x4_t ; <<4 x float>> [#uses=1] ret <4 x float> %1 } @@ -648,7 +648,7 @@ %tmp7 = insertelement <4 x float> %tmp6, float %tmp, i32 1 %tmp8 = insertelement <4 x float> %tmp7, float %tmp, i32 2 %tmp9 = insertelement <4 x float> %tmp8, float %tmp, i32 3 - %tmp10 = fmul <4 x float> %tmp9, %tmp5 + %tmp10 = fmul nexc nrnd <4 x float> %tmp9, %tmp5 store <4 x float> %tmp10, <4 x float>* %dst, align 4 ret void } Index: test/CodeGen/Hexagon/opt-fneg.ll =================================================================== --- test/CodeGen/Hexagon/opt-fneg.ll +++ test/CodeGen/Hexagon/opt-fneg.ll @@ -7,20 +7,20 @@ %x.addr = alloca float, align 4 store float %x, float* %x.addr, align 4 %0 = load float, float* %x.addr, align 4 - %sub = fsub float -0.000000e+00, %0 + %sub = fsub nexc nrnd float -0.000000e+00, %0 ret float %sub } define float @bar(float %x) nounwind { entry: ; CHECK: r{{[0-9]+}} = togglebit(r{{[0-9]+}}, #31) - %sub = fsub float -0.000000e+00, %x + %sub = fsub nexc nrnd float -0.000000e+00, %x ret float %sub } define float @baz(float %x) nounwind { entry: ; CHECK: r{{[0-9]+}} = togglebit(r{{[0-9]+}}, #31) - %conv1 = fmul float %x, -1.000000e+00 + %conv1 = fmul nexc nrnd float %x, -1.000000e+00 ret float %conv1 } Index: test/CodeGen/Mips/fmadd1.ll =================================================================== --- test/CodeGen/Mips/fmadd1.ll +++ test/CodeGen/Mips/fmadd1.ll @@ -52,9 +52,9 @@ ; 64R6-DAG: mtc1 $zero, $[[T2:f[0-9]+]] ; 64R6-DAG: add.s $f0, $[[T1]], $[[T2]] - %mul = fmul float %a, %b - %add = fadd float %mul, %c - %add1 = fadd float %add, 0.000000e+00 + %mul = fmul nexc nrnd float %a, %b + %add = fadd nexc nrnd float %mul, %c + %add1 = fadd nexc nrnd float %add, 0.000000e+00 ret float %add1 } @@ -92,9 +92,9 @@ ; 64R6-DAG: mtc1 $zero, $[[T2:f[0-9]+]] ; 64R6-DAG: add.s $f0, $[[T1]], $[[T2]] - %mul = fmul float %a, %b - %sub = fsub float %mul, %c - %add = fadd float %sub, 0.000000e+00 + %mul = fmul nexc nrnd float %a, %b + %sub = fsub nexc nrnd float %mul, %c + %add = fadd nexc nrnd float %sub, 0.000000e+00 ret float %add } @@ -139,9 +139,9 @@ ; 64R6-DAG: mtc1 $zero, $[[T2:f[0-9]+]] ; 64R6-DAG: sub.s $f0, $[[T2]], $[[T1]] - %mul = fmul float %a, %b - %add = fadd float %mul, %c - %sub = fsub float 0.000000e+00, %add + %mul = fmul nexc nrnd float %a, %b + %add = fadd nexc nrnd float %mul, %c + %sub = fsub nexc nrnd float 0.000000e+00, %add ret float %sub } @@ -178,9 +178,9 @@ ; 64R6-DAG: mtc1 $zero, $[[T2:f[0-9]+]] ; 64R6-DAG: sub.s $f0, $[[T2]], $[[T1]] - %mul = fmul float %a, %b - %sub = fsub float %mul, %c - %sub1 = fsub float 0.000000e+00, %sub + %mul = fmul nexc nrnd float %a, %b + %sub = fsub nexc nrnd float %mul, %c + %sub1 = fsub nexc nrnd float 0.000000e+00, %sub ret float %sub1 } @@ -219,9 +219,9 @@ ; 64R6-DAG: dmtc1 $zero, $[[T2:f[0-9]+]] ; 64R6-DAG: add.d $f0, $[[T1]], $[[T2]] - %mul = fmul double %a, %b - %add = fadd double %mul, %c - %add1 = fadd double %add, 0.000000e+00 + %mul = fmul nexc nrnd double %a, %b + %add = fadd nexc nrnd double %mul, %c + %add1 = fadd nexc nrnd double %add, 0.000000e+00 ret double %add1 } @@ -260,9 +260,9 @@ ; 64R6-DAG: dmtc1 $zero, $[[T2:f[0-9]+]] ; 64R6-DAG: add.d $f0, $[[T1]], $[[T2]] - %mul = fmul double %a, %b - %sub = fsub double %mul, %c - %add = fadd double %sub, 0.000000e+00 + %mul = fmul nexc nrnd double %a, %b + %sub = fsub nexc nrnd double %mul, %c + %add = fadd nexc nrnd double %sub, 0.000000e+00 ret double %add } @@ -308,9 +308,9 @@ ; 64R6-DAG: dmtc1 $zero, $[[T2:f[0-9]+]] ; 64R6-DAG: sub.d $f0, $[[T2]], $[[T1]] - %mul = fmul double %a, %b - %add = fadd double %mul, %c - %sub = fsub double 0.000000e+00, %add + %mul = fmul nexc nrnd double %a, %b + %add = fadd nexc nrnd double %mul, %c + %sub = fsub nexc nrnd double 0.000000e+00, %add ret double %sub } @@ -356,8 +356,8 @@ ; 64R6-DAG: dmtc1 $zero, $[[T2:f[0-9]+]] ; 64R6-DAG: sub.d $f0, $[[T2]], $[[T1]] - %mul = fmul double %a, %b - %sub = fsub double %mul, %c - %sub1 = fsub double 0.000000e+00, %sub + %mul = fmul nexc nrnd double %a, %b + %sub = fsub nexc nrnd double %mul, %c + %sub1 = fsub nexc nrnd double 0.000000e+00, %sub ret double %sub1 } Index: test/CodeGen/Mips/msa/3rf.ll =================================================================== --- test/CodeGen/Mips/msa/3rf.ll +++ test/CodeGen/Mips/msa/3rf.ll @@ -51,7 +51,7 @@ entry: %0 = load <4 x float>, <4 x float>* @llvm_mips_fadd_w_ARG1 %1 = load <4 x float>, <4 x float>* @llvm_mips_fadd_w_ARG2 - %2 = fadd <4 x float> %0, %1 + %2 = fadd nexc nrnd <4 x float> %0, %1 store <4 x float> %2, <4 x float>* @llvm_mips_fadd_w_RES ret void } @@ -67,7 +67,7 @@ entry: %0 = load <2 x double>, <2 x double>* @llvm_mips_fadd_d_ARG1 %1 = load <2 x double>, <2 x double>* @llvm_mips_fadd_d_ARG2 - %2 = fadd <2 x double> %0, %1 + %2 = fadd nexc nrnd <2 x double> %0, %1 store <2 x double> %2, <2 x double>* @llvm_mips_fadd_d_RES ret void } @@ -127,7 +127,7 @@ entry: %0 = load <4 x float>, <4 x float>* @llvm_mips_fdiv_w_ARG1 %1 = load <4 x float>, <4 x float>* @llvm_mips_fdiv_w_ARG2 - %2 = fdiv <4 x float> %0, %1 + %2 = fdiv nexc nrnd <4 x float> %0, %1 store <4 x float> %2, <4 x float>* @llvm_mips_fdiv_w_RES ret void } @@ -143,7 +143,7 @@ entry: %0 = load <2 x double>, <2 x double>* @llvm_mips_fdiv_d_ARG1 %1 = load <2 x double>, <2 x double>* @llvm_mips_fdiv_d_ARG2 - %2 = fdiv <2 x double> %0, %1 + %2 = fdiv nexc nrnd <2 x double> %0, %1 store <2 x double> %2, <2 x double>* @llvm_mips_fdiv_d_RES ret void } @@ -379,7 +379,7 @@ entry: %0 = load <4 x float>, <4 x float>* @llvm_mips_fmul_w_ARG1 %1 = load <4 x float>, <4 x float>* @llvm_mips_fmul_w_ARG2 - %2 = fmul <4 x float> %0, %1 + %2 = fmul nexc nrnd <4 x float> %0, %1 store <4 x float> %2, <4 x float>* @llvm_mips_fmul_w_RES ret void } @@ -395,7 +395,7 @@ entry: %0 = load <2 x double>, <2 x double>* @llvm_mips_fmul_d_ARG1 %1 = load <2 x double>, <2 x double>* @llvm_mips_fmul_d_ARG2 - %2 = fmul <2 x double> %0, %1 + %2 = fmul nexc nrnd <2 x double> %0, %1 store <2 x double> %2, <2 x double>* @llvm_mips_fmul_d_RES ret void } @@ -456,7 +456,7 @@ entry: %0 = load <4 x float>, <4 x float>* @llvm_mips_fsub_w_ARG1 %1 = load <4 x float>, <4 x float>* @llvm_mips_fsub_w_ARG2 - %2 = fsub <4 x float> %0, %1 + %2 = fsub nexc nrnd <4 x float> %0, %1 store <4 x float> %2, <4 x float>* @llvm_mips_fsub_w_RES ret void } @@ -472,7 +472,7 @@ entry: %0 = load <2 x double>, <2 x double>* @llvm_mips_fsub_d_ARG1 %1 = load <2 x double>, <2 x double>* @llvm_mips_fsub_d_ARG2 - %2 = fsub <2 x double> %0, %1 + %2 = fsub nexc nrnd <2 x double> %0, %1 store <2 x double> %2, <2 x double>* @llvm_mips_fsub_d_RES ret void } Index: test/CodeGen/Mips/msa/arithmetic_float.ll =================================================================== --- test/CodeGen/Mips/msa/arithmetic_float.ll +++ test/CodeGen/Mips/msa/arithmetic_float.ll @@ -8,7 +8,7 @@ ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5) %2 = load <4 x float>, <4 x float>* %b ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6) - %3 = fadd <4 x float> %1, %2 + %3 = fadd nexc nrnd <4 x float> %1, %2 ; CHECK-DAG: fadd.w [[R3:\$w[0-9]+]], [[R1]], [[R2]] store <4 x float> %3, <4 x float>* %c ; CHECK-DAG: st.w [[R3]], 0($4) @@ -24,7 +24,7 @@ ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5) %2 = load <2 x double>, <2 x double>* %b ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6) - %3 = fadd <2 x double> %1, %2 + %3 = fadd nexc nrnd <2 x double> %1, %2 ; CHECK-DAG: fadd.d [[R3:\$w[0-9]+]], [[R1]], [[R2]] store <2 x double> %3, <2 x double>* %c ; CHECK-DAG: st.d [[R3]], 0($4) @@ -40,7 +40,7 @@ ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5) %2 = load <4 x float>, <4 x float>* %b ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6) - %3 = fsub <4 x float> %1, %2 + %3 = fsub nexc nrnd <4 x float> %1, %2 ; CHECK-DAG: fsub.w [[R3:\$w[0-9]+]], [[R1]], [[R2]] store <4 x float> %3, <4 x float>* %c ; CHECK-DAG: st.w [[R3]], 0($4) @@ -56,7 +56,7 @@ ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5) %2 = load <2 x double>, <2 x double>* %b ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6) - %3 = fsub <2 x double> %1, %2 + %3 = fsub nexc nrnd <2 x double> %1, %2 ; CHECK-DAG: fsub.d [[R3:\$w[0-9]+]], [[R1]], [[R2]] store <2 x double> %3, <2 x double>* %c ; CHECK-DAG: st.d [[R3]], 0($4) @@ -72,7 +72,7 @@ ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5) %2 = load <4 x float>, <4 x float>* %b ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6) - %3 = fmul <4 x float> %1, %2 + %3 = fmul nexc nrnd <4 x float> %1, %2 ; CHECK-DAG: fmul.w [[R3:\$w[0-9]+]], [[R1]], [[R2]] store <4 x float> %3, <4 x float>* %c ; CHECK-DAG: st.w [[R3]], 0($4) @@ -88,7 +88,7 @@ ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5) %2 = load <2 x double>, <2 x double>* %b ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6) - %3 = fmul <2 x double> %1, %2 + %3 = fmul nexc nrnd <2 x double> %1, %2 ; CHECK-DAG: fmul.d [[R3:\$w[0-9]+]], [[R1]], [[R2]] store <2 x double> %3, <2 x double>* %c ; CHECK-DAG: st.d [[R3]], 0($4) @@ -147,8 +147,8 @@ ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6) %3 = load <4 x float>, <4 x float>* %c ; CHECK-DAG: ld.w [[R3:\$w[0-9]+]], 0($7) - %4 = fmul <4 x float> %2, %3 - %5 = fsub <4 x float> %1, %4 + %4 = fmul nexc nrnd <4 x float> %2, %3 + %5 = fsub nexc nrnd <4 x float> %1, %4 ; CHECK-DAG: fmsub.w [[R1]], [[R2]], [[R3]] store <4 x float> %5, <4 x float>* %d ; CHECK-DAG: st.w [[R1]], 0($4) @@ -167,8 +167,8 @@ ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6) %3 = load <2 x double>, <2 x double>* %c ; CHECK-DAG: ld.d [[R3:\$w[0-9]+]], 0($7) - %4 = fmul <2 x double> %2, %3 - %5 = fsub <2 x double> %1, %4 + %4 = fmul nexc nrnd <2 x double> %2, %3 + %5 = fsub nexc nrnd <2 x double> %1, %4 ; CHECK-DAG: fmsub.d [[R1]], [[R2]], [[R3]] store <2 x double> %5, <2 x double>* %d ; CHECK-DAG: st.d [[R1]], 0($4) @@ -184,7 +184,7 @@ ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5) %2 = load <4 x float>, <4 x float>* %b ; CHECK-DAG: ld.w [[R2:\$w[0-9]+]], 0($6) - %3 = fdiv <4 x float> %1, %2 + %3 = fdiv nexc nrnd <4 x float> %1, %2 ; CHECK-DAG: fdiv.w [[R3:\$w[0-9]+]], [[R1]], [[R2]] store <4 x float> %3, <4 x float>* %c ; CHECK-DAG: st.w [[R3]], 0($4) @@ -200,7 +200,7 @@ ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5) %2 = load <2 x double>, <2 x double>* %b ; CHECK-DAG: ld.d [[R2:\$w[0-9]+]], 0($6) - %3 = fdiv <2 x double> %1, %2 + %3 = fdiv nexc nrnd <2 x double> %1, %2 ; CHECK-DAG: fdiv.d [[R3:\$w[0-9]+]], [[R1]], [[R2]] store <2 x double> %3, <2 x double>* %c ; CHECK-DAG: st.d [[R3]], 0($4) @@ -275,7 +275,7 @@ %1 = load <4 x float>, <4 x float>* %a ; CHECK-DAG: ld.w [[R1:\$w[0-9]+]], 0($5) %2 = tail call <4 x float> @llvm.exp2.v4f32 (<4 x float> %1) - %3 = fmul <4 x float> , %2 + %3 = fmul nexc nrnd <4 x float> , %2 ; CHECK-DAG: ldi.w [[R3:\$w[0-9]+]], 1 ; CHECK-DAG: ffint_u.w [[R4:\$w[0-9]+]], [[R3]] ; CHECK-DAG: fexp2.w [[R5:\$w[0-9]+]], [[R4]], [[R1]] @@ -292,7 +292,7 @@ %1 = load <2 x double>, <2 x double>* %a ; CHECK-DAG: ld.d [[R1:\$w[0-9]+]], 0($5) %2 = tail call <2 x double> @llvm.exp2.v2f64 (<2 x double> %1) - %3 = fmul <2 x double> , %2 + %3 = fmul nexc nrnd <2 x double> , %2 ; CHECK-DAG: ldi.d [[R2:\$w[0-9]+]], 1 ; CHECK-DAG: ffint_u.d [[R3:\$w[0-9]+]], [[R2]] ; CHECK-DAG: fexp2.d [[R4:\$w[0-9]+]], [[R3]], [[R1]] Index: test/CodeGen/Mips/msa/basic_operations_float.ll =================================================================== --- test/CodeGen/Mips/msa/basic_operations_float.ll +++ test/CodeGen/Mips/msa/basic_operations_float.ll @@ -126,7 +126,7 @@ %1 = load <4 x float>, <4 x float>* @v4f32 ; ALL-DAG: ld.w [[R1:\$w[0-9]+]], - %2 = fadd <4 x float> %1, %1 + %2 = fadd nexc nrnd <4 x float> %1, %1 ; ALL-DAG: fadd.w [[R2:\$w[0-9]+]], [[R1]], [[R1]] %3 = extractelement <4 x float> %2, i32 1 @@ -143,7 +143,7 @@ %1 = load <4 x float>, <4 x float>* @v4f32 ; ALL-DAG: ld.w [[R1:\$w[0-9]+]], - %2 = fadd <4 x float> %1, %1 + %2 = fadd nexc nrnd <4 x float> %1, %1 ; ALL-DAG: fadd.w $w0, [[R1]], [[R1]] %3 = extractelement <4 x float> %2, i32 0 @@ -160,7 +160,7 @@ %1 = load <4 x float>, <4 x float>* @v4f32 ; ALL-DAG: ld.w [[R1:\$w[0-9]+]], - %2 = fadd <4 x float> %1, %1 + %2 = fadd nexc nrnd <4 x float> %1, %1 ; ALL-DAG: fadd.w [[R2:\$w[0-9]+]], [[R1]], [[R1]] %3 = extractelement <4 x float> %2, i32 2 @@ -180,7 +180,7 @@ ; N64-DAG: ld [[PTR_V:\$[0-9]+]], %got_disp(v4f32)( ; ALL-DAG: ld.w [[R1:\$w[0-9]+]], 0([[PTR_V]]) - %2 = fadd <4 x float> %1, %1 + %2 = fadd nexc nrnd <4 x float> %1, %1 ; ALL-DAG: fadd.w [[R2:\$w[0-9]+]], [[R1]], [[R1]] %3 = load i32, i32* @i32 @@ -201,7 +201,7 @@ %1 = load <2 x double>, <2 x double>* @v2f64 ; ALL-DAG: ld.d [[R1:\$w[0-9]+]], - %2 = fadd <2 x double> %1, %1 + %2 = fadd nexc nrnd <2 x double> %1, %1 ; ALL-DAG: fadd.d [[R2:\$w[0-9]+]], [[R1]], [[R1]] %3 = extractelement <2 x double> %2, i32 1 @@ -223,7 +223,7 @@ %1 = load <2 x double>, <2 x double>* @v2f64 ; ALL-DAG: ld.d [[R1:\$w[0-9]+]], - %2 = fadd <2 x double> %1, %1 + %2 = fadd nexc nrnd <2 x double> %1, %1 ; ALL-DAG: fadd.d $w0, [[R1]], [[R1]] %3 = extractelement <2 x double> %2, i32 0 @@ -246,7 +246,7 @@ ; N64-DAG: ld [[PTR_V:\$[0-9]+]], %got_disp(v2f64)( ; ALL-DAG: ld.d [[R1:\$w[0-9]+]], 0([[PTR_V]]) - %2 = fadd <2 x double> %1, %1 + %2 = fadd nexc nrnd <2 x double> %1, %1 ; ALL-DAG: fadd.d [[R2:\$w[0-9]+]], [[R1]], [[R1]] %3 = load i32, i32* @i32 Index: test/CodeGen/NVPTX/div-ri.ll =================================================================== --- test/CodeGen/NVPTX/div-ri.ll +++ test/CodeGen/NVPTX/div-ri.ll @@ -2,7 +2,7 @@ define float @foo(float %a) { ; CHECK: div.approx.f32 - %div = fdiv float %a, 13.0 + %div = fdiv nexc nrnd float %a, 13.0 ret float %div } Index: test/CodeGen/NVPTX/fast-math.ll =================================================================== --- test/CodeGen/NVPTX/fast-math.ll +++ test/CodeGen/NVPTX/fast-math.ll @@ -9,7 +9,7 @@ ; CHECK: div.rn.f32 define float @sqrt_div(float %a, float %b) { %t1 = tail call float @llvm.nvvm.sqrt.f(float %a) - %t2 = fdiv float %t1, %b + %t2 = fdiv nexc nrnd float %t1, %b ret float %t2 } @@ -18,7 +18,7 @@ ; CHECK: div.approx.f32 define float @sqrt_div_fast(float %a, float %b) #0 { %t1 = tail call float @llvm.nvvm.sqrt.f(float %a) - %t2 = fdiv float %t1, %b + %t2 = fdiv nexc nrnd float %t1, %b ret float %t2 } @@ -26,14 +26,14 @@ ; CHECK: fadd ; CHECK: add.f32 define float @fadd(float %a, float %b) { - %t1 = fadd float %a, %b + %t1 = fadd nexc nrnd float %a, %b ret float %t1 } ; CHECK: fadd_ftz ; CHECK: add.ftz.f32 define float @fadd_ftz(float %a, float %b) #1 { - %t1 = fadd float %a, %b + %t1 = fadd nexc nrnd float %a, %b ret float %t1 } Index: test/CodeGen/NVPTX/fma-assoc.ll =================================================================== --- test/CodeGen/NVPTX/fma-assoc.ll +++ test/CodeGen/NVPTX/fma-assoc.ll @@ -5,10 +5,10 @@ ; CHECK: fma.rn.f32 %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}; ; CHECK: fma.rn.f32 %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}; ; CHECK: ret; - %a = fmul float %x, %y - %b = fmul float %u, %v - %c = fadd float %a, %b - %d = fadd float %c, %z + %a = fmul nexc nrnd float %x, %y + %b = fmul nexc nrnd float %u, %v + %c = fadd nexc nrnd float %a, %b + %d = fadd nexc nrnd float %c, %z ret float %d } @@ -17,10 +17,10 @@ ; CHECK: fma.rn.f64 %fd{{[0-9]+}}, %fd{{[0-9]+}}, %fd{{[0-9]+}}, %fd{{[0-9]+}}; ; CHECK: fma.rn.f64 %fd{{[0-9]+}}, %fd{{[0-9]+}}, %fd{{[0-9]+}}, %fd{{[0-9]+}}; ; CHECK: ret; - %a = fmul double %x, %y - %b = fmul double %u, %v - %c = fadd double %a, %b - %d = fadd double %c, %z + %a = fmul nexc nrnd double %x, %y + %b = fmul nexc nrnd double %u, %v + %c = fadd nexc nrnd double %a, %b + %d = fadd nexc nrnd double %c, %z ret double %d } @@ -29,9 +29,9 @@ ; CHECK: mul.f64 ; CHECK-NOT: mul.f64 ; CHECK: fma.rn.f64 - %1 = fmul double %val1, %val2 - %2 = fmul double %1, %1 - %3 = fadd double %1, %2 + %1 = fmul nexc nrnd double %val1, %val2 + %2 = fmul nexc nrnd double %1, %1 + %3 = fadd nexc nrnd double %1, %2 ret double %3 } Index: test/CodeGen/NVPTX/fma-disable.ll =================================================================== --- test/CodeGen/NVPTX/fma-disable.ll +++ test/CodeGen/NVPTX/fma-disable.ll @@ -8,8 +8,8 @@ ; FMA: fma.rn.f32 ; MUL: mul.rn.f32 ; MUL: add.rn.f32 - %a = fmul float %x, %y - %b = fadd float %a, %z + %a = fmul nexc nrnd float %x, %y + %b = fadd nexc nrnd float %a, %z ret float %b } @@ -18,7 +18,7 @@ ; FMA: fma.rn.f64 ; MUL: mul.rn.f64 ; MUL: add.rn.f64 - %a = fmul double %x, %y - %b = fadd double %a, %z + %a = fmul nexc nrnd double %x, %y + %b = fadd nexc nrnd double %a, %z ret double %b } Index: test/CodeGen/NVPTX/fma.ll =================================================================== --- test/CodeGen/NVPTX/fma.ll +++ test/CodeGen/NVPTX/fma.ll @@ -6,8 +6,8 @@ define ptx_device float @t1_f32(float %x, float %y, float %z) { ; CHECK: fma.rn.f32 %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}; ; CHECK: ret; - %a = fmul float %x, %y - %b = fadd float %a, %z + %a = fmul nexc nrnd float %x, %y + %b = fadd nexc nrnd float %a, %z ret float %b } @@ -15,9 +15,9 @@ ; CHECK: fma.rn.f32 %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}; ; CHECK: fma.rn.f32 %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}, %f{{[0-9]+}}; ; CHECK: ret; - %a = fmul float %x, %y - %b = fadd float %a, %z - %c = fadd float %a, %w + %a = fmul nexc nrnd float %x, %y + %b = fadd nexc nrnd float %a, %z + %c = fadd nexc nrnd float %a, %w %d = call float @dummy_f32(float %b, float %c) ret float %d } @@ -25,8 +25,8 @@ define ptx_device double @t1_f64(double %x, double %y, double %z) { ; CHECK: fma.rn.f64 %fd{{[0-9]+}}, %fd{{[0-9]+}}, %fd{{[0-9]+}}, %fd{{[0-9]+}}; ; CHECK: ret; - %a = fmul double %x, %y - %b = fadd double %a, %z + %a = fmul nexc nrnd double %x, %y + %b = fadd nexc nrnd double %a, %z ret double %b } @@ -34,9 +34,9 @@ ; CHECK: fma.rn.f64 %fd{{[0-9]+}}, %fd{{[0-9]+}}, %fd{{[0-9]+}}, %fd{{[0-9]+}}; ; CHECK: fma.rn.f64 %fd{{[0-9]+}}, %fd{{[0-9]+}}, %fd{{[0-9]+}}, %fd{{[0-9]+}}; ; CHECK: ret; - %a = fmul double %x, %y - %b = fadd double %a, %z - %c = fadd double %a, %w + %a = fmul nexc nrnd double %x, %y + %b = fadd nexc nrnd double %a, %z + %c = fadd nexc nrnd double %a, %w %d = call double @dummy_f64(double %b, double %c) ret double %d } Index: test/CodeGen/NVPTX/fp-contract.ll =================================================================== --- test/CodeGen/NVPTX/fp-contract.ll +++ test/CodeGen/NVPTX/fp-contract.ll @@ -16,8 +16,8 @@ ;; FAST: fma.rn.f32 ;; DEFAULT: mul.rn.f32 ;; DEFAULT: add.rn.f32 - %v0 = fmul float %a, %b - %v1 = fadd float %v0, %c + %v0 = fmul nexc nrnd float %a, %b + %v1 = fadd nexc nrnd float %v0, %c ret float %v1 } @@ -28,6 +28,6 @@ ;; to prevent ptxas from fusing this with anything else. ;; FAST: add.f32 ;; DEFAULT: add.rn.f32 - %v1 = fadd float %a, %b + %v1 = fadd nexc nrnd float %a, %b ret float %v1 } Index: test/CodeGen/NVPTX/implicit-def.ll =================================================================== --- test/CodeGen/NVPTX/implicit-def.ll +++ test/CodeGen/NVPTX/implicit-def.ll @@ -3,7 +3,7 @@ ; CHECK: // implicit-def: %f[[F0:[0-9]+]] ; CHECK: add.rn.f32 %f{{[0-9]+}}, %f{{[0-9]+}}, %f[[F0]]; define float @foo(float %a) { - %ret = fadd float %a, undef + %ret = fadd nexc nrnd float %a, undef ret float %ret } Index: test/CodeGen/NVPTX/rsqrt.ll =================================================================== --- test/CodeGen/NVPTX/rsqrt.ll +++ test/CodeGen/NVPTX/rsqrt.ll @@ -7,7 +7,7 @@ define float @foo(float %a) { ; CHECK: rsqrt.approx.f32 %val = tail call float @llvm.nvvm.sqrt.f(float %a) - %ret = fdiv float 1.0, %val + %ret = fdiv nexc nrnd float 1.0, %val ret float %ret } Index: test/CodeGen/PowerPC/a2-fp-basic.ll =================================================================== --- test/CodeGen/PowerPC/a2-fp-basic.ll +++ test/CodeGen/PowerPC/a2-fp-basic.ll @@ -12,18 +12,18 @@ %b.real = load double, double* %b.realp %b.imagp = getelementptr inbounds %0, %0* %b, i32 0, i32 1 %b.imag = load double, double* %b.imagp - %mul.rl = fmul double %a.real, %b.real - %mul.rr = fmul double %a.imag, %b.imag - %mul.r = fsub double %mul.rl, %mul.rr - %mul.il = fmul double %a.imag, %b.real - %mul.ir = fmul double %a.real, %b.imag - %mul.i = fadd double %mul.il, %mul.ir + %mul.rl = fmul nexc nrnd double %a.real, %b.real + %mul.rr = fmul nexc nrnd double %a.imag, %b.imag + %mul.r = fsub nexc nrnd double %mul.rl, %mul.rr + %mul.il = fmul nexc nrnd double %a.imag, %b.real + %mul.ir = fmul nexc nrnd double %a.real, %b.imag + %mul.i = fadd nexc nrnd double %mul.il, %mul.ir %c.realp = getelementptr inbounds %0, %0* %c, i32 0, i32 0 %c.real = load double, double* %c.realp %c.imagp = getelementptr inbounds %0, %0* %c, i32 0, i32 1 %c.imag = load double, double* %c.imagp - %add.r = fadd double %mul.r, %c.real - %add.i = fadd double %mul.i, %c.imag + %add.r = fadd nexc nrnd double %mul.r, %c.real + %add.i = fadd nexc nrnd double %mul.i, %c.imag %real = getelementptr inbounds %0, %0* %agg.result, i32 0, i32 0 %imag = getelementptr inbounds %0, %0* %agg.result, i32 0, i32 1 store double %add.r, double* %real Index: test/CodeGen/PowerPC/fdiv-combine.ll =================================================================== --- test/CodeGen/PowerPC/fdiv-combine.ll +++ test/CodeGen/PowerPC/fdiv-combine.ll @@ -14,9 +14,9 @@ ; CHECK: fmul ; CHECK: fmul ; CHECK: fmul - %div = fdiv double %a, %D - %div1 = fdiv double %b, %D - %div2 = fdiv double %c, %D + %div = fdiv nexc nrnd double %a, %D + %div1 = fdiv nexc nrnd double %b, %D + %div2 = fdiv nexc nrnd double %c, %D tail call void @foo_3d(double %div, double %div1, double %div2) ret void } @@ -26,8 +26,8 @@ ; CHECK: fdiv ; CHECK: fdiv ; CHECK-NEXT-NOT: fmul - %div = fdiv double %a, %D - %div1 = fdiv double %b, %D + %div = fdiv nexc nrnd double %a, %D + %div1 = fdiv nexc nrnd double %b, %D tail call void @foo_2d(double %div, double %div1) ret void } Index: test/CodeGen/PowerPC/fma-assoc.ll =================================================================== --- test/CodeGen/PowerPC/fma-assoc.ll +++ test/CodeGen/PowerPC/fma-assoc.ll @@ -3,10 +3,10 @@ define double @test_FMADD_ASSOC1(double %A, double %B, double %C, double %D, double %E) { - %F = fmul double %A, %B ; [#uses=1] - %G = fmul double %C, %D ; [#uses=1] - %H = fadd double %F, %G ; [#uses=1] - %I = fadd double %H, %E ; [#uses=1] + %F = fmul nexc nrnd double %A, %B ; [#uses=1] + %G = fmul nexc nrnd double %C, %D ; [#uses=1] + %H = fadd nexc nrnd double %F, %G ; [#uses=1] + %I = fadd nexc nrnd double %H, %E ; [#uses=1] ret double %I ; CHECK-LABEL: test_FMADD_ASSOC1: ; CHECK: fmadd @@ -22,10 +22,10 @@ define double @test_FMADD_ASSOC2(double %A, double %B, double %C, double %D, double %E) { - %F = fmul double %A, %B ; [#uses=1] - %G = fmul double %C, %D ; [#uses=1] - %H = fadd double %F, %G ; [#uses=1] - %I = fadd double %E, %H ; [#uses=1] + %F = fmul nexc nrnd double %A, %B ; [#uses=1] + %G = fmul nexc nrnd double %C, %D ; [#uses=1] + %H = fadd nexc nrnd double %F, %G ; [#uses=1] + %I = fadd nexc nrnd double %E, %H ; [#uses=1] ret double %I ; CHECK-LABEL: test_FMADD_ASSOC2: ; CHECK: fmadd @@ -41,10 +41,10 @@ define double @test_FMSUB_ASSOC1(double %A, double %B, double %C, double %D, double %E) { - %F = fmul double %A, %B ; [#uses=1] - %G = fmul double %C, %D ; [#uses=1] - %H = fadd double %F, %G ; [#uses=1] - %I = fsub double %H, %E ; [#uses=1] + %F = fmul nexc nrnd double %A, %B ; [#uses=1] + %G = fmul nexc nrnd double %C, %D ; [#uses=1] + %H = fadd nexc nrnd double %F, %G ; [#uses=1] + %I = fsub nexc nrnd double %H, %E ; [#uses=1] ret double %I ; CHECK-LABEL: test_FMSUB_ASSOC1: ; CHECK: fmsub @@ -60,10 +60,10 @@ define double @test_FMSUB_ASSOC2(double %A, double %B, double %C, double %D, double %E) { - %F = fmul double %A, %B ; [#uses=1] - %G = fmul double %C, %D ; [#uses=1] - %H = fadd double %F, %G ; [#uses=1] - %I = fsub double %E, %H ; [#uses=1] + %F = fmul nexc nrnd double %A, %B ; [#uses=1] + %G = fmul nexc nrnd double %C, %D ; [#uses=1] + %H = fadd nexc nrnd double %F, %G ; [#uses=1] + %I = fsub nexc nrnd double %E, %H ; [#uses=1] ret double %I ; CHECK-LABEL: test_FMSUB_ASSOC2: ; CHECK: fnmsub @@ -79,11 +79,11 @@ define double @test_FMADD_ASSOC_EXT1(float %A, float %B, double %C, double %D, double %E) { - %F = fmul float %A, %B ; [#uses=1] + %F = fmul nexc nrnd float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] - %H = fmul double %C, %D ; [#uses=1] - %I = fadd double %H, %G ; [#uses=1] - %J = fadd double %I, %E ; [#uses=1] + %H = fmul nexc nrnd double %C, %D ; [#uses=1] + %I = fadd nexc nrnd double %H, %G ; [#uses=1] + %J = fadd nexc nrnd double %I, %E ; [#uses=1] ret double %J ; CHECK-LABEL: test_FMADD_ASSOC_EXT1: ; CHECK: fmadd @@ -98,11 +98,11 @@ define double @test_FMADD_ASSOC_EXT2(float %A, float %B, float %C, float %D, double %E) { - %F = fmul float %A, %B ; [#uses=1] - %G = fmul float %C, %D ; [#uses=1] - %H = fadd float %F, %G ; [#uses=1] + %F = fmul nexc nrnd float %A, %B ; [#uses=1] + %G = fmul nexc nrnd float %C, %D ; [#uses=1] + %H = fadd nexc nrnd float %F, %G ; [#uses=1] %I = fpext float %H to double ; [#uses=1] - %J = fadd double %I, %E ; [#uses=1] + %J = fadd nexc nrnd double %I, %E ; [#uses=1] ret double %J ; CHECK-LABEL: test_FMADD_ASSOC_EXT2: ; CHECK: fmadd @@ -118,11 +118,11 @@ define double @test_FMADD_ASSOC_EXT3(float %A, float %B, double %C, double %D, double %E) { - %F = fmul float %A, %B ; [#uses=1] + %F = fmul nexc nrnd float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] - %H = fmul double %C, %D ; [#uses=1] - %I = fadd double %H, %G ; [#uses=1] - %J = fadd double %E, %I ; [#uses=1] + %H = fmul nexc nrnd double %C, %D ; [#uses=1] + %I = fadd nexc nrnd double %H, %G ; [#uses=1] + %J = fadd nexc nrnd double %E, %I ; [#uses=1] ret double %J ; CHECK-LABEL: test_FMADD_ASSOC_EXT3: ; CHECK: fmadd @@ -137,11 +137,11 @@ define double @test_FMADD_ASSOC_EXT4(float %A, float %B, float %C, float %D, double %E) { - %F = fmul float %A, %B ; [#uses=1] - %G = fmul float %C, %D ; [#uses=1] - %H = fadd float %F, %G ; [#uses=1] + %F = fmul nexc nrnd float %A, %B ; [#uses=1] + %G = fmul nexc nrnd float %C, %D ; [#uses=1] + %H = fadd nexc nrnd float %F, %G ; [#uses=1] %I = fpext float %H to double ; [#uses=1] - %J = fadd double %E, %I ; [#uses=1] + %J = fadd nexc nrnd double %E, %I ; [#uses=1] ret double %J ; CHECK-LABEL: test_FMADD_ASSOC_EXT4: ; CHECK: fmadd @@ -157,11 +157,11 @@ define double @test_FMSUB_ASSOC_EXT1(float %A, float %B, double %C, double %D, double %E) { - %F = fmul float %A, %B ; [#uses=1] + %F = fmul nexc nrnd float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] - %H = fmul double %C, %D ; [#uses=1] - %I = fadd double %H, %G ; [#uses=1] - %J = fsub double %I, %E ; [#uses=1] + %H = fmul nexc nrnd double %C, %D ; [#uses=1] + %I = fadd nexc nrnd double %H, %G ; [#uses=1] + %J = fsub nexc nrnd double %I, %E ; [#uses=1] ret double %J ; CHECK-LABEL: test_FMSUB_ASSOC_EXT1: ; CHECK: fmsub @@ -176,11 +176,11 @@ define double @test_FMSUB_ASSOC_EXT2(float %A, float %B, float %C, float %D, double %E) { - %F = fmul float %A, %B ; [#uses=1] - %G = fmul float %C, %D ; [#uses=1] - %H = fadd float %F, %G ; [#uses=1] + %F = fmul nexc nrnd float %A, %B ; [#uses=1] + %G = fmul nexc nrnd float %C, %D ; [#uses=1] + %H = fadd nexc nrnd float %F, %G ; [#uses=1] %I = fpext float %H to double ; [#uses=1] - %J = fsub double %I, %E ; [#uses=1] + %J = fsub nexc nrnd double %I, %E ; [#uses=1] ret double %J ; CHECK-LABEL: test_FMSUB_ASSOC_EXT2: ; CHECK: fmsub @@ -196,11 +196,11 @@ define double @test_FMSUB_ASSOC_EXT3(float %A, float %B, double %C, double %D, double %E) { - %F = fmul float %A, %B ; [#uses=1] + %F = fmul nexc nrnd float %A, %B ; [#uses=1] %G = fpext float %F to double ; [#uses=1] - %H = fmul double %C, %D ; [#uses=1] - %I = fadd double %H, %G ; [#uses=1] - %J = fsub double %E, %I ; [#uses=1] + %H = fmul nexc nrnd double %C, %D ; [#uses=1] + %I = fadd nexc nrnd double %H, %G ; [#uses=1] + %J = fsub nexc nrnd double %E, %I ; [#uses=1] ret double %J ; CHECK-LABEL: test_FMSUB_ASSOC_EXT3: ; CHECK: fnmsub @@ -216,11 +216,11 @@ define double @test_FMSUB_ASSOC_EXT4(float %A, float %B, float %C, float %D, double %E) { - %F = fmul float %A, %B ; [#uses=1] - %G = fmul float %C, %D ; [#uses=1] - %H = fadd float %F, %G ; [#uses=1] + %F = fmul nexc nrnd float %A, %B ; [#uses=1] + %G = fmul nexc nrnd float %C, %D ; [#uses=1] + %H = fadd nexc nrnd float %F, %G ; [#uses=1] %I = fpext float %H to double ; [#uses=1] - %J = fsub double %E, %I ; [#uses=1] + %J = fsub nexc nrnd double %E, %I ; [#uses=1] ret double %J ; CHECK-LABEL: test_FMSUB_ASSOC_EXT4: ; CHECK: fnmsub Index: test/CodeGen/PowerPC/fma-ext.ll =================================================================== --- test/CodeGen/PowerPC/fma-ext.ll +++ test/CodeGen/PowerPC/fma-ext.ll @@ -2,9 +2,9 @@ ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -fp-contract=fast -mattr=+vsx -mcpu=pwr7 | FileCheck -check-prefix=CHECK-VSX %s define double @test_FMADD_EXT1(float %A, float %B, double %C) { - %D = fmul float %A, %B ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] %E = fpext float %D to double ; [#uses=1] - %F = fadd double %E, %C ; [#uses=1] + %F = fadd nexc nrnd double %E, %C ; [#uses=1] ret double %F ; CHECK-LABEL: test_FMADD_EXT1: ; CHECK: fmadd @@ -16,9 +16,9 @@ } define double @test_FMADD_EXT2(float %A, float %B, double %C) { - %D = fmul float %A, %B ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] %E = fpext float %D to double ; [#uses=1] - %F = fadd double %C, %E ; [#uses=1] + %F = fadd nexc nrnd double %C, %E ; [#uses=1] ret double %F ; CHECK-LABEL: test_FMADD_EXT2: ; CHECK: fmadd @@ -30,9 +30,9 @@ } define double @test_FMSUB_EXT1(float %A, float %B, double %C) { - %D = fmul float %A, %B ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] %E = fpext float %D to double ; [#uses=1] - %F = fsub double %E, %C ; [#uses=1] + %F = fsub nexc nrnd double %E, %C ; [#uses=1] ret double %F ; CHECK-LABEL: test_FMSUB_EXT1: ; CHECK: fmsub @@ -44,9 +44,9 @@ } define double @test_FMSUB_EXT2(float %A, float %B, double %C) { - %D = fmul float %A, %B ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] %E = fpext float %D to double ; [#uses=1] - %F = fsub double %C, %E ; [#uses=1] + %F = fsub nexc nrnd double %C, %E ; [#uses=1] ret double %F ; CHECK-LABEL: test_FMSUB_EXT2: ; CHECK: fnmsub @@ -59,10 +59,10 @@ } define double @test_FMSUB_EXT3(float %A, float %B, double %C) { - %D = fmul float %A, %B ; [#uses=1] - %E = fsub float -0.000000e+00, %D ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] + %E = fsub nexc nrnd float -0.000000e+00, %D ; [#uses=1] %F = fpext float %E to double ; [#uses=1] - %G = fsub double %F, %C ; [#uses=1] + %G = fsub nexc nrnd double %F, %C ; [#uses=1] ret double %G ; CHECK-LABEL: test_FMSUB_EXT3: ; CHECK: fnmadd @@ -76,10 +76,10 @@ } define double @test_FMSUB_EXT4(float %A, float %B, double %C) { - %D = fmul float %A, %B ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] %E = fpext float %D to double ; [#uses=1] - %F = fsub double -0.000000e+00, %E ; [#uses=1] - %G = fsub double %F, %C ; [#uses=1] + %F = fsub nexc nrnd double -0.000000e+00, %E ; [#uses=1] + %G = fsub nexc nrnd double %F, %C ; [#uses=1] ret double %G ; CHECK-LABEL: test_FMSUB_EXT4: ; CHECK: fnmadd Index: test/CodeGen/PowerPC/fma.ll =================================================================== --- test/CodeGen/PowerPC/fma.ll +++ test/CodeGen/PowerPC/fma.ll @@ -9,8 +9,8 @@ declare float @dummy4(float, float) #0 define double @test_FMADD1(double %A, double %B, double %C) { - %D = fmul double %A, %B ; [#uses=1] - %E = fadd double %C, %D ; [#uses=1] + %D = fmul nexc nrnd double %A, %B ; [#uses=1] + %E = fadd nexc nrnd double %C, %D ; [#uses=1] ret double %E ; CHECK-LABEL: test_FMADD1: ; CHECK: fmadd @@ -22,8 +22,8 @@ } define double @test_FMADD2(double %A, double %B, double %C) { - %D = fmul double %A, %B ; [#uses=1] - %E = fadd double %D, %C ; [#uses=1] + %D = fmul nexc nrnd double %A, %B ; [#uses=1] + %E = fadd nexc nrnd double %D, %C ; [#uses=1] ret double %E ; CHECK-LABEL: test_FMADD2: ; CHECK: fmadd @@ -35,8 +35,8 @@ } define double @test_FMSUB1(double %A, double %B, double %C) { - %D = fmul double %A, %B ; [#uses=1] - %E = fsub double %D, %C ; [#uses=1] + %D = fmul nexc nrnd double %A, %B ; [#uses=1] + %E = fsub nexc nrnd double %D, %C ; [#uses=1] ret double %E ; CHECK-LABEL: test_FMSUB1: ; CHECK: fmsub @@ -48,9 +48,9 @@ } define double @test_FMSUB2(double %A, double %B, double %C, double %D) { - %E = fmul double %A, %B ; [#uses=2] - %F = fadd double %E, %C ; [#uses=1] - %G = fsub double %E, %D ; [#uses=1] + %E = fmul nexc nrnd double %A, %B ; [#uses=2] + %F = fadd nexc nrnd double %E, %C ; [#uses=1] + %G = fsub nexc nrnd double %E, %D ; [#uses=1] %H = call double @dummy2(double %F, double %G) ; [#uses=1] ret double %H ; CHECK-LABEL: test_FMSUB2: @@ -63,9 +63,9 @@ } define double @test_FNMADD1(double %A, double %B, double %C) { - %D = fmul double %A, %B ; [#uses=1] - %E = fadd double %D, %C ; [#uses=1] - %F = fsub double -0.000000e+00, %E ; [#uses=1] + %D = fmul nexc nrnd double %A, %B ; [#uses=1] + %E = fadd nexc nrnd double %D, %C ; [#uses=1] + %F = fsub nexc nrnd double -0.000000e+00, %E ; [#uses=1] ret double %F ; CHECK-LABEL: test_FNMADD1: ; CHECK: fnmadd @@ -77,9 +77,9 @@ } define double @test_FNMADD2(double %A, double %B, double %C) { - %D = fmul double %A, %B ; [#uses=1] - %E = fadd double %C, %D ; [#uses=1] - %F = fsub double -0.000000e+00, %E ; [#uses=1] + %D = fmul nexc nrnd double %A, %B ; [#uses=1] + %E = fadd nexc nrnd double %C, %D ; [#uses=1] + %F = fsub nexc nrnd double -0.000000e+00, %E ; [#uses=1] ret double %F ; CHECK-LABEL: test_FNMADD2: ; CHECK: fnmadd @@ -91,8 +91,8 @@ } define double @test_FNMSUB1(double %A, double %B, double %C) { - %D = fmul double %A, %B ; [#uses=1] - %E = fsub double %C, %D ; [#uses=1] + %D = fmul nexc nrnd double %A, %B ; [#uses=1] + %E = fsub nexc nrnd double %C, %D ; [#uses=1] ret double %E ; CHECK-LABEL: test_FNMSUB1: ; CHECK: fnmsub @@ -103,9 +103,9 @@ } define double @test_FNMSUB2(double %A, double %B, double %C) { - %D = fmul double %A, %B ; [#uses=1] - %E = fsub double %D, %C ; [#uses=1] - %F = fsub double -0.000000e+00, %E ; [#uses=1] + %D = fmul nexc nrnd double %A, %B ; [#uses=1] + %E = fsub nexc nrnd double %D, %C ; [#uses=1] + %F = fsub nexc nrnd double -0.000000e+00, %E ; [#uses=1] ret double %F ; CHECK-LABEL: test_FNMSUB2: ; CHECK: fnmsub @@ -117,9 +117,9 @@ } define float @test_FNMSUBS(float %A, float %B, float %C) { - %D = fmul float %A, %B ; [#uses=1] - %E = fsub float %D, %C ; [#uses=1] - %F = fsub float -0.000000e+00, %E ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] + %E = fsub nexc nrnd float %D, %C ; [#uses=1] + %F = fsub nexc nrnd float -0.000000e+00, %E ; [#uses=1] ret float %F ; CHECK-LABEL: test_FNMSUBS: ; CHECK: fnmsubs @@ -131,8 +131,8 @@ } define float @test_XSMADDMSP(float %A, float %B, float %C) { - %D = fmul float %A, %B ; [#uses=1] - %E = fadd float %C, %D ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] + %E = fadd nexc nrnd float %C, %D ; [#uses=1] ret float %E ; CHECK-P8-LABEL: test_XSMADDMSP: ; CHECK-P8: xsmaddmsp @@ -140,8 +140,8 @@ } define float @test_XSMSUBMSP(float %A, float %B, float %C) { - %D = fmul float %A, %B ; [#uses=1] - %E = fsub float %D, %C ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] + %E = fsub nexc nrnd float %D, %C ; [#uses=1] ret float %E ; CHECK-P8-LABEL: test_XSMSUBMSP: ; CHECK-P8: xsmsubmsp @@ -149,9 +149,9 @@ } define float @test_XSMADDASP(float %A, float %B, float %C, float %D) { - %E = fmul float %A, %B ; [#uses=2] - %F = fadd float %E, %C ; [#uses=1] - %G = fsub float %E, %D ; [#uses=1] + %E = fmul nexc nrnd float %A, %B ; [#uses=2] + %F = fadd nexc nrnd float %E, %C ; [#uses=1] + %G = fsub nexc nrnd float %E, %D ; [#uses=1] %H = call float @dummy4(float %F, float %G) ; [#uses=1] ret float %H ; CHECK-P8-LABEL: test_XSMADDASP: @@ -160,9 +160,9 @@ } define float @test_XSMSUBASP(float %A, float %B, float %C, float %D) { - %E = fmul float %A, %B ; [#uses=2] - %F = fsub float %E, %C ; [#uses=1] - %G = fsub float %E, %D ; [#uses=1] + %E = fmul nexc nrnd float %A, %B ; [#uses=2] + %F = fsub nexc nrnd float %E, %C ; [#uses=1] + %G = fsub nexc nrnd float %E, %D ; [#uses=1] %H = call float @dummy4(float %F, float %G) ; [#uses=1] ret float %H ; CHECK-P8-LABEL: test_XSMSUBASP: @@ -171,9 +171,9 @@ } define float @test_XSNMADDMSP(float %A, float %B, float %C) { - %D = fmul float %A, %B ; [#uses=1] - %E = fadd float %D, %C ; [#uses=1] - %F = fsub float -0.000000e+00, %E ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] + %E = fadd nexc nrnd float %D, %C ; [#uses=1] + %F = fsub nexc nrnd float -0.000000e+00, %E ; [#uses=1] ret float %F ; CHECK-P8-LABEL: test_XSNMADDMSP: ; CHECK-P8: xsnmaddmsp @@ -181,9 +181,9 @@ } define float @test_XSNMSUBMSP(float %A, float %B, float %C) { - %D = fmul float %A, %B ; [#uses=1] - %E = fsub float %D, %C ; [#uses=1] - %F = fsub float -0.000000e+00, %E ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] + %E = fsub nexc nrnd float %D, %C ; [#uses=1] + %F = fsub nexc nrnd float -0.000000e+00, %E ; [#uses=1] ret float %F ; CHECK-P8-LABEL: test_XSNMSUBMSP: ; CHECK-P8: xsnmsubmsp @@ -191,9 +191,9 @@ } define float @test_XSNMADDASP(float %A, float %B, float %C) { - %D = fmul float %A, %B ; [#uses=1] - %E = fadd float %D, %C ; [#uses=1] - %F = fsub float -0.000000e+00, %E ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] + %E = fadd nexc nrnd float %D, %C ; [#uses=1] + %F = fsub nexc nrnd float -0.000000e+00, %E ; [#uses=1] %H = call float @dummy4(float %E, float %F) ; [#uses=1] ret float %F ; CHECK-P8-LABEL: test_XSNMADDASP: @@ -201,9 +201,9 @@ } define float @test_XSNMSUBASP(float %A, float %B, float %C) { - %D = fmul float %A, %B ; [#uses=1] - %E = fsub float %D, %C ; [#uses=1] - %F = fsub float -0.000000e+00, %E ; [#uses=1] + %D = fmul nexc nrnd float %A, %B ; [#uses=1] + %E = fsub nexc nrnd float %D, %C ; [#uses=1] + %F = fsub nexc nrnd float -0.000000e+00, %E ; [#uses=1] %H = call float @dummy4(float %E, float %F) ; [#uses=1] ret float %F ; CHECK-P8-LABEL: test_XSNMSUBASP: Index: test/CodeGen/PowerPC/fneg.ll =================================================================== --- test/CodeGen/PowerPC/fneg.ll +++ test/CodeGen/PowerPC/fneg.ll @@ -2,10 +2,10 @@ define double @test1(double %a, double %b, double %c, double %d) { entry: - %tmp2 = fsub double -0.000000e+00, %c ; [#uses=1] - %tmp4 = fmul double %tmp2, %d ; [#uses=1] - %tmp7 = fmul double %a, %b ; [#uses=1] - %tmp9 = fsub double %tmp7, %tmp4 ; [#uses=1] + %tmp2 = fsub nexc nrnd double -0.000000e+00, %c ; [#uses=1] + %tmp4 = fmul nexc nrnd double %tmp2, %d ; [#uses=1] + %tmp7 = fmul nexc nrnd double %a, %b ; [#uses=1] + %tmp9 = fsub nexc nrnd double %tmp7, %tmp4 ; [#uses=1] ret double %tmp9 } Index: test/CodeGen/PowerPC/loop-prep-all.ll =================================================================== --- test/CodeGen/PowerPC/loop-prep-all.ll +++ test/CodeGen/PowerPC/loop-prep-all.ll @@ -12,7 +12,7 @@ %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv %0 = load double, double* %arrayidx, align 8 - %add = fadd double %0, 1.000000e+00 + %add = fadd nexc nrnd double %0, 1.000000e+00 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv store double %add, double* %arrayidx2, align 8 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 Index: test/CodeGen/PowerPC/machine-combiner.ll =================================================================== --- test/CodeGen/PowerPC/machine-combiner.ll +++ test/CodeGen/PowerPC/machine-combiner.ll @@ -14,9 +14,9 @@ ; CHECK: fadds 1, [[REG0]], [[REG1]] ; CHECK-NEXT: blr - %t0 = fadd float %x0, %x1 - %t1 = fadd float %t0, %x2 - %t2 = fadd float %t1, %x3 + %t0 = fadd nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %t0, %x2 + %t2 = fadd nexc nrnd float %t1, %x3 ret float %t2 } @@ -28,9 +28,9 @@ ; CHECK: fadds 1, [[REG0]], [[REG1]] ; CHECK-NEXT: blr - %t0 = fadd float %x0, %x1 - %t1 = fadd float %x2, %t0 - %t2 = fadd float %t1, %x3 + %t0 = fadd nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %x2, %t0 + %t2 = fadd nexc nrnd float %t1, %x3 ret float %t2 } @@ -42,9 +42,9 @@ ; CHECK: fadds 1, [[REG0]], [[REG1]] ; CHECK-NEXT: blr - %t0 = fadd float %x0, %x1 - %t1 = fadd float %t0, %x2 - %t2 = fadd float %x3, %t1 + %t0 = fadd nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %t0, %x2 + %t2 = fadd nexc nrnd float %x3, %t1 ret float %t2 } @@ -56,9 +56,9 @@ ; CHECK: fadds 1, [[REG0]], [[REG1]] ; CHECK-NEXT: blr - %t0 = fadd float %x0, %x1 - %t1 = fadd float %x2, %t0 - %t2 = fadd float %x3, %t1 + %t0 = fadd nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %x2, %t0 + %t2 = fadd nexc nrnd float %x3, %t1 ret float %t2 } @@ -77,13 +77,13 @@ ; CHECK: fadds 1, [[REG2]], 8 ; CHECK-NEXT: blr - %t0 = fadd float %x0, %x1 - %t1 = fadd float %t0, %x2 - %t2 = fadd float %t1, %x3 - %t3 = fadd float %t2, %x4 - %t4 = fadd float %t3, %x5 - %t5 = fadd float %t4, %x6 - %t6 = fadd float %t5, %x7 + %t0 = fadd nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %t0, %x2 + %t2 = fadd nexc nrnd float %t1, %x3 + %t3 = fadd nexc nrnd float %t2, %x4 + %t4 = fadd nexc nrnd float %t3, %x5 + %t5 = fadd nexc nrnd float %t4, %x6 + %t6 = fadd nexc nrnd float %t5, %x7 ret float %t6 } @@ -100,9 +100,9 @@ ; CHECK-PWR: xvaddsp 34, [[REG0]], [[REG1]] ; CHECK-NEXT: blr - %t0 = fadd <4 x float> %x0, %x1 - %t1 = fadd <4 x float> %t0, %x2 - %t2 = fadd <4 x float> %t1, %x3 + %t0 = fadd nexc nrnd <4 x float> %x0, %x1 + %t1 = fadd nexc nrnd <4 x float> %t0, %x2 + %t2 = fadd nexc nrnd <4 x float> %t1, %x3 ret <4 x float> %t2 } @@ -117,9 +117,9 @@ ; CHECK-PWR: xvaddsp 34, [[REG0]], [[REG1]] ; CHECK-NEXT: blr - %t0 = fadd <4 x float> %x0, %x1 - %t1 = fadd <4 x float> %x2, %t0 - %t2 = fadd <4 x float> %t1, %x3 + %t0 = fadd nexc nrnd <4 x float> %x0, %x1 + %t1 = fadd nexc nrnd <4 x float> %x2, %t0 + %t2 = fadd nexc nrnd <4 x float> %t1, %x3 ret <4 x float> %t2 } @@ -134,9 +134,9 @@ ; CHECK-PWR: xvaddsp 34, [[REG0]], [[REG1]] ; CHECK-NEXT: blr - %t0 = fadd <4 x float> %x0, %x1 - %t1 = fadd <4 x float> %t0, %x2 - %t2 = fadd <4 x float> %x3, %t1 + %t0 = fadd nexc nrnd <4 x float> %x0, %x1 + %t1 = fadd nexc nrnd <4 x float> %t0, %x2 + %t2 = fadd nexc nrnd <4 x float> %x3, %t1 ret <4 x float> %t2 } @@ -151,37 +151,37 @@ ; CHECK-PWR: xvaddsp 34, [[REG0]], [[REG1]] ; CHECK-NEXT: blr - %t0 = fadd <4 x float> %x0, %x1 - %t1 = fadd <4 x float> %x2, %t0 - %t2 = fadd <4 x float> %x3, %t1 + %t0 = fadd nexc nrnd <4 x float> %x0, %x1 + %t1 = fadd nexc nrnd <4 x float> %x2, %t0 + %t2 = fadd nexc nrnd <4 x float> %x3, %t1 ret <4 x float> %t2 } define float @reassociate_adds6(float %x0, float %x1, float %x2, float %x3) { - %t0 = fdiv float %x0, %x1 - %t1 = fadd float %x2, %t0 - %t2 = fadd float %x3, %t1 + %t0 = fdiv nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %x2, %t0 + %t2 = fadd nexc nrnd float %x3, %t1 ret float %t2 } define float @reassociate_muls1(float %x0, float %x1, float %x2, float %x3) { - %t0 = fdiv float %x0, %x1 - %t1 = fmul float %x2, %t0 - %t2 = fmul float %x3, %t1 + %t0 = fdiv nexc nrnd float %x0, %x1 + %t1 = fmul nexc nrnd float %x2, %t0 + %t2 = fmul nexc nrnd float %x3, %t1 ret float %t2 } define double @reassociate_adds_double(double %x0, double %x1, double %x2, double %x3) { - %t0 = fdiv double %x0, %x1 - %t1 = fadd double %x2, %t0 - %t2 = fadd double %x3, %t1 + %t0 = fdiv nexc nrnd double %x0, %x1 + %t1 = fadd nexc nrnd double %x2, %t0 + %t2 = fadd nexc nrnd double %x3, %t1 ret double %t2 } define double @reassociate_muls_double(double %x0, double %x1, double %x2, double %x3) { - %t0 = fdiv double %x0, %x1 - %t1 = fmul double %x2, %t0 - %t2 = fmul double %x3, %t1 + %t0 = fdiv nexc nrnd double %x0, %x1 + %t1 = fmul nexc nrnd double %x2, %t0 + %t2 = fmul nexc nrnd double %x3, %t1 ret double %t2 } Index: test/CodeGen/PowerPC/pip-inner.ll =================================================================== --- test/CodeGen/PowerPC/pip-inner.ll +++ test/CodeGen/PowerPC/pip-inner.ll @@ -15,7 +15,7 @@ %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body3 ] %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv %0 = load double, double* %arrayidx, align 8 - %add = fadd double %0, 1.000000e+00 + %add = fadd nexc nrnd double %0, 1.000000e+00 %arrayidx5 = getelementptr inbounds double, double* %x, i64 %indvars.iv store double %add, double* %arrayidx5, align 8 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 Index: test/CodeGen/PowerPC/ppc440-fp-basic.ll =================================================================== --- test/CodeGen/PowerPC/ppc440-fp-basic.ll +++ test/CodeGen/PowerPC/ppc440-fp-basic.ll @@ -12,18 +12,18 @@ %b.real = load double, double* %b.realp %b.imagp = getelementptr inbounds %0, %0* %b, i32 0, i32 1 %b.imag = load double, double* %b.imagp - %mul.rl = fmul double %a.real, %b.real - %mul.rr = fmul double %a.imag, %b.imag - %mul.r = fsub double %mul.rl, %mul.rr - %mul.il = fmul double %a.imag, %b.real - %mul.ir = fmul double %a.real, %b.imag - %mul.i = fadd double %mul.il, %mul.ir + %mul.rl = fmul nexc nrnd double %a.real, %b.real + %mul.rr = fmul nexc nrnd double %a.imag, %b.imag + %mul.r = fsub nexc nrnd double %mul.rl, %mul.rr + %mul.il = fmul nexc nrnd double %a.imag, %b.real + %mul.ir = fmul nexc nrnd double %a.real, %b.imag + %mul.i = fadd nexc nrnd double %mul.il, %mul.ir %c.realp = getelementptr inbounds %0, %0* %c, i32 0, i32 0 %c.real = load double, double* %c.realp %c.imagp = getelementptr inbounds %0, %0* %c, i32 0, i32 1 %c.imag = load double, double* %c.imagp - %add.r = fadd double %mul.r, %c.real - %add.i = fadd double %mul.i, %c.imag + %add.r = fadd nexc nrnd double %mul.r, %c.real + %add.i = fadd nexc nrnd double %mul.i, %c.imag %real = getelementptr inbounds %0, %0* %agg.result, i32 0, i32 0 %imag = getelementptr inbounds %0, %0* %agg.result, i32 0, i32 1 store double %add.r, double* %real Index: test/CodeGen/PowerPC/pr15632.ll =================================================================== --- test/CodeGen/PowerPC/pr15632.ll +++ test/CodeGen/PowerPC/pr15632.ll @@ -7,7 +7,7 @@ define void @bug() { entry: - %tmp70 = frem ppc_fp128 0xM00000000000000000000000000000000, undef + %tmp70 = frem nexc nrnd ppc_fp128 0xM00000000000000000000000000000000, undef call void @other(ppc_fp128 %tmp70) unreachable } Index: test/CodeGen/PowerPC/qpx-bv-sint.ll =================================================================== --- test/CodeGen/PowerPC/qpx-bv-sint.ll +++ test/CodeGen/PowerPC/qpx-bv-sint.ll @@ -11,8 +11,8 @@ %conv.5 = sitofp i32 undef to double %mul.4.v.i0.1 = insertelement <2 x double> undef, double %conv.4, i32 0 %mul.4.v.i0.2 = insertelement <2 x double> %mul.4.v.i0.1, double %conv.5, i32 1 - %mul.4 = fmul <2 x double> %mul.4.v.i0.2, undef - %add7.4 = fadd <2 x double> undef, %mul.4 + %mul.4 = fmul nexc nrnd <2 x double> %mul.4.v.i0.2, undef + %add7.4 = fadd nexc nrnd <2 x double> undef, %mul.4 store <2 x double> %add7.4, <2 x double>* undef, align 16 br i1 undef, label %for.end, label %for.body4 Index: test/CodeGen/PowerPC/qpx-split-vsetcc.ll =================================================================== --- test/CodeGen/PowerPC/qpx-split-vsetcc.ll +++ test/CodeGen/PowerPC/qpx-split-vsetcc.ll @@ -19,9 +19,9 @@ vector.body198: ; preds = %vector.body198, %for.body46.lr.ph %0 = icmp ne <4 x i32> undef, zeroinitializer %1 = select <4 x i1> %0, <4 x double> , <4 x double> - %2 = fmul <4 x double> undef, %1 - %3 = fmul <4 x double> undef, %2 - %4 = fmul <4 x double> %3, undef + %2 = fmul nexc nrnd <4 x double> undef, %1 + %3 = fmul nexc nrnd <4 x double> undef, %2 + %4 = fmul nexc nrnd <4 x double> %3, undef store <4 x double> %4, <4 x double>* undef, align 8 br label %vector.body198 Index: test/CodeGen/PowerPC/recipest.ll =================================================================== --- test/CodeGen/PowerPC/recipest.ll +++ test/CodeGen/PowerPC/recipest.ll @@ -10,7 +10,7 @@ define double @foo(double %a, double %b) nounwind { %x = call double @llvm.sqrt.f64(double %b) - %r = fdiv double %a, %x + %r = fdiv nexc nrnd double %a, %x ret double %r ; CHECK: @foo @@ -41,15 +41,15 @@ define double @foof(double %a, float %b) nounwind { %x = call float @llvm.sqrt.f32(float %b) %y = fpext float %x to double - %r = fdiv double %a, %y + %r = fdiv nexc nrnd double %a, %y ret double %r ; CHECK: @foof ; CHECK-DAG: frsqrtes ; CHECK-DAG: fnmsubs -; CHECK: fmuls +; CHECK: fmul ; CHECK-NEXT: fmadds -; CHECK-NEXT: fmuls +; CHECK-NEXT: fmul ; CHECK-NEXT: fmul ; CHECK-NEXT: blr @@ -62,7 +62,7 @@ define float @food(float %a, double %b) nounwind { %x = call double @llvm.sqrt.f64(double %b) %y = fptrunc double %x to float - %r = fdiv float %a, %y + %r = fdiv nexc nrnd float %a, %y ret float %r ; CHECK: @foo @@ -75,39 +75,39 @@ ; CHECK-NEXT: fmadd ; CHECK-NEXT: fmul ; CHECK-NEXT: frsp -; CHECK-NEXT: fmuls +; CHECK-NEXT: fmul ; CHECK-NEXT: blr ; CHECK-SAFE: @foo ; CHECK-SAFE: fsqrt -; CHECK-SAFE: fdivs +; CHECK-SAFE: fdiv ; CHECK-SAFE: blr } define float @goo(float %a, float %b) nounwind { %x = call float @llvm.sqrt.f32(float %b) - %r = fdiv float %a, %x + %r = fdiv nexc nrnd float %a, %x ret float %r ; CHECK: @goo ; CHECK-DAG: frsqrtes ; CHECK-DAG: fnmsubs -; CHECK: fmuls +; CHECK: fmul ; CHECK-NEXT: fmadds -; CHECK-NEXT: fmuls -; CHECK-NEXT: fmuls +; CHECK-NEXT: fmul +; CHECK-NEXT: fmul ; CHECK-NEXT: blr ; CHECK-NONR: @goo ; CHECK-NONR: frsqrtes ; CHECK-NONR-NOT: fmadds -; CHECK-NONR: fmuls +; CHECK-NONR: fmul ; CHECK-NONR-NOT: fmadds ; CHECK-NONR: blr ; CHECK-SAFE: @goo ; CHECK-SAFE: fsqrts -; CHECK-SAFE: fdivs +; CHECK-SAFE: fdiv ; CHECK-SAFE: blr } @@ -115,33 +115,33 @@ ; not 1 / ( 1 / sqrt(a)) * rcp(b) * c. define float @rsqrt_fmul(float %a, float %b, float %c) { %x = call float @llvm.sqrt.f32(float %a) - %y = fmul float %x, %b - %z = fdiv float %c, %y + %y = fmul nexc nrnd float %x, %b + %z = fdiv nexc nrnd float %c, %y ret float %z ; CHECK: @rsqrt_fmul ; CHECK-DAG: frsqrtes ; CHECK-DAG: fres ; CHECK-DAG: fnmsubs -; CHECK-DAG: fmuls +; CHECK-DAG: fmul ; CHECK-DAG: fnmsubs ; CHECK-DAG: fmadds ; CHECK-DAG: fmadds -; CHECK: fmuls -; CHECK-NEXT: fmuls -; CHECK-NEXT: fmuls +; CHECK: fmul +; CHECK-NEXT: fmul +; CHECK-NEXT: fmul ; CHECK-NEXT: blr ; CHECK-SAFE: @rsqrt_fmul ; CHECK-SAFE: fsqrts -; CHECK-SAFE: fmuls -; CHECK-SAFE: fdivs +; CHECK-SAFE: fmul +; CHECK-SAFE: fdiv ; CHECK-SAFE: blr } define <4 x float> @hoo(<4 x float> %a, <4 x float> %b) nounwind { %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b) - %r = fdiv <4 x float> %a, %x + %r = fdiv nexc nrnd <4 x float> %a, %x ret <4 x float> %r ; CHECK: @hoo @@ -153,7 +153,7 @@ } define double @foo2(double %a, double %b) nounwind { - %r = fdiv double %a, %b + %r = fdiv nexc nrnd double %a, %b ret double %r ; CHECK: @foo2 @@ -171,23 +171,23 @@ } define float @goo2(float %a, float %b) nounwind { - %r = fdiv float %a, %b + %r = fdiv nexc nrnd float %a, %b ret float %r ; CHECK: @goo2 ; CHECK-DAG: fres ; CHECK-DAG: fnmsubs ; CHECK: fmadds -; CHECK-NEXT: fmuls +; CHECK-NEXT: fmul ; CHECK-NEXT: blr ; CHECK-SAFE: @goo2 -; CHECK-SAFE: fdivs +; CHECK-SAFE: fdiv ; CHECK-SAFE: blr } define <4 x float> @hoo2(<4 x float> %a, <4 x float> %b) nounwind { - %r = fdiv <4 x float> %a, %b + %r = fdiv nexc nrnd <4 x float> %a, %b ret <4 x float> %r ; CHECK: @hoo2 @@ -228,10 +228,10 @@ ; CHECK: fcmpu ; CHECK-DAG: frsqrtes ; CHECK-DAG: fnmsubs -; CHECK: fmuls +; CHECK: fmul ; CHECK-NEXT: fmadds -; CHECK-NEXT: fmuls -; CHECK-NEXT: fmuls +; CHECK-NEXT: fmul +; CHECK-NEXT: fmul ; CHECK: blr ; CHECK-SAFE: @goo3 Index: test/CodeGen/PowerPC/s000-alias-misched.ll =================================================================== --- test/CodeGen/PowerPC/s000-alias-misched.ll +++ test/CodeGen/PowerPC/s000-alias-misched.ll @@ -38,7 +38,7 @@ %arrayidx6 = getelementptr inbounds [16000 x double], [16000 x double]* @X, i64 0, i64 %indvars.iv %0 = bitcast double* %arrayidx to <1 x double>* %1 = load <1 x double>, <1 x double>* %0, align 32 - %add = fadd <1 x double> %1, + %add = fadd nexc nrnd <1 x double> %1, %2 = bitcast double* %arrayidx6 to <1 x double>* store <1 x double> %add, <1 x double>* %2, align 32 %indvars.iv.next.322 = or i64 %indvars.iv, 4 @@ -46,7 +46,7 @@ %arrayidx6.4 = getelementptr inbounds [16000 x double], [16000 x double]* @X, i64 0, i64 %indvars.iv.next.322 %3 = bitcast double* %arrayidx.4 to <1 x double>* %4 = load <1 x double>, <1 x double>* %3, align 32 - %add.4 = fadd <1 x double> %4, + %add.4 = fadd nexc nrnd <1 x double> %4, %5 = bitcast double* %arrayidx6.4 to <1 x double>* store <1 x double> %add.4, <1 x double>* %5, align 32 %indvars.iv.next.726 = or i64 %indvars.iv, 8 @@ -54,7 +54,7 @@ %arrayidx6.8 = getelementptr inbounds [16000 x double], [16000 x double]* @X, i64 0, i64 %indvars.iv.next.726 %6 = bitcast double* %arrayidx.8 to <1 x double>* %7 = load <1 x double>, <1 x double>* %6, align 32 - %add.8 = fadd <1 x double> %7, + %add.8 = fadd nexc nrnd <1 x double> %7, %8 = bitcast double* %arrayidx6.8 to <1 x double>* store <1 x double> %add.8, <1 x double>* %8, align 32 %indvars.iv.next.1130 = or i64 %indvars.iv, 12 @@ -62,7 +62,7 @@ %arrayidx6.12 = getelementptr inbounds [16000 x double], [16000 x double]* @X, i64 0, i64 %indvars.iv.next.1130 %9 = bitcast double* %arrayidx.12 to <1 x double>* %10 = load <1 x double>, <1 x double>* %9, align 32 - %add.12 = fadd <1 x double> %10, + %add.12 = fadd nexc nrnd <1 x double> %10, %11 = bitcast double* %arrayidx6.12 to <1 x double>* store <1 x double> %add.12, <1 x double>* %11, align 32 %indvars.iv.next.15 = add i64 %indvars.iv, 16 @@ -86,7 +86,7 @@ %call11 = tail call i64 @clock() nounwind %sub = sub nsw i64 %call11, %call1 %conv = sitofp i64 %sub to double - %div = fdiv double %conv, 1.000000e+06 + %div = fdiv nexc nrnd double %conv, 1.000000e+06 %call12 = tail call signext i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str137, i64 0, i64 0), double %div) nounwind tail call void @check(i32 signext 1) ret i32 0 Index: test/CodeGen/PowerPC/unsafe-math.ll =================================================================== --- test/CodeGen/PowerPC/unsafe-math.ll +++ test/CodeGen/PowerPC/unsafe-math.ll @@ -3,8 +3,8 @@ ; RUN: grep fmul | count 1 define double @foo(double %X) nounwind { - %tmp1 = fmul double %X, 1.23 - %tmp2 = fmul double %tmp1, 4.124 + %tmp1 = fmul nexc nrnd double %X, 1.23 + %tmp2 = fmul nexc nrnd double %tmp1, 4.124 ret double %tmp2 } Index: test/CodeGen/SystemZ/fp-add-01.ll =================================================================== --- test/CodeGen/SystemZ/fp-add-01.ll +++ test/CodeGen/SystemZ/fp-add-01.ll @@ -9,7 +9,7 @@ ; CHECK-LABEL: f1: ; CHECK: aebr %f0, %f2 ; CHECK: br %r14 - %res = fadd float %f1, %f2 + %res = fadd nexc nrnd float %f1, %f2 ret float %res } @@ -19,7 +19,7 @@ ; CHECK: aeb %f0, 0(%r2) ; CHECK: br %r14 %f2 = load float , float *%ptr - %res = fadd float %f1, %f2 + %res = fadd nexc nrnd float %f1, %f2 ret float %res } @@ -30,7 +30,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 1023 %f2 = load float , float *%ptr - %res = fadd float %f1, %f2 + %res = fadd nexc nrnd float %f1, %f2 ret float %res } @@ -43,7 +43,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 1024 %f2 = load float , float *%ptr - %res = fadd float %f1, %f2 + %res = fadd nexc nrnd float %f1, %f2 ret float %res } @@ -55,7 +55,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 -1 %f2 = load float , float *%ptr - %res = fadd float %f1, %f2 + %res = fadd nexc nrnd float %f1, %f2 ret float %res } @@ -68,7 +68,7 @@ %ptr1 = getelementptr float, float *%base, i64 %index %ptr2 = getelementptr float, float *%ptr1, i64 100 %f2 = load float , float *%ptr2 - %res = fadd float %f1, %f2 + %res = fadd nexc nrnd float %f1, %f2 ret float %res } @@ -103,17 +103,17 @@ %ret = call float @foo() - %add0 = fadd float %ret, %val0 - %add1 = fadd float %add0, %val1 - %add2 = fadd float %add1, %val2 - %add3 = fadd float %add2, %val3 - %add4 = fadd float %add3, %val4 - %add5 = fadd float %add4, %val5 - %add6 = fadd float %add5, %val6 - %add7 = fadd float %add6, %val7 - %add8 = fadd float %add7, %val8 - %add9 = fadd float %add8, %val9 - %add10 = fadd float %add9, %val10 + %add0 = fadd nexc nrnd float %ret, %val0 + %add1 = fadd nexc nrnd float %add0, %val1 + %add2 = fadd nexc nrnd float %add1, %val2 + %add3 = fadd nexc nrnd float %add2, %val3 + %add4 = fadd nexc nrnd float %add3, %val4 + %add5 = fadd nexc nrnd float %add4, %val5 + %add6 = fadd nexc nrnd float %add5, %val6 + %add7 = fadd nexc nrnd float %add6, %val7 + %add8 = fadd nexc nrnd float %add7, %val8 + %add9 = fadd nexc nrnd float %add8, %val9 + %add10 = fadd nexc nrnd float %add9, %val10 ret float %add10 } Index: test/CodeGen/SystemZ/fp-add-02.ll =================================================================== --- test/CodeGen/SystemZ/fp-add-02.ll +++ test/CodeGen/SystemZ/fp-add-02.ll @@ -10,7 +10,7 @@ ; CHECK-LABEL: f1: ; CHECK: adbr %f0, %f2 ; CHECK: br %r14 - %res = fadd double %f1, %f2 + %res = fadd nexc nrnd double %f1, %f2 ret double %res } @@ -20,7 +20,7 @@ ; CHECK: adb %f0, 0(%r2) ; CHECK: br %r14 %f2 = load double , double *%ptr - %res = fadd double %f1, %f2 + %res = fadd nexc nrnd double %f1, %f2 ret double %res } @@ -31,7 +31,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 511 %f2 = load double , double *%ptr - %res = fadd double %f1, %f2 + %res = fadd nexc nrnd double %f1, %f2 ret double %res } @@ -44,7 +44,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 512 %f2 = load double , double *%ptr - %res = fadd double %f1, %f2 + %res = fadd nexc nrnd double %f1, %f2 ret double %res } @@ -56,7 +56,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 -1 %f2 = load double , double *%ptr - %res = fadd double %f1, %f2 + %res = fadd nexc nrnd double %f1, %f2 ret double %res } @@ -69,7 +69,7 @@ %ptr1 = getelementptr double, double *%base, i64 %index %ptr2 = getelementptr double, double *%ptr1, i64 100 %f2 = load double , double *%ptr2 - %res = fadd double %f1, %f2 + %res = fadd nexc nrnd double %f1, %f2 ret double %res } @@ -104,17 +104,17 @@ %ret = call double @foo() - %add0 = fadd double %ret, %val0 - %add1 = fadd double %add0, %val1 - %add2 = fadd double %add1, %val2 - %add3 = fadd double %add2, %val3 - %add4 = fadd double %add3, %val4 - %add5 = fadd double %add4, %val5 - %add6 = fadd double %add5, %val6 - %add7 = fadd double %add6, %val7 - %add8 = fadd double %add7, %val8 - %add9 = fadd double %add8, %val9 - %add10 = fadd double %add9, %val10 + %add0 = fadd nexc nrnd double %ret, %val0 + %add1 = fadd nexc nrnd double %add0, %val1 + %add2 = fadd nexc nrnd double %add1, %val2 + %add3 = fadd nexc nrnd double %add2, %val3 + %add4 = fadd nexc nrnd double %add3, %val4 + %add5 = fadd nexc nrnd double %add4, %val5 + %add6 = fadd nexc nrnd double %add5, %val6 + %add7 = fadd nexc nrnd double %add6, %val7 + %add8 = fadd nexc nrnd double %add7, %val8 + %add9 = fadd nexc nrnd double %add8, %val9 + %add10 = fadd nexc nrnd double %add9, %val10 ret double %add10 } Index: test/CodeGen/SystemZ/fp-add-03.ll =================================================================== --- test/CodeGen/SystemZ/fp-add-03.ll +++ test/CodeGen/SystemZ/fp-add-03.ll @@ -14,7 +14,7 @@ ; CHECK: br %r14 %f1 = load fp128 , fp128 *%ptr %f2x = fpext float %f2 to fp128 - %sum = fadd fp128 %f1, %f2x + %sum = fadd nexc nrnd fp128 %f1, %f2x store fp128 %sum, fp128 *%ptr ret void } Index: test/CodeGen/SystemZ/fp-cmp-04.ll =================================================================== --- test/CodeGen/SystemZ/fp-cmp-04.ll +++ test/CodeGen/SystemZ/fp-cmp-04.ll @@ -12,7 +12,7 @@ ; CHECK-NEXT: je .L{{.*}} ; CHECK: br %r14 entry: - %res = fadd float %a, %b + %res = fadd nexc nrnd float %a, %b %cmp = fcmp oeq float %res, 0.0 br i1 %cmp, label %exit, label %store @@ -31,7 +31,7 @@ ; CHECK-NEXT: jl .L{{.*}} ; CHECK: br %r14 entry: - %res = fadd float %a, %b + %res = fadd nexc nrnd float %a, %b %cmp = fcmp olt float %res, 0.0 br i1 %cmp, label %exit, label %store @@ -50,7 +50,7 @@ ; CHECK-NEXT: jh .L{{.*}} ; CHECK: br %r14 entry: - %res = fadd float %a, %b + %res = fadd nexc nrnd float %a, %b %cmp = fcmp ogt float %res, 0.0 br i1 %cmp, label %exit, label %store @@ -69,7 +69,7 @@ ; CHECK-NEXT: jnlh .L{{.*}} ; CHECK: br %r14 entry: - %res = fadd float %a, %b + %res = fadd nexc nrnd float %a, %b %cmp = fcmp ueq float %res, 0.0 br i1 %cmp, label %exit, label %store @@ -89,7 +89,7 @@ ; CHECK: br %r14 entry: %cur = load float , float *%dest - %res = fsub float %a, %cur + %res = fsub nexc nrnd float %a, %cur %cmp = fcmp ult float %res, 0.0 br i1 %cmp, label %exit, label %store @@ -128,7 +128,7 @@ ; CHECK: br %r14 entry: %abs = call float @llvm.fabs.f32(float %a) - %res = fsub float -0.0, %abs + %res = fsub nexc nrnd float -0.0, %abs %cmp = fcmp olt float %res, 0.0 br i1 %cmp, label %exit, label %store @@ -147,7 +147,7 @@ ; CHECK-NEXT: jle .L{{.*}} ; CHECK: br %r14 entry: - %res = fsub float -0.0, %a + %res = fsub nexc nrnd float -0.0, %a %cmp = fcmp ole float %res, 0.0 br i1 %cmp, label %exit, label %store @@ -167,7 +167,7 @@ ; CHECK-NEXT: jlh .L{{.*}} ; CHECK: br %r14 entry: - %res = fmul float %a, %b + %res = fmul nexc nrnd float %a, %b %cmp = fcmp one float %res, 0.0 br i1 %cmp, label %exit, label %store @@ -189,8 +189,8 @@ ; CHECK-NEXT: jne .L{{.*}} ; CHECK: br %r14 entry: - %add = fadd float %a, %b - %res = fdiv float %add, %c + %add = fadd nexc nrnd float %a, %b + %res = fdiv nexc nrnd float %add, %c %cmp = fcmp une float %res, 0.0 br i1 %cmp, label %exit, label %store @@ -213,8 +213,8 @@ ; CHECK-NEXT: je .L{{.*}} ; CHECK: br %r14 entry: - %add = fadd float %a, %b - %sub = fsub float %c, %add + %add = fadd nexc nrnd float %a, %b + %sub = fsub nexc nrnd float %c, %add store float %sub, float *%dest1 %cmp = fcmp oeq float %add, 0.0 br i1 %cmp, label %exit, label %store @@ -286,9 +286,9 @@ entry: %val1 = load fp128 , fp128 *%ptr1 %val2 = load fp128 , fp128 *%ptr2 - %div = fdiv fp128 %val1, %val2 + %div = fdiv nexc nrnd fp128 %val1, %val2 store fp128 %div, fp128 *%ptr1 - %mul = fmul fp128 %val1, %val2 + %mul = fmul nexc nrnd fp128 %val1, %val2 store fp128 %mul, fp128 *%ptr2 %cmp = fcmp olt fp128 %val1, 0xL00000000000000000000000000000000 br i1 %cmp, label %exit, label %store @@ -354,7 +354,7 @@ ; CHECK-NEXT: jl .L{{.*}} ; CHECK: br %r14 entry: - %res = fadd float %a, %b + %res = fadd nexc nrnd float %a, %b %cmp = fcmp olt float %res, -0.0 br i1 %cmp, label %exit, label %store @@ -375,7 +375,7 @@ ; CHECK: br %r14 entry: %abs = call float @llvm.fabs.f32(float %a) - %res = fsub float -0.0, %abs + %res = fsub nexc nrnd float -0.0, %abs %cmp = fcmp ogt float %abs, 0.0 br i1 %cmp, label %exit, label %store @@ -394,7 +394,7 @@ ; CHECK-NEXT: jle .L{{.*}} ; CHECK: br %r14 entry: - %res = fsub float -0.0, %a + %res = fsub nexc nrnd float -0.0, %a %cmp = fcmp oge float %a, 0.0 br i1 %cmp, label %exit, label %store Index: test/CodeGen/SystemZ/fp-div-01.ll =================================================================== --- test/CodeGen/SystemZ/fp-div-01.ll +++ test/CodeGen/SystemZ/fp-div-01.ll @@ -9,7 +9,7 @@ ; CHECK-LABEL: f1: ; CHECK: debr %f0, %f2 ; CHECK: br %r14 - %res = fdiv float %f1, %f2 + %res = fdiv nexc nrnd float %f1, %f2 ret float %res } @@ -19,7 +19,7 @@ ; CHECK: deb %f0, 0(%r2) ; CHECK: br %r14 %f2 = load float , float *%ptr - %res = fdiv float %f1, %f2 + %res = fdiv nexc nrnd float %f1, %f2 ret float %res } @@ -30,7 +30,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 1023 %f2 = load float , float *%ptr - %res = fdiv float %f1, %f2 + %res = fdiv nexc nrnd float %f1, %f2 ret float %res } @@ -43,7 +43,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 1024 %f2 = load float , float *%ptr - %res = fdiv float %f1, %f2 + %res = fdiv nexc nrnd float %f1, %f2 ret float %res } @@ -55,7 +55,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 -1 %f2 = load float , float *%ptr - %res = fdiv float %f1, %f2 + %res = fdiv nexc nrnd float %f1, %f2 ret float %res } @@ -68,7 +68,7 @@ %ptr1 = getelementptr float, float *%base, i64 %index %ptr2 = getelementptr float, float *%ptr1, i64 100 %f2 = load float , float *%ptr2 - %res = fdiv float %f1, %f2 + %res = fdiv nexc nrnd float %f1, %f2 ret float %res } @@ -103,17 +103,17 @@ %ret = call float @foo() - %div0 = fdiv float %ret, %val0 - %div1 = fdiv float %div0, %val1 - %div2 = fdiv float %div1, %val2 - %div3 = fdiv float %div2, %val3 - %div4 = fdiv float %div3, %val4 - %div5 = fdiv float %div4, %val5 - %div6 = fdiv float %div5, %val6 - %div7 = fdiv float %div6, %val7 - %div8 = fdiv float %div7, %val8 - %div9 = fdiv float %div8, %val9 - %div10 = fdiv float %div9, %val10 + %div0 = fdiv nexc nrnd float %ret, %val0 + %div1 = fdiv nexc nrnd float %div0, %val1 + %div2 = fdiv nexc nrnd float %div1, %val2 + %div3 = fdiv nexc nrnd float %div2, %val3 + %div4 = fdiv nexc nrnd float %div3, %val4 + %div5 = fdiv nexc nrnd float %div4, %val5 + %div6 = fdiv nexc nrnd float %div5, %val6 + %div7 = fdiv nexc nrnd float %div6, %val7 + %div8 = fdiv nexc nrnd float %div7, %val8 + %div9 = fdiv nexc nrnd float %div8, %val9 + %div10 = fdiv nexc nrnd float %div9, %val10 ret float %div10 } Index: test/CodeGen/SystemZ/fp-div-02.ll =================================================================== --- test/CodeGen/SystemZ/fp-div-02.ll +++ test/CodeGen/SystemZ/fp-div-02.ll @@ -11,7 +11,7 @@ ; CHECK-LABEL: f1: ; CHECK: ddbr %f0, %f2 ; CHECK: br %r14 - %res = fdiv double %f1, %f2 + %res = fdiv nexc nrnd double %f1, %f2 ret double %res } @@ -21,7 +21,7 @@ ; CHECK: ddb %f0, 0(%r2) ; CHECK: br %r14 %f2 = load double , double *%ptr - %res = fdiv double %f1, %f2 + %res = fdiv nexc nrnd double %f1, %f2 ret double %res } @@ -32,7 +32,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 511 %f2 = load double , double *%ptr - %res = fdiv double %f1, %f2 + %res = fdiv nexc nrnd double %f1, %f2 ret double %res } @@ -45,7 +45,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 512 %f2 = load double , double *%ptr - %res = fdiv double %f1, %f2 + %res = fdiv nexc nrnd double %f1, %f2 ret double %res } @@ -57,7 +57,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 -1 %f2 = load double , double *%ptr - %res = fdiv double %f1, %f2 + %res = fdiv nexc nrnd double %f1, %f2 ret double %res } @@ -70,7 +70,7 @@ %ptr1 = getelementptr double, double *%base, i64 %index %ptr2 = getelementptr double, double *%ptr1, i64 100 %f2 = load double , double *%ptr2 - %res = fdiv double %f1, %f2 + %res = fdiv nexc nrnd double %f1, %f2 ret double %res } @@ -105,17 +105,17 @@ %ret = call double @foo() - %div0 = fdiv double %ret, %val0 - %div1 = fdiv double %div0, %val1 - %div2 = fdiv double %div1, %val2 - %div3 = fdiv double %div2, %val3 - %div4 = fdiv double %div3, %val4 - %div5 = fdiv double %div4, %val5 - %div6 = fdiv double %div5, %val6 - %div7 = fdiv double %div6, %val7 - %div8 = fdiv double %div7, %val8 - %div9 = fdiv double %div8, %val9 - %div10 = fdiv double %div9, %val10 + %div0 = fdiv nexc nrnd double %ret, %val0 + %div1 = fdiv nexc nrnd double %div0, %val1 + %div2 = fdiv nexc nrnd double %div1, %val2 + %div3 = fdiv nexc nrnd double %div2, %val3 + %div4 = fdiv nexc nrnd double %div3, %val4 + %div5 = fdiv nexc nrnd double %div4, %val5 + %div6 = fdiv nexc nrnd double %div5, %val6 + %div7 = fdiv nexc nrnd double %div6, %val7 + %div8 = fdiv nexc nrnd double %div7, %val8 + %div9 = fdiv nexc nrnd double %div8, %val9 + %div10 = fdiv nexc nrnd double %div9, %val10 ret double %div10 } Index: test/CodeGen/SystemZ/fp-div-03.ll =================================================================== --- test/CodeGen/SystemZ/fp-div-03.ll +++ test/CodeGen/SystemZ/fp-div-03.ll @@ -14,7 +14,7 @@ ; CHECK: br %r14 %f1 = load fp128 , fp128 *%ptr %f2x = fpext float %f2 to fp128 - %sum = fdiv fp128 %f1, %f2x + %sum = fdiv nexc nrnd fp128 %f1, %f2x store fp128 %sum, fp128 *%ptr ret void } Index: test/CodeGen/SystemZ/fp-mul-01.ll =================================================================== --- test/CodeGen/SystemZ/fp-mul-01.ll +++ test/CodeGen/SystemZ/fp-mul-01.ll @@ -9,7 +9,7 @@ ; CHECK-LABEL: f1: ; CHECK: meebr %f0, %f2 ; CHECK: br %r14 - %res = fmul float %f1, %f2 + %res = fmul nexc nrnd float %f1, %f2 ret float %res } @@ -19,7 +19,7 @@ ; CHECK: meeb %f0, 0(%r2) ; CHECK: br %r14 %f2 = load float , float *%ptr - %res = fmul float %f1, %f2 + %res = fmul nexc nrnd float %f1, %f2 ret float %res } @@ -30,7 +30,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 1023 %f2 = load float , float *%ptr - %res = fmul float %f1, %f2 + %res = fmul nexc nrnd float %f1, %f2 ret float %res } @@ -43,7 +43,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 1024 %f2 = load float , float *%ptr - %res = fmul float %f1, %f2 + %res = fmul nexc nrnd float %f1, %f2 ret float %res } @@ -55,7 +55,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 -1 %f2 = load float , float *%ptr - %res = fmul float %f1, %f2 + %res = fmul nexc nrnd float %f1, %f2 ret float %res } @@ -68,7 +68,7 @@ %ptr1 = getelementptr float, float *%base, i64 %index %ptr2 = getelementptr float, float *%ptr1, i64 100 %f2 = load float , float *%ptr2 - %res = fmul float %f1, %f2 + %res = fmul nexc nrnd float %f1, %f2 ret float %res } @@ -103,17 +103,17 @@ %ret = call float @foo() - %mul0 = fmul float %ret, %val0 - %mul1 = fmul float %mul0, %val1 - %mul2 = fmul float %mul1, %val2 - %mul3 = fmul float %mul2, %val3 - %mul4 = fmul float %mul3, %val4 - %mul5 = fmul float %mul4, %val5 - %mul6 = fmul float %mul5, %val6 - %mul7 = fmul float %mul6, %val7 - %mul8 = fmul float %mul7, %val8 - %mul9 = fmul float %mul8, %val9 - %mul10 = fmul float %mul9, %val10 + %mul0 = fmul nexc nrnd float %ret, %val0 + %mul1 = fmul nexc nrnd float %mul0, %val1 + %mul2 = fmul nexc nrnd float %mul1, %val2 + %mul3 = fmul nexc nrnd float %mul2, %val3 + %mul4 = fmul nexc nrnd float %mul3, %val4 + %mul5 = fmul nexc nrnd float %mul4, %val5 + %mul6 = fmul nexc nrnd float %mul5, %val6 + %mul7 = fmul nexc nrnd float %mul6, %val7 + %mul8 = fmul nexc nrnd float %mul7, %val8 + %mul9 = fmul nexc nrnd float %mul8, %val9 + %mul10 = fmul nexc nrnd float %mul9, %val10 ret float %mul10 } Index: test/CodeGen/SystemZ/fp-mul-02.ll =================================================================== --- test/CodeGen/SystemZ/fp-mul-02.ll +++ test/CodeGen/SystemZ/fp-mul-02.ll @@ -11,7 +11,7 @@ ; CHECK: br %r14 %f1x = fpext float %f1 to double %f2x = fpext float %f2 to double - %res = fmul double %f1x, %f2x + %res = fmul nexc nrnd double %f1x, %f2x ret double %res } @@ -23,7 +23,7 @@ %f2 = load float , float *%ptr %f1x = fpext float %f1 to double %f2x = fpext float %f2 to double - %res = fmul double %f1x, %f2x + %res = fmul nexc nrnd double %f1x, %f2x ret double %res } @@ -36,7 +36,7 @@ %f2 = load float , float *%ptr %f1x = fpext float %f1 to double %f2x = fpext float %f2 to double - %res = fmul double %f1x, %f2x + %res = fmul nexc nrnd double %f1x, %f2x ret double %res } @@ -51,7 +51,7 @@ %f2 = load float , float *%ptr %f1x = fpext float %f1 to double %f2x = fpext float %f2 to double - %res = fmul double %f1x, %f2x + %res = fmul nexc nrnd double %f1x, %f2x ret double %res } @@ -65,7 +65,7 @@ %f2 = load float , float *%ptr %f1x = fpext float %f1 to double %f2x = fpext float %f2 to double - %res = fmul double %f1x, %f2x + %res = fmul nexc nrnd double %f1x, %f2x ret double %res } @@ -80,7 +80,7 @@ %f2 = load float , float *%ptr2 %f1x = fpext float %f1 to double %f2x = fpext float %f2 to double - %res = fmul double %f1x, %f2x + %res = fmul nexc nrnd double %f1x, %f2x ret double %res } @@ -113,17 +113,17 @@ %val9 = load float , float *%ptr9 %val10 = load float , float *%ptr10 - %frob0 = fadd float %val0, %val0 - %frob1 = fadd float %val1, %val1 - %frob2 = fadd float %val2, %val2 - %frob3 = fadd float %val3, %val3 - %frob4 = fadd float %val4, %val4 - %frob5 = fadd float %val5, %val5 - %frob6 = fadd float %val6, %val6 - %frob7 = fadd float %val7, %val7 - %frob8 = fadd float %val8, %val8 - %frob9 = fadd float %val9, %val9 - %frob10 = fadd float %val9, %val10 + %frob0 = fadd nexc nrnd float %val0, %val0 + %frob1 = fadd nexc nrnd float %val1, %val1 + %frob2 = fadd nexc nrnd float %val2, %val2 + %frob3 = fadd nexc nrnd float %val3, %val3 + %frob4 = fadd nexc nrnd float %val4, %val4 + %frob5 = fadd nexc nrnd float %val5, %val5 + %frob6 = fadd nexc nrnd float %val6, %val6 + %frob7 = fadd nexc nrnd float %val7, %val7 + %frob8 = fadd nexc nrnd float %val8, %val8 + %frob9 = fadd nexc nrnd float %val9, %val9 + %frob10 = fadd nexc nrnd float %val9, %val10 store float %frob0, float *%ptr0 store float %frob1, float *%ptr1 @@ -141,62 +141,62 @@ %accext0 = fpext float %ret to double %ext0 = fpext float %frob0 to double - %mul0 = fmul double %accext0, %ext0 - %extra0 = fmul double %mul0, 1.01 + %mul0 = fmul nexc nrnd double %accext0, %ext0 + %extra0 = fmul nexc nrnd double %mul0, 1.01 %trunc0 = fptrunc double %extra0 to float %accext1 = fpext float %trunc0 to double %ext1 = fpext float %frob1 to double - %mul1 = fmul double %accext1, %ext1 - %extra1 = fmul double %mul1, 1.11 + %mul1 = fmul nexc nrnd double %accext1, %ext1 + %extra1 = fmul nexc nrnd double %mul1, 1.11 %trunc1 = fptrunc double %extra1 to float %accext2 = fpext float %trunc1 to double %ext2 = fpext float %frob2 to double - %mul2 = fmul double %accext2, %ext2 - %extra2 = fmul double %mul2, 1.21 + %mul2 = fmul nexc nrnd double %accext2, %ext2 + %extra2 = fmul nexc nrnd double %mul2, 1.21 %trunc2 = fptrunc double %extra2 to float %accext3 = fpext float %trunc2 to double %ext3 = fpext float %frob3 to double - %mul3 = fmul double %accext3, %ext3 - %extra3 = fmul double %mul3, 1.31 + %mul3 = fmul nexc nrnd double %accext3, %ext3 + %extra3 = fmul nexc nrnd double %mul3, 1.31 %trunc3 = fptrunc double %extra3 to float %accext4 = fpext float %trunc3 to double %ext4 = fpext float %frob4 to double - %mul4 = fmul double %accext4, %ext4 - %extra4 = fmul double %mul4, 1.41 + %mul4 = fmul nexc nrnd double %accext4, %ext4 + %extra4 = fmul nexc nrnd double %mul4, 1.41 %trunc4 = fptrunc double %extra4 to float %accext5 = fpext float %trunc4 to double %ext5 = fpext float %frob5 to double - %mul5 = fmul double %accext5, %ext5 - %extra5 = fmul double %mul5, 1.51 + %mul5 = fmul nexc nrnd double %accext5, %ext5 + %extra5 = fmul nexc nrnd double %mul5, 1.51 %trunc5 = fptrunc double %extra5 to float %accext6 = fpext float %trunc5 to double %ext6 = fpext float %frob6 to double - %mul6 = fmul double %accext6, %ext6 - %extra6 = fmul double %mul6, 1.61 + %mul6 = fmul nexc nrnd double %accext6, %ext6 + %extra6 = fmul nexc nrnd double %mul6, 1.61 %trunc6 = fptrunc double %extra6 to float %accext7 = fpext float %trunc6 to double %ext7 = fpext float %frob7 to double - %mul7 = fmul double %accext7, %ext7 - %extra7 = fmul double %mul7, 1.71 + %mul7 = fmul nexc nrnd double %accext7, %ext7 + %extra7 = fmul nexc nrnd double %mul7, 1.71 %trunc7 = fptrunc double %extra7 to float %accext8 = fpext float %trunc7 to double %ext8 = fpext float %frob8 to double - %mul8 = fmul double %accext8, %ext8 - %extra8 = fmul double %mul8, 1.81 + %mul8 = fmul nexc nrnd double %accext8, %ext8 + %extra8 = fmul nexc nrnd double %mul8, 1.81 %trunc8 = fptrunc double %extra8 to float %accext9 = fpext float %trunc8 to double %ext9 = fpext float %frob9 to double - %mul9 = fmul double %accext9, %ext9 - %extra9 = fmul double %mul9, 1.91 + %mul9 = fmul nexc nrnd double %accext9, %ext9 + %extra9 = fmul nexc nrnd double %mul9, 1.91 %trunc9 = fptrunc double %extra9 to float ret float %trunc9 Index: test/CodeGen/SystemZ/fp-mul-03.ll =================================================================== --- test/CodeGen/SystemZ/fp-mul-03.ll +++ test/CodeGen/SystemZ/fp-mul-03.ll @@ -11,7 +11,7 @@ ; CHECK-LABEL: f1: ; CHECK: mdbr %f0, %f2 ; CHECK: br %r14 - %res = fmul double %f1, %f2 + %res = fmul nexc nrnd double %f1, %f2 ret double %res } @@ -21,7 +21,7 @@ ; CHECK: mdb %f0, 0(%r2) ; CHECK: br %r14 %f2 = load double , double *%ptr - %res = fmul double %f1, %f2 + %res = fmul nexc nrnd double %f1, %f2 ret double %res } @@ -32,7 +32,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 511 %f2 = load double , double *%ptr - %res = fmul double %f1, %f2 + %res = fmul nexc nrnd double %f1, %f2 ret double %res } @@ -45,7 +45,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 512 %f2 = load double , double *%ptr - %res = fmul double %f1, %f2 + %res = fmul nexc nrnd double %f1, %f2 ret double %res } @@ -57,7 +57,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 -1 %f2 = load double , double *%ptr - %res = fmul double %f1, %f2 + %res = fmul nexc nrnd double %f1, %f2 ret double %res } @@ -70,7 +70,7 @@ %ptr1 = getelementptr double, double *%base, i64 %index %ptr2 = getelementptr double, double *%ptr1, i64 100 %f2 = load double , double *%ptr2 - %res = fmul double %f1, %f2 + %res = fmul nexc nrnd double %f1, %f2 ret double %res } @@ -105,17 +105,17 @@ %ret = call double @foo() - %mul0 = fmul double %ret, %val0 - %mul1 = fmul double %mul0, %val1 - %mul2 = fmul double %mul1, %val2 - %mul3 = fmul double %mul2, %val3 - %mul4 = fmul double %mul3, %val4 - %mul5 = fmul double %mul4, %val5 - %mul6 = fmul double %mul5, %val6 - %mul7 = fmul double %mul6, %val7 - %mul8 = fmul double %mul7, %val8 - %mul9 = fmul double %mul8, %val9 - %mul10 = fmul double %mul9, %val10 + %mul0 = fmul nexc nrnd double %ret, %val0 + %mul1 = fmul nexc nrnd double %mul0, %val1 + %mul2 = fmul nexc nrnd double %mul1, %val2 + %mul3 = fmul nexc nrnd double %mul2, %val3 + %mul4 = fmul nexc nrnd double %mul3, %val4 + %mul5 = fmul nexc nrnd double %mul4, %val5 + %mul6 = fmul nexc nrnd double %mul5, %val6 + %mul7 = fmul nexc nrnd double %mul6, %val7 + %mul8 = fmul nexc nrnd double %mul7, %val8 + %mul9 = fmul nexc nrnd double %mul8, %val9 + %mul10 = fmul nexc nrnd double %mul9, %val10 ret double %mul10 } Index: test/CodeGen/SystemZ/fp-mul-04.ll =================================================================== --- test/CodeGen/SystemZ/fp-mul-04.ll +++ test/CodeGen/SystemZ/fp-mul-04.ll @@ -15,7 +15,7 @@ ; CHECK: br %r14 %f1x = fpext double %f1 to fp128 %f2x = fpext double %f2 to fp128 - %res = fmul fp128 %f1x, %f2x + %res = fmul nexc nrnd fp128 %f1x, %f2x store fp128 %res, fp128 *%dst ret void } @@ -30,7 +30,7 @@ %f2 = load double , double *%ptr %f1x = fpext double %f1 to fp128 %f2x = fpext double %f2 to fp128 - %res = fmul fp128 %f1x, %f2x + %res = fmul nexc nrnd fp128 %f1x, %f2x store fp128 %res, fp128 *%dst ret void } @@ -46,7 +46,7 @@ %f2 = load double , double *%ptr %f1x = fpext double %f1 to fp128 %f2x = fpext double %f2 to fp128 - %res = fmul fp128 %f1x, %f2x + %res = fmul nexc nrnd fp128 %f1x, %f2x store fp128 %res, fp128 *%dst ret void } @@ -64,7 +64,7 @@ %f2 = load double , double *%ptr %f1x = fpext double %f1 to fp128 %f2x = fpext double %f2 to fp128 - %res = fmul fp128 %f1x, %f2x + %res = fmul nexc nrnd fp128 %f1x, %f2x store fp128 %res, fp128 *%dst ret void } @@ -81,7 +81,7 @@ %f2 = load double , double *%ptr %f1x = fpext double %f1 to fp128 %f2x = fpext double %f2 to fp128 - %res = fmul fp128 %f1x, %f2x + %res = fmul nexc nrnd fp128 %f1x, %f2x store fp128 %res, fp128 *%dst ret void } @@ -99,7 +99,7 @@ %f2 = load double , double *%ptr2 %f1x = fpext double %f1 to fp128 %f2x = fpext double %f2 to fp128 - %res = fmul fp128 %f1x, %f2x + %res = fmul nexc nrnd fp128 %f1x, %f2x store fp128 %res, fp128 *%dst ret void } @@ -133,17 +133,17 @@ %val9 = load double , double *%ptr9 %val10 = load double , double *%ptr10 - %frob0 = fadd double %val0, %val0 - %frob1 = fadd double %val1, %val1 - %frob2 = fadd double %val2, %val2 - %frob3 = fadd double %val3, %val3 - %frob4 = fadd double %val4, %val4 - %frob5 = fadd double %val5, %val5 - %frob6 = fadd double %val6, %val6 - %frob7 = fadd double %val7, %val7 - %frob8 = fadd double %val8, %val8 - %frob9 = fadd double %val9, %val9 - %frob10 = fadd double %val9, %val10 + %frob0 = fadd nexc nrnd double %val0, %val0 + %frob1 = fadd nexc nrnd double %val1, %val1 + %frob2 = fadd nexc nrnd double %val2, %val2 + %frob3 = fadd nexc nrnd double %val3, %val3 + %frob4 = fadd nexc nrnd double %val4, %val4 + %frob5 = fadd nexc nrnd double %val5, %val5 + %frob6 = fadd nexc nrnd double %val6, %val6 + %frob7 = fadd nexc nrnd double %val7, %val7 + %frob8 = fadd nexc nrnd double %val8, %val8 + %frob9 = fadd nexc nrnd double %val9, %val9 + %frob10 = fadd nexc nrnd double %val9, %val10 store double %frob0, double *%ptr0 store double %frob1, double *%ptr1 @@ -161,72 +161,72 @@ %accext0 = fpext double %ret to fp128 %ext0 = fpext double %frob0 to fp128 - %mul0 = fmul fp128 %accext0, %ext0 + %mul0 = fmul nexc nrnd fp128 %accext0, %ext0 %const0 = fpext double 1.01 to fp128 - %extra0 = fmul fp128 %mul0, %const0 + %extra0 = fmul nexc nrnd fp128 %mul0, %const0 %trunc0 = fptrunc fp128 %extra0 to double %accext1 = fpext double %trunc0 to fp128 %ext1 = fpext double %frob1 to fp128 - %mul1 = fmul fp128 %accext1, %ext1 + %mul1 = fmul nexc nrnd fp128 %accext1, %ext1 %const1 = fpext double 1.11 to fp128 - %extra1 = fmul fp128 %mul1, %const1 + %extra1 = fmul nexc nrnd fp128 %mul1, %const1 %trunc1 = fptrunc fp128 %extra1 to double %accext2 = fpext double %trunc1 to fp128 %ext2 = fpext double %frob2 to fp128 - %mul2 = fmul fp128 %accext2, %ext2 + %mul2 = fmul nexc nrnd fp128 %accext2, %ext2 %const2 = fpext double 1.21 to fp128 - %extra2 = fmul fp128 %mul2, %const2 + %extra2 = fmul nexc nrnd fp128 %mul2, %const2 %trunc2 = fptrunc fp128 %extra2 to double %accext3 = fpext double %trunc2 to fp128 %ext3 = fpext double %frob3 to fp128 - %mul3 = fmul fp128 %accext3, %ext3 + %mul3 = fmul nexc nrnd fp128 %accext3, %ext3 %const3 = fpext double 1.31 to fp128 - %extra3 = fmul fp128 %mul3, %const3 + %extra3 = fmul nexc nrnd fp128 %mul3, %const3 %trunc3 = fptrunc fp128 %extra3 to double %accext4 = fpext double %trunc3 to fp128 %ext4 = fpext double %frob4 to fp128 - %mul4 = fmul fp128 %accext4, %ext4 + %mul4 = fmul nexc nrnd fp128 %accext4, %ext4 %const4 = fpext double 1.41 to fp128 - %extra4 = fmul fp128 %mul4, %const4 + %extra4 = fmul nexc nrnd fp128 %mul4, %const4 %trunc4 = fptrunc fp128 %extra4 to double %accext5 = fpext double %trunc4 to fp128 %ext5 = fpext double %frob5 to fp128 - %mul5 = fmul fp128 %accext5, %ext5 + %mul5 = fmul nexc nrnd fp128 %accext5, %ext5 %const5 = fpext double 1.51 to fp128 - %extra5 = fmul fp128 %mul5, %const5 + %extra5 = fmul nexc nrnd fp128 %mul5, %const5 %trunc5 = fptrunc fp128 %extra5 to double %accext6 = fpext double %trunc5 to fp128 %ext6 = fpext double %frob6 to fp128 - %mul6 = fmul fp128 %accext6, %ext6 + %mul6 = fmul nexc nrnd fp128 %accext6, %ext6 %const6 = fpext double 1.61 to fp128 - %extra6 = fmul fp128 %mul6, %const6 + %extra6 = fmul nexc nrnd fp128 %mul6, %const6 %trunc6 = fptrunc fp128 %extra6 to double %accext7 = fpext double %trunc6 to fp128 %ext7 = fpext double %frob7 to fp128 - %mul7 = fmul fp128 %accext7, %ext7 + %mul7 = fmul nexc nrnd fp128 %accext7, %ext7 %const7 = fpext double 1.71 to fp128 - %extra7 = fmul fp128 %mul7, %const7 + %extra7 = fmul nexc nrnd fp128 %mul7, %const7 %trunc7 = fptrunc fp128 %extra7 to double %accext8 = fpext double %trunc7 to fp128 %ext8 = fpext double %frob8 to fp128 - %mul8 = fmul fp128 %accext8, %ext8 + %mul8 = fmul nexc nrnd fp128 %accext8, %ext8 %const8 = fpext double 1.81 to fp128 - %extra8 = fmul fp128 %mul8, %const8 + %extra8 = fmul nexc nrnd fp128 %mul8, %const8 %trunc8 = fptrunc fp128 %extra8 to double %accext9 = fpext double %trunc8 to fp128 %ext9 = fpext double %frob9 to fp128 - %mul9 = fmul fp128 %accext9, %ext9 + %mul9 = fmul nexc nrnd fp128 %accext9, %ext9 %const9 = fpext double 1.91 to fp128 - %extra9 = fmul fp128 %mul9, %const9 + %extra9 = fmul nexc nrnd fp128 %mul9, %const9 %trunc9 = fptrunc fp128 %extra9 to double ret double %trunc9 Index: test/CodeGen/SystemZ/fp-mul-05.ll =================================================================== --- test/CodeGen/SystemZ/fp-mul-05.ll +++ test/CodeGen/SystemZ/fp-mul-05.ll @@ -14,7 +14,7 @@ ; CHECK: br %r14 %f1 = load fp128 , fp128 *%ptr %f2x = fpext float %f2 to fp128 - %diff = fmul fp128 %f1, %f2x + %diff = fmul nexc nrnd fp128 %f1, %f2x store fp128 %diff, fp128 *%ptr ret void } Index: test/CodeGen/SystemZ/fp-sincos-01.ll =================================================================== --- test/CodeGen/SystemZ/fp-sincos-01.ll +++ test/CodeGen/SystemZ/fp-sincos-01.ll @@ -14,7 +14,7 @@ ; CHECK-NOOPT: brasl %r14, cosf@PLT %tmp1 = call float @sinf(float %x) %tmp2 = call float @cosf(float %x) - %add = fadd float %tmp1, %tmp2 + %add = fadd nexc nrnd float %tmp1, %tmp2 ret float %add } @@ -29,7 +29,7 @@ ; CHECK-NOOPT: brasl %r14, cos@PLT %tmp1 = call double @sin(double %x) %tmp2 = call double @cos(double %x) - %add = fadd double %tmp1, %tmp2 + %add = fadd nexc nrnd double %tmp1, %tmp2 ret double %add } @@ -43,7 +43,7 @@ ; CHECK-NOOPT: brasl %r14, cosl@PLT %tmp1 = call fp128 @sinl(fp128 %x) %tmp2 = call fp128 @cosl(fp128 %x) - %add = fadd fp128 %tmp1, %tmp2 + %add = fadd nexc nrnd fp128 %tmp1, %tmp2 ret fp128 %add } Index: test/CodeGen/SystemZ/fp-sub-01.ll =================================================================== --- test/CodeGen/SystemZ/fp-sub-01.ll +++ test/CodeGen/SystemZ/fp-sub-01.ll @@ -9,7 +9,7 @@ ; CHECK-LABEL: f1: ; CHECK: sebr %f0, %f2 ; CHECK: br %r14 - %res = fsub float %f1, %f2 + %res = fsub nexc nrnd float %f1, %f2 ret float %res } @@ -19,7 +19,7 @@ ; CHECK: seb %f0, 0(%r2) ; CHECK: br %r14 %f2 = load float , float *%ptr - %res = fsub float %f1, %f2 + %res = fsub nexc nrnd float %f1, %f2 ret float %res } @@ -30,7 +30,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 1023 %f2 = load float , float *%ptr - %res = fsub float %f1, %f2 + %res = fsub nexc nrnd float %f1, %f2 ret float %res } @@ -43,7 +43,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 1024 %f2 = load float , float *%ptr - %res = fsub float %f1, %f2 + %res = fsub nexc nrnd float %f1, %f2 ret float %res } @@ -55,7 +55,7 @@ ; CHECK: br %r14 %ptr = getelementptr float, float *%base, i64 -1 %f2 = load float , float *%ptr - %res = fsub float %f1, %f2 + %res = fsub nexc nrnd float %f1, %f2 ret float %res } @@ -68,7 +68,7 @@ %ptr1 = getelementptr float, float *%base, i64 %index %ptr2 = getelementptr float, float *%ptr1, i64 100 %f2 = load float , float *%ptr2 - %res = fsub float %f1, %f2 + %res = fsub nexc nrnd float %f1, %f2 ret float %res } @@ -103,17 +103,17 @@ %ret = call float @foo() - %sub0 = fsub float %ret, %val0 - %sub1 = fsub float %sub0, %val1 - %sub2 = fsub float %sub1, %val2 - %sub3 = fsub float %sub2, %val3 - %sub4 = fsub float %sub3, %val4 - %sub5 = fsub float %sub4, %val5 - %sub6 = fsub float %sub5, %val6 - %sub7 = fsub float %sub6, %val7 - %sub8 = fsub float %sub7, %val8 - %sub9 = fsub float %sub8, %val9 - %sub10 = fsub float %sub9, %val10 + %sub0 = fsub nexc nrnd float %ret, %val0 + %sub1 = fsub nexc nrnd float %sub0, %val1 + %sub2 = fsub nexc nrnd float %sub1, %val2 + %sub3 = fsub nexc nrnd float %sub2, %val3 + %sub4 = fsub nexc nrnd float %sub3, %val4 + %sub5 = fsub nexc nrnd float %sub4, %val5 + %sub6 = fsub nexc nrnd float %sub5, %val6 + %sub7 = fsub nexc nrnd float %sub6, %val7 + %sub8 = fsub nexc nrnd float %sub7, %val8 + %sub9 = fsub nexc nrnd float %sub8, %val9 + %sub10 = fsub nexc nrnd float %sub9, %val10 ret float %sub10 } Index: test/CodeGen/SystemZ/fp-sub-02.ll =================================================================== --- test/CodeGen/SystemZ/fp-sub-02.ll +++ test/CodeGen/SystemZ/fp-sub-02.ll @@ -11,7 +11,7 @@ ; CHECK-LABEL: f1: ; CHECK: sdbr %f0, %f2 ; CHECK: br %r14 - %res = fsub double %f1, %f2 + %res = fsub nexc nrnd double %f1, %f2 ret double %res } @@ -21,7 +21,7 @@ ; CHECK: sdb %f0, 0(%r2) ; CHECK: br %r14 %f2 = load double , double *%ptr - %res = fsub double %f1, %f2 + %res = fsub nexc nrnd double %f1, %f2 ret double %res } @@ -32,7 +32,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 511 %f2 = load double , double *%ptr - %res = fsub double %f1, %f2 + %res = fsub nexc nrnd double %f1, %f2 ret double %res } @@ -45,7 +45,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 512 %f2 = load double , double *%ptr - %res = fsub double %f1, %f2 + %res = fsub nexc nrnd double %f1, %f2 ret double %res } @@ -57,7 +57,7 @@ ; CHECK: br %r14 %ptr = getelementptr double, double *%base, i64 -1 %f2 = load double , double *%ptr - %res = fsub double %f1, %f2 + %res = fsub nexc nrnd double %f1, %f2 ret double %res } @@ -70,7 +70,7 @@ %ptr1 = getelementptr double, double *%base, i64 %index %ptr2 = getelementptr double, double *%ptr1, i64 100 %f2 = load double , double *%ptr2 - %res = fsub double %f1, %f2 + %res = fsub nexc nrnd double %f1, %f2 ret double %res } @@ -105,17 +105,17 @@ %ret = call double @foo() - %sub0 = fsub double %ret, %val0 - %sub1 = fsub double %sub0, %val1 - %sub2 = fsub double %sub1, %val2 - %sub3 = fsub double %sub2, %val3 - %sub4 = fsub double %sub3, %val4 - %sub5 = fsub double %sub4, %val5 - %sub6 = fsub double %sub5, %val6 - %sub7 = fsub double %sub6, %val7 - %sub8 = fsub double %sub7, %val8 - %sub9 = fsub double %sub8, %val9 - %sub10 = fsub double %sub9, %val10 + %sub0 = fsub nexc nrnd double %ret, %val0 + %sub1 = fsub nexc nrnd double %sub0, %val1 + %sub2 = fsub nexc nrnd double %sub1, %val2 + %sub3 = fsub nexc nrnd double %sub2, %val3 + %sub4 = fsub nexc nrnd double %sub3, %val4 + %sub5 = fsub nexc nrnd double %sub4, %val5 + %sub6 = fsub nexc nrnd double %sub5, %val6 + %sub7 = fsub nexc nrnd double %sub6, %val7 + %sub8 = fsub nexc nrnd double %sub7, %val8 + %sub9 = fsub nexc nrnd double %sub8, %val9 + %sub10 = fsub nexc nrnd double %sub9, %val10 ret double %sub10 } Index: test/CodeGen/SystemZ/fp-sub-03.ll =================================================================== --- test/CodeGen/SystemZ/fp-sub-03.ll +++ test/CodeGen/SystemZ/fp-sub-03.ll @@ -14,7 +14,7 @@ ; CHECK: br %r14 %f1 = load fp128 , fp128 *%ptr %f2x = fpext float %f2 to fp128 - %sum = fsub fp128 %f1, %f2x + %sum = fsub nexc nrnd fp128 %f1, %f2x store fp128 %sum, fp128 *%ptr ret void } Index: test/CodeGen/Thumb2/2010-06-14-NEONCoalescer.ll =================================================================== --- test/CodeGen/Thumb2/2010-06-14-NEONCoalescer.ll +++ test/CodeGen/Thumb2/2010-06-14-NEONCoalescer.ll @@ -27,8 +27,8 @@ ; CHECK: LPC0_0: ; CHECK: vadd.f64 [[ADD:d.*]], [[LDR]], [[LDR]] ; CHECK-NOT: vmov.f64 [[ADD]] - %5 = fadd <2 x double> %3, %3 ; <<2 x double>> [#uses=2] - %6 = fadd <2 x double> %4, %4 ; <<2 x double>> [#uses=2] + %5 = fadd nexc nrnd <2 x double> %3, %3 ; <<2 x double>> [#uses=2] + %6 = fadd nexc nrnd <2 x double> %4, %4 ; <<2 x double>> [#uses=2] %tmp7 = extractelement <2 x double> %5, i32 0 ; [#uses=1] %tmp5 = extractelement <2 x double> %5, i32 1 ; [#uses=1] ; CHECK: printf Index: test/CodeGen/Thumb2/buildvector-crash.ll =================================================================== --- test/CodeGen/Thumb2/buildvector-crash.ll +++ test/CodeGen/Thumb2/buildvector-crash.ll @@ -6,10 +6,10 @@ br label %bb8 bb8: ; preds = %bb8, %bb.nph372 - %0 = fadd <4 x float> undef, - %1 = fmul <4 x float> %0, undef - %2 = fmul <4 x float> %1, undef - %3 = fadd <4 x float> undef, %2 + %0 = fadd nexc nrnd <4 x float> undef, + %1 = fmul nexc nrnd <4 x float> %0, undef + %2 = fmul nexc nrnd <4 x float> %1, undef + %3 = fadd nexc nrnd <4 x float> undef, %2 store <4 x float> %3, <4 x float>* undef, align 4 br label %bb8 ; CHECK-LABEL: RotateStarsFP_Vec: Index: test/CodeGen/Thumb2/float-ops.ll =================================================================== --- test/CodeGen/Thumb2/float-ops.ll +++ test/CodeGen/Thumb2/float-ops.ll @@ -8,7 +8,7 @@ ; CHECK-LABEL: add_f: ; NONE: bl __aeabi_fadd ; HARD: vadd.f32 s0, s0, s1 - %0 = fadd float %a, %b + %0 = fadd nexc nrnd float %a, %b ret float %0 } @@ -18,7 +18,7 @@ ; NONE: bl __aeabi_dadd ; SP: bl __aeabi_dadd ; DP: vadd.f64 d0, d0, d1 - %0 = fadd double %a, %b + %0 = fadd nexc nrnd double %a, %b ret double %0 } @@ -27,7 +27,7 @@ ; CHECK-LABEL: sub_f: ; NONE: bl __aeabi_fsub ; HARD: vsub.f32 s - %0 = fsub float %a, %b + %0 = fsub nexc nrnd float %a, %b ret float %0 } @@ -37,7 +37,7 @@ ; NONE: bl __aeabi_dsub ; SP: bl __aeabi_dsub ; DP: vsub.f64 d0, d0, d1 - %0 = fsub double %a, %b + %0 = fsub nexc nrnd double %a, %b ret double %0 } @@ -46,7 +46,7 @@ ; CHECK-LABEL: mul_f: ; NONE: bl __aeabi_fmul ; HARD: vmul.f32 s - %0 = fmul float %a, %b + %0 = fmul nexc nrnd float %a, %b ret float %0 } @@ -56,7 +56,7 @@ ; NONE: bl __aeabi_dmul ; SP: bl __aeabi_dmul ; DP: vmul.f64 d0, d0, d1 - %0 = fmul double %a, %b + %0 = fmul nexc nrnd double %a, %b ret double %0 } @@ -65,7 +65,7 @@ ; CHECK-LABEL: div_f: ; NONE: bl __aeabi_fdiv ; HARD: vdiv.f32 s - %0 = fdiv float %a, %b + %0 = fdiv nexc nrnd float %a, %b ret float %0 } @@ -75,7 +75,7 @@ ; NONE: bl __aeabi_ddiv ; SP: bl __aeabi_ddiv ; DP: vdiv.f64 d0, d0, d1 - %0 = fdiv double %a, %b + %0 = fdiv nexc nrnd double %a, %b ret double %0 } @@ -84,7 +84,7 @@ ; CHECK-LABEL: rem_f: ; NONE: bl fmodf ; HARD: b fmodf - %0 = frem float %a, %b + %0 = frem nexc nrnd float %a, %b ret float %0 } @@ -93,7 +93,7 @@ ; CHECK-LABEL: rem_d: ; NONE: bl fmod ; HARD: b fmod - %0 = frem double %a, %b + %0 = frem nexc nrnd double %a, %b ret double %0 } Index: test/CodeGen/Thumb2/ifcvt-neon.ll =================================================================== --- test/CodeGen/Thumb2/ifcvt-neon.ll +++ test/CodeGen/Thumb2/ifcvt-neon.ll @@ -15,11 +15,11 @@ ; CHECK: vsub.f32 ; CHECK-NEXT: vadd.f32 ; CHECK: it gt - %3 = fadd float %1, %2 ; [#uses=1] + %3 = fadd nexc nrnd float %1, %2 ; [#uses=1] br label %bb2 bb1: ; preds = %entry - %4 = fsub float %1, %2 ; [#uses=1] + %4 = fsub nexc nrnd float %1, %2 ; [#uses=1] br label %bb2 bb2: ; preds = %bb1, %bb Index: test/CodeGen/X86/2008-10-27-CoalescerBug.ll =================================================================== --- test/CodeGen/X86/2008-10-27-CoalescerBug.ll +++ test/CodeGen/X86/2008-10-27-CoalescerBug.ll @@ -26,7 +26,7 @@ br i1 %4, label %bb18, label %bb3 bb18: ; preds = %bb3 - %5 = fdiv double %11, 0.000000e+00 ; [#uses=1] + %5 = fdiv nexc nrnd double %11, 0.000000e+00 ; [#uses=1] %6 = tail call double @sin(double %5) nounwind readonly ; [#uses=1] br label %bb24.preheader @@ -34,7 +34,7 @@ br label %bb22.preheader bb25: ; preds = %bb24.preheader - %7 = fmul double 0.000000e+00, %6 ; [#uses=0] + %7 = fmul nexc nrnd double 0.000000e+00, %6 ; [#uses=0] %8 = add i32 %i3.122100, 0 ; [#uses=1] %9 = icmp sgt i32 %8, 0 ; [#uses=1] br i1 %9, label %bb3, label %bb24.preheader @@ -45,7 +45,7 @@ br i1 %10, label %bb25, label %bb22.preheader bb30.loopexit: ; preds = %bb - %11 = fmul double 0.000000e+00, 0x401921FB54442D1C ; [#uses=1] + %11 = fmul nexc nrnd double 0.000000e+00, 0x401921FB54442D1C ; [#uses=1] br label %bb3 } Index: test/CodeGen/X86/2012-04-26-sdglue.ll =================================================================== --- test/CodeGen/X86/2012-04-26-sdglue.ll +++ test/CodeGen/X86/2012-04-26-sdglue.ll @@ -27,16 +27,16 @@ %tmp23 = bitcast <16 x i8> %tmp22 to <4 x float> %tmp24 = shufflevector <4 x float> %tmp20, <4 x float> , <8 x i32> %tmp25 = call <8 x float> @llvm.x86.avx.vinsertf128.ps.256(<8 x float> %tmp24, <4 x float> %tmp23, i8 1) - %tmp26 = fmul <8 x float> %tmp17, undef - %tmp27 = fmul <8 x float> %tmp25, undef - %tmp28 = fadd <8 x float> %tmp26, %tmp27 - %tmp29 = fadd <8 x float> %tmp28, undef + %tmp26 = fmul nexc nrnd <8 x float> %tmp17, undef + %tmp27 = fmul nexc nrnd <8 x float> %tmp25, undef + %tmp28 = fadd nexc nrnd <8 x float> %tmp26, %tmp27 + %tmp29 = fadd nexc nrnd <8 x float> %tmp28, undef %tmp30 = shufflevector <8 x float> %tmp29, <8 x float> undef, <4 x i32> - %tmp31 = fmul <4 x float> undef, %tmp30 + %tmp31 = fmul nexc nrnd <4 x float> undef, %tmp30 %tmp32 = call <8 x float> @llvm.x86.avx.vinsertf128.ps.256(<8 x float> zeroinitializer, <4 x float> %tmp31, i8 1) - %tmp33 = fadd <8 x float> undef, %tmp32 + %tmp33 = fadd nexc nrnd <8 x float> undef, %tmp32 %tmp34 = call <8 x float> @llvm.x86.avx.hadd.ps.256(<8 x float> %tmp33, <8 x float> undef) nounwind - %tmp35 = fsub <8 x float> %tmp34, undef + %tmp35 = fsub nexc nrnd <8 x float> %tmp34, undef %tmp36 = call <8 x float> @llvm.x86.avx.hadd.ps.256(<8 x float> zeroinitializer, <8 x float> %tmp35) nounwind store <8 x float> %tmp36, <8 x float>* undef, align 32 ret void Index: test/CodeGen/X86/atomic_mi.ll =================================================================== --- test/CodeGen/X86/atomic_mi.ll +++ test/CodeGen/X86/atomic_mi.ll @@ -849,7 +849,7 @@ %floc = bitcast float* %loc to i32* %1 = load atomic i32, i32* %floc seq_cst, align 4 %2 = bitcast i32 %1 to float - %add = fadd float %2, %val + %add = fadd nexc nrnd float %2, %val %3 = bitcast float %add to i32 store atomic i32 %3, i32* %floc release, align 4 ret void @@ -866,7 +866,7 @@ %floc = bitcast double* %loc to i64* %1 = load atomic i64, i64* %floc seq_cst, align 8 %2 = bitcast i64 %1 to double - %add = fadd double %2, %val + %add = fadd nexc nrnd double %2, %val %3 = bitcast double %add to i64 store atomic i64 %3, i64* %floc release, align 8 ret void @@ -886,7 +886,7 @@ ; Don't check x86-32 (see comment above). %i = load atomic i32, i32* bitcast (float* @glob32 to i32*) monotonic, align 4 %f = bitcast i32 %i to float - %add = fadd float %f, 1.000000e+00 + %add = fadd nexc nrnd float %f, 1.000000e+00 %s = bitcast float %add to i32 store atomic i32 %s, i32* bitcast (float* @glob32 to i32*) monotonic, align 4 ret void @@ -902,7 +902,7 @@ ; Don't check x86-32 (see comment above). %i = load atomic i64, i64* bitcast (double* @glob64 to i64*) monotonic, align 8 %f = bitcast i64 %i to double - %add = fadd double %f, 1.000000e+00 + %add = fadd nexc nrnd double %f, 1.000000e+00 %s = bitcast double %add to i64 store atomic i64 %s, i64* bitcast (double* @glob64 to i64*) monotonic, align 8 ret void @@ -920,7 +920,7 @@ ; Don't check x86-32 (see comment above). %i = load atomic i32, i32* inttoptr (i32 3735928559 to i32*) monotonic, align 4 %f = bitcast i32 %i to float - %add = fadd float %f, 1.000000e+00 + %add = fadd nexc nrnd float %f, 1.000000e+00 %s = bitcast float %add to i32 store atomic i32 %s, i32* inttoptr (i32 3735928559 to i32*) monotonic, align 4 ret void @@ -937,7 +937,7 @@ ; Don't check x86-32 (see comment above). %i = load atomic i64, i64* inttoptr (i64 3735928559 to i64*) monotonic, align 8 %f = bitcast i64 %i to double - %add = fadd double %f, 1.000000e+00 + %add = fadd nexc nrnd double %f, 1.000000e+00 %s = bitcast double %add to i64 store atomic i64 %s, i64* inttoptr (i64 3735928559 to i64*) monotonic, align 8 ret void @@ -956,7 +956,7 @@ %bc3 = bitcast i32* %ptr to float* %load = load atomic i32, i32* %ptr acquire, align 4 %bc0 = bitcast i32 %load to float - %fadd = fadd float 1.000000e+00, %bc0 + %fadd = fadd nexc nrnd float 1.000000e+00, %bc0 %bc1 = bitcast float %fadd to i32 store atomic i32 %bc1, i32* %ptr release, align 4 ret void @@ -974,7 +974,7 @@ %bc3 = bitcast i64* %ptr to double* %load = load atomic i64, i64* %ptr acquire, align 8 %bc0 = bitcast i64 %load to double - %fadd = fadd double 1.000000e+00, %bc0 + %fadd = fadd nexc nrnd double 1.000000e+00, %bc0 %bc1 = bitcast double %fadd to i64 store atomic i64 %bc1, i64* %ptr release, align 8 ret void Index: test/CodeGen/X86/avx512-fma.ll =================================================================== --- test/CodeGen/X86/avx512-fma.ll +++ test/CodeGen/X86/avx512-fma.ll @@ -5,8 +5,8 @@ ; CHECK: vfmadd213ps %zmm2, %zmm1, %zmm0 ; CHECK: ret define <16 x float> @test_x86_fmadd_ps_z(<16 x float> %a0, <16 x float> %a1, <16 x float> %a2) { - %x = fmul <16 x float> %a0, %a1 - %res = fadd <16 x float> %x, %a2 + %x = fmul nexc nrnd <16 x float> %a0, %a1 + %res = fadd nexc nrnd <16 x float> %x, %a2 ret <16 x float> %res } @@ -14,8 +14,8 @@ ; CHECK: vfmsub213ps %zmm2, %zmm1, %zmm0 ; CHECK: ret define <16 x float> @test_x86_fmsub_ps_z(<16 x float> %a0, <16 x float> %a1, <16 x float> %a2) { - %x = fmul <16 x float> %a0, %a1 - %res = fsub <16 x float> %x, %a2 + %x = fmul nexc nrnd <16 x float> %a0, %a1 + %res = fsub nexc nrnd <16 x float> %x, %a2 ret <16 x float> %res } @@ -23,8 +23,8 @@ ; CHECK: vfnmadd213ps %zmm2, %zmm1, %zmm0 ; CHECK: ret define <16 x float> @test_x86_fnmadd_ps_z(<16 x float> %a0, <16 x float> %a1, <16 x float> %a2) { - %x = fmul <16 x float> %a0, %a1 - %res = fsub <16 x float> %a2, %x + %x = fmul nexc nrnd <16 x float> %a0, %a1 + %res = fsub nexc nrnd <16 x float> %a2, %x ret <16 x float> %res } @@ -32,12 +32,12 @@ ; CHECK: vfnmsub213ps %zmm2, %zmm1, %zmm0 ; CHECK: ret define <16 x float> @test_x86_fnmsub_ps_z(<16 x float> %a0, <16 x float> %a1, <16 x float> %a2) { - %x = fmul <16 x float> %a0, %a1 - %y = fsub <16 x float> %a0, %a1 + %y = fsub nexc nrnd <16 x float> , %x - %res = fsub <16 x float> %y, %a2 + %res = fsub nexc nrnd <16 x float> %y, %a2 ret <16 x float> %res } @@ -45,8 +45,8 @@ ; CHECK: vfmadd213pd %zmm2, %zmm1, %zmm0 ; CHECK: ret define <8 x double> @test_x86_fmadd_pd_z(<8 x double> %a0, <8 x double> %a1, <8 x double> %a2) { - %x = fmul <8 x double> %a0, %a1 - %res = fadd <8 x double> %x, %a2 + %x = fmul nexc nrnd <8 x double> %a0, %a1 + %res = fadd nexc nrnd <8 x double> %x, %a2 ret <8 x double> %res } @@ -54,8 +54,8 @@ ; CHECK: vfmsub213pd %zmm2, %zmm1, %zmm0 ; CHECK: ret define <8 x double> @test_x86_fmsub_pd_z(<8 x double> %a0, <8 x double> %a1, <8 x double> %a2) { - %x = fmul <8 x double> %a0, %a1 - %res = fsub <8 x double> %x, %a2 + %x = fmul nexc nrnd <8 x double> %a0, %a1 + %res = fsub nexc nrnd <8 x double> %x, %a2 ret <8 x double> %res } @@ -65,8 +65,8 @@ ; CHECK-NEXT: vfmsub213sd %xmm2, %xmm0, %xmm1 ; CHECK-NEXT: vmovaps %zmm1, %zmm0 ; CHECK-NEXT: retq - %x = fmul double %a0, %a1 - %res = fsub double %x, %a2 + %x = fmul nexc nrnd double %a0, %a1 + %res = fsub nexc nrnd double %x, %a2 ret double %res } @@ -77,8 +77,8 @@ ; CHECK-NEXT: vmovaps %zmm1, %zmm0 ; CHECK-NEXT: retq %a2 = load double , double *%a2_ptr - %x = fmul double %a0, %a1 - %res = fsub double %x, %a2 + %x = fmul nexc nrnd double %a0, %a1 + %res = fsub nexc nrnd double %x, %a2 ret double %res } @@ -89,8 +89,8 @@ ; CHECK-NEXT: vmovaps %zmm1, %zmm0 ; CHECK-NEXT: retq %a2 = load double , double *%a2_ptr - %x = fmul double %a0, %a2 - %res = fsub double %x, %a1 + %x = fmul nexc nrnd double %a0, %a2 + %res = fsub nexc nrnd double %x, %a1 ret double %res } @@ -100,8 +100,8 @@ ; CHECK-NEXT: vfmadd231ps {{.*}}(%rip){1to16}, %zmm0, %zmm1 ; CHECK-NEXT: vmovaps %zmm1, %zmm0 ; CHECK-NEXT: retq - %b1 = fmul <16 x float> %a1, - %b2 = fadd <16 x float> %b1, %a2 + %b1 = fmul nexc nrnd <16 x float> %a1, + %b2 = fadd nexc nrnd <16 x float> %b1, %a2 ret <16 x float> %b2 } @@ -110,8 +110,8 @@ ; CHECK: ## BB#0: ; CHECK-NEXT: vfmadd213ps {{.*}}(%rip){1to16}, %zmm1, %zmm0 ; CHECK-NEXT: retq - %b1 = fmul <16 x float> %a1, %a2 - %b2 = fadd <16 x float> %b1, + %b1 = fmul nexc nrnd <16 x float> %a1, %a2 + %b2 = fadd nexc nrnd <16 x float> %b1, ret <16 x float> %b2 } @@ -131,8 +131,8 @@ ; SKX-NEXT: vfmadd132ps (%rdi), %zmm1, %zmm0 {%k1} ; SKX-NEXT: retq %a2 = load <16 x float>,<16 x float> *%a2_ptrt,align 1 - %x = fmul <16 x float> %a0, %a2 - %y = fadd <16 x float> %x, %a1 + %x = fmul nexc nrnd <16 x float> %a0, %a2 + %y = fadd nexc nrnd <16 x float> %x, %a1 %res = select <16 x i1> %mask, <16 x float> %y, <16 x float> %a0 ret <16 x float> %res } @@ -155,8 +155,8 @@ ; SKX-NEXT: vmovaps %zmm1, %zmm0 ; SKX-NEXT: retq %a2 = load <16 x float>,<16 x float> *%a2_ptrt,align 1 - %x = fmul <16 x float> %a0, %a2 - %y = fadd <16 x float> %x, %a1 + %x = fmul nexc nrnd <16 x float> %a0, %a2 + %y = fadd nexc nrnd <16 x float> %x, %a1 %res = select <16 x i1> %mask, <16 x float> %y, <16 x float> %a1 ret <16 x float> %res } @@ -179,8 +179,8 @@ ; SKX-NEXT: vmovaps %zmm1, %zmm0 ; SKX-NEXT: retq %a2 = load <16 x float>,<16 x float> *%a2_ptrt,align 1 - %x = fmul <16 x float> %a1, %a0 - %y = fadd <16 x float> %x, %a2 + %x = fmul nexc nrnd <16 x float> %a1, %a0 + %y = fadd nexc nrnd <16 x float> %x, %a2 %res = select <16 x i1> %mask, <16 x float> %y, <16 x float> %a1 ret <16 x float> %res } Index: test/CodeGen/X86/avx512vl-arith.ll =================================================================== --- test/CodeGen/X86/avx512vl-arith.ll +++ test/CodeGen/X86/avx512vl-arith.ll @@ -154,7 +154,7 @@ ; CHECK: ret define <4 x double> @test_vaddpd_256(<4 x double> %y, <4 x double> %x) { entry: - %add.i = fadd <4 x double> %x, %y + %add.i = fadd nexc nrnd <4 x double> %x, %y ret <4 x double> %add.i } @@ -163,7 +163,7 @@ ; CHECK: ret define <4 x double> @test_fold_vaddpd_256(<4 x double> %y) { entry: - %add.i = fadd <4 x double> %y, + %add.i = fadd nexc nrnd <4 x double> %y, ret <4 x double> %add.i } @@ -171,7 +171,7 @@ ; CHECK: LCP{{.*}}(%rip){1to8}, %ymm0, %ymm0 ; CHECK: ret define <8 x float> @test_broadcast_vaddpd_256(<8 x float> %a) nounwind { - %b = fadd <8 x float> %a, + %b = fadd nexc nrnd <8 x float> %a, ret <8 x float> %b } @@ -182,7 +182,7 @@ <8 x float> %j, <8 x i32> %mask1) nounwind readnone { %mask = icmp ne <8 x i32> %mask1, zeroinitializer - %x = fadd <8 x float> %i, %j + %x = fadd nexc nrnd <8 x float> %i, %j %r = select <8 x i1> %mask, <8 x float> %x, <8 x float> %dst ret <8 x float> %r } @@ -194,7 +194,7 @@ <8 x float> %j, <8 x i32> %mask1) nounwind readnone { %mask = icmp ne <8 x i32> %mask1, zeroinitializer - %x = fmul <8 x float> %i, %j + %x = fmul nexc nrnd <8 x float> %i, %j %r = select <8 x i1> %mask, <8 x float> %x, <8 x float> %dst ret <8 x float> %r } @@ -232,7 +232,7 @@ <8 x float> %j, <8 x i32> %mask1) nounwind readnone { %mask = icmp ne <8 x i32> %mask1, zeroinitializer - %x = fsub <8 x float> %i, %j + %x = fsub nexc nrnd <8 x float> %i, %j %r = select <8 x i1> %mask, <8 x float> %x, <8 x float> %dst ret <8 x float> %r } @@ -244,7 +244,7 @@ <8 x float> %j, <8 x i32> %mask1) nounwind readnone { %mask = icmp ne <8 x i32> %mask1, zeroinitializer - %x = fdiv <8 x float> %i, %j + %x = fdiv nexc nrnd <8 x float> %i, %j %r = select <8 x i1> %mask, <8 x float> %x, <8 x float> %dst ret <8 x float> %r } @@ -256,7 +256,7 @@ <4 x double> %j, <4 x i64> %mask1) nounwind readnone { %mask = icmp ne <4 x i64> %mask1, zeroinitializer - %x = fmul <4 x double> %i, %j + %x = fmul nexc nrnd <4 x double> %i, %j %r = select <4 x i1> %mask, <4 x double> %x, <4 x double> %dst ret <4 x double> %r } @@ -294,7 +294,7 @@ <4 x double> %j, <4 x i64> %mask1) nounwind readnone { %mask = icmp ne <4 x i64> %mask1, zeroinitializer - %x = fsub <4 x double> %i, %j + %x = fsub nexc nrnd <4 x double> %i, %j %r = select <4 x i1> %mask, <4 x double> %x, <4 x double> %dst ret <4 x double> %r } @@ -306,7 +306,7 @@ <4 x double> %j, <4 x i64> %mask1) nounwind readnone { %mask = icmp ne <4 x i64> %mask1, zeroinitializer - %x = fdiv <4 x double> %i, %j + %x = fdiv nexc nrnd <4 x double> %i, %j %r = select <4 x i1> %mask, <4 x double> %x, <4 x double> %dst ret <4 x double> %r } @@ -318,7 +318,7 @@ <4 x double> %j, <4 x i64> %mask1) nounwind readnone { %mask = icmp ne <4 x i64> %mask1, zeroinitializer - %x = fadd <4 x double> %i, %j + %x = fadd nexc nrnd <4 x double> %i, %j %r = select <4 x i1> %mask, <4 x double> %x, <4 x double> %dst ret <4 x double> %r } @@ -329,7 +329,7 @@ define <4 x double> @test_maskz_vaddpd_256(<4 x double> %i, <4 x double> %j, <4 x i64> %mask1) nounwind readnone { %mask = icmp ne <4 x i64> %mask1, zeroinitializer - %x = fadd <4 x double> %i, %j + %x = fadd nexc nrnd <4 x double> %i, %j %r = select <4 x i1> %mask, <4 x double> %x, <4 x double> zeroinitializer ret <4 x double> %r } @@ -342,7 +342,7 @@ nounwind { %mask = icmp ne <4 x i64> %mask1, zeroinitializer %tmp = load <4 x double>, <4 x double>* %j - %x = fadd <4 x double> %i, %tmp + %x = fadd nexc nrnd <4 x double> %i, %tmp %r = select <4 x i1> %mask, <4 x double> %x, <4 x double> %dst ret <4 x double> %r } @@ -354,7 +354,7 @@ <4 x i64> %mask1) nounwind { %mask = icmp ne <4 x i64> %mask1, zeroinitializer %tmp = load <4 x double>, <4 x double>* %j - %x = fadd <4 x double> %i, %tmp + %x = fadd nexc nrnd <4 x double> %i, %tmp %r = select <4 x i1> %mask, <4 x double> %x, <4 x double> zeroinitializer ret <4 x double> %r } @@ -367,7 +367,7 @@ %b = insertelement <4 x double> undef, double %tmp, i32 0 %c = shufflevector <4 x double> %b, <4 x double> undef, <4 x i32> zeroinitializer - %x = fadd <4 x double> %c, %i + %x = fadd nexc nrnd <4 x double> %c, %i ret <4 x double> %x } @@ -381,7 +381,7 @@ %b = insertelement <4 x double> undef, double %tmp, i32 0 %c = shufflevector <4 x double> %b, <4 x double> undef, <4 x i32> zeroinitializer - %x = fadd <4 x double> %c, %i + %x = fadd nexc nrnd <4 x double> %c, %i %r = select <4 x i1> %mask, <4 x double> %x, <4 x double> %i ret <4 x double> %r } @@ -396,7 +396,7 @@ %b = insertelement <4 x double> undef, double %tmp, i32 0 %c = shufflevector <4 x double> %b, <4 x double> undef, <4 x i32> zeroinitializer - %x = fadd <4 x double> %c, %i + %x = fadd nexc nrnd <4 x double> %c, %i %r = select <4 x i1> %mask, <4 x double> %x, <4 x double> zeroinitializer ret <4 x double> %r } @@ -547,7 +547,7 @@ ; CHECK: ret define <2 x double> @test_vaddpd_128(<2 x double> %y, <2 x double> %x) { entry: - %add.i = fadd <2 x double> %x, %y + %add.i = fadd nexc nrnd <2 x double> %x, %y ret <2 x double> %add.i } @@ -556,7 +556,7 @@ ; CHECK: ret define <2 x double> @test_fold_vaddpd_128(<2 x double> %y) { entry: - %add.i = fadd <2 x double> %y, + %add.i = fadd nexc nrnd <2 x double> %y, ret <2 x double> %add.i } @@ -564,7 +564,7 @@ ; CHECK: LCP{{.*}}(%rip){1to4}, %xmm0, %xmm0 ; CHECK: ret define <4 x float> @test_broadcast_vaddpd_128(<4 x float> %a) nounwind { - %b = fadd <4 x float> %a, + %b = fadd nexc nrnd <4 x float> %a, ret <4 x float> %b } @@ -575,7 +575,7 @@ <4 x float> %j, <4 x i32> %mask1) nounwind readnone { %mask = icmp ne <4 x i32> %mask1, zeroinitializer - %x = fadd <4 x float> %i, %j + %x = fadd nexc nrnd <4 x float> %i, %j %r = select <4 x i1> %mask, <4 x float> %x, <4 x float> %dst ret <4 x float> %r } @@ -587,7 +587,7 @@ <4 x float> %j, <4 x i32> %mask1) nounwind readnone { %mask = icmp ne <4 x i32> %mask1, zeroinitializer - %x = fmul <4 x float> %i, %j + %x = fmul nexc nrnd <4 x float> %i, %j %r = select <4 x i1> %mask, <4 x float> %x, <4 x float> %dst ret <4 x float> %r } @@ -625,7 +625,7 @@ <4 x float> %j, <4 x i32> %mask1) nounwind readnone { %mask = icmp ne <4 x i32> %mask1, zeroinitializer - %x = fsub <4 x float> %i, %j + %x = fsub nexc nrnd <4 x float> %i, %j %r = select <4 x i1> %mask, <4 x float> %x, <4 x float> %dst ret <4 x float> %r } @@ -638,7 +638,7 @@ <4 x float> %j, <4 x i32> %mask1) nounwind readnone { %mask = icmp ne <4 x i32> %mask1, zeroinitializer - %x = fdiv <4 x float> %i, %j + %x = fdiv nexc nrnd <4 x float> %i, %j %r = select <4 x i1> %mask, <4 x float> %x, <4 x float> %dst ret <4 x float> %r } @@ -650,7 +650,7 @@ <2 x double> %j, <2 x i64> %mask1) nounwind readnone { %mask = icmp ne <2 x i64> %mask1, zeroinitializer - %x = fmul <2 x double> %i, %j + %x = fmul nexc nrnd <2 x double> %i, %j %r = select <2 x i1> %mask, <2 x double> %x, <2 x double> %dst ret <2 x double> %r } @@ -688,7 +688,7 @@ <2 x double> %j, <2 x i64> %mask1) nounwind readnone { %mask = icmp ne <2 x i64> %mask1, zeroinitializer - %x = fsub <2 x double> %i, %j + %x = fsub nexc nrnd <2 x double> %i, %j %r = select <2 x i1> %mask, <2 x double> %x, <2 x double> %dst ret <2 x double> %r } @@ -700,7 +700,7 @@ <2 x double> %j, <2 x i64> %mask1) nounwind readnone { %mask = icmp ne <2 x i64> %mask1, zeroinitializer - %x = fdiv <2 x double> %i, %j + %x = fdiv nexc nrnd <2 x double> %i, %j %r = select <2 x i1> %mask, <2 x double> %x, <2 x double> %dst ret <2 x double> %r } @@ -712,7 +712,7 @@ <2 x double> %j, <2 x i64> %mask1) nounwind readnone { %mask = icmp ne <2 x i64> %mask1, zeroinitializer - %x = fadd <2 x double> %i, %j + %x = fadd nexc nrnd <2 x double> %i, %j %r = select <2 x i1> %mask, <2 x double> %x, <2 x double> %dst ret <2 x double> %r } @@ -723,7 +723,7 @@ define <2 x double> @test_maskz_vaddpd_128(<2 x double> %i, <2 x double> %j, <2 x i64> %mask1) nounwind readnone { %mask = icmp ne <2 x i64> %mask1, zeroinitializer - %x = fadd <2 x double> %i, %j + %x = fadd nexc nrnd <2 x double> %i, %j %r = select <2 x i1> %mask, <2 x double> %x, <2 x double> zeroinitializer ret <2 x double> %r } @@ -736,7 +736,7 @@ nounwind { %mask = icmp ne <2 x i64> %mask1, zeroinitializer %tmp = load <2 x double>, <2 x double>* %j - %x = fadd <2 x double> %i, %tmp + %x = fadd nexc nrnd <2 x double> %i, %tmp %r = select <2 x i1> %mask, <2 x double> %x, <2 x double> %dst ret <2 x double> %r } @@ -748,7 +748,7 @@ <2 x i64> %mask1) nounwind { %mask = icmp ne <2 x i64> %mask1, zeroinitializer %tmp = load <2 x double>, <2 x double>* %j - %x = fadd <2 x double> %i, %tmp + %x = fadd nexc nrnd <2 x double> %i, %tmp %r = select <2 x i1> %mask, <2 x double> %x, <2 x double> zeroinitializer ret <2 x double> %r } @@ -760,7 +760,7 @@ %tmp = load double, double* %j %j.0 = insertelement <2 x double> undef, double %tmp, i64 0 %j.1 = insertelement <2 x double> %j.0, double %tmp, i64 1 - %x = fadd <2 x double> %j.1, %i + %x = fadd nexc nrnd <2 x double> %j.1, %i ret <2 x double> %x } @@ -774,7 +774,7 @@ %tmp = load double, double* %j %j.0 = insertelement <2 x double> undef, double %tmp, i64 0 %j.1 = insertelement <2 x double> %j.0, double %tmp, i64 1 - %x = fadd <2 x double> %j.1, %i + %x = fadd nexc nrnd <2 x double> %j.1, %i %r = select <2 x i1> %mask, <2 x double> %x, <2 x double> %i ret <2 x double> %r } @@ -788,7 +788,7 @@ %tmp = load double, double* %j %j.0 = insertelement <2 x double> undef, double %tmp, i64 0 %j.1 = insertelement <2 x double> %j.0, double %tmp, i64 1 - %x = fadd <2 x double> %j.1, %i + %x = fadd nexc nrnd <2 x double> %j.1, %i %r = select <2 x i1> %mask, <2 x double> %x, <2 x double> zeroinitializer ret <2 x double> %r } Index: test/CodeGen/X86/chain_order.ll =================================================================== --- test/CodeGen/X86/chain_order.ll +++ test/CodeGen/X86/chain_order.ll @@ -23,14 +23,14 @@ %5 = insertelement <2 x double> %4, double %3, i32 1 %6 = insertelement <2 x double> undef, double %1, i32 0 %7 = insertelement <2 x double> %6, double %2, i32 1 - %8 = fadd <2 x double> %5, %7 + %8 = fadd nexc nrnd <2 x double> %5, %7 %9 = bitcast double* %a to <2 x double>* store <2 x double> %8, <2 x double>* %9, align 8 %10 = insertelement <2 x double> undef, double %0, i32 0 %11 = insertelement <2 x double> %10, double %2, i32 1 %12 = insertelement <2 x double> undef, double %1, i32 0 %13 = insertelement <2 x double> %12, double %3, i32 1 - %14 = fsub <2 x double> %11, %13 + %14 = fsub nexc nrnd <2 x double> %11, %13 %15 = bitcast double* %arrayidx1 to <2 x double>* store <2 x double> %14, <2 x double>* %15, align 8 ret void Index: test/CodeGen/X86/constant-pool-remat-0.ll =================================================================== --- test/CodeGen/X86/constant-pool-remat-0.ll +++ test/CodeGen/X86/constant-pool-remat-0.ll @@ -16,8 +16,8 @@ declare float @qux(float %y) define float @array(float %a) nounwind { - %n = fmul float %a, 9.0 + %n = fmul nexc nrnd float %a, 9.0 %m = call float @qux(float %n) - %o = fmul float %m, 9.0 + %o = fmul nexc nrnd float %m, 9.0 ret float %o } Index: test/CodeGen/X86/fadd-combines.ll =================================================================== --- test/CodeGen/X86/fadd-combines.ll +++ test/CodeGen/X86/fadd-combines.ll @@ -5,7 +5,7 @@ ; CHECK-LABEL: fadd_zero_f32: ; CHECK: # BB#0: ; CHECK-NEXT: retq - %y = fadd float %x, 0.0 + %y = fadd nexc nrnd float %x, 0.0 ret float %y } @@ -13,7 +13,7 @@ ; CHECK-LABEL: fadd_zero_4f32: ; CHECK: # BB#0: ; CHECK-NEXT: retq - %y = fadd <4 x float> %x, zeroinitializer + %y = fadd nexc nrnd <4 x float> %x, zeroinitializer ret <4 x float> %y } @@ -23,8 +23,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: addss {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd float %x, 1.0 - %z = fadd float %y, 2.0 + %y = fadd nexc nrnd float %x, 1.0 + %z = fadd nexc nrnd float %y, 2.0 ret float %z } @@ -37,8 +37,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: addps {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd <4 x float> %x, - %z = fadd <4 x float> %y, + %y = fadd nexc nrnd <4 x float> %x, + %z = fadd nexc nrnd <4 x float> %y, ret <4 x float> %z } @@ -48,8 +48,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulss {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fmul float %x, 2.0 - %z = fadd float %x, %y + %y = fmul nexc nrnd float %x, 2.0 + %z = fadd nexc nrnd float %x, %y ret float %z } @@ -62,8 +62,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulps {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fmul <4 x float> %x, - %z = fadd <4 x float> %x, %y + %y = fmul nexc nrnd <4 x float> %x, + %z = fadd nexc nrnd <4 x float> %x, %y ret <4 x float> %z } @@ -73,8 +73,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulss {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fmul float %x, 2.0 - %z = fadd float %y, %x + %y = fmul nexc nrnd float %x, 2.0 + %z = fadd nexc nrnd float %y, %x ret float %z } @@ -87,8 +87,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulps {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fmul <4 x float> %x, - %z = fadd <4 x float> %y, %x + %y = fmul nexc nrnd <4 x float> %x, + %z = fadd nexc nrnd <4 x float> %y, %x ret <4 x float> %z } @@ -98,9 +98,9 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulss {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd float %x, %x - %z = fmul float %x, 2.0 - %w = fadd float %y, %z + %y = fadd nexc nrnd float %x, %x + %z = fmul nexc nrnd float %x, 2.0 + %w = fadd nexc nrnd float %y, %z ret float %w } @@ -113,9 +113,9 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulps {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd <4 x float> %x, %x - %z = fmul <4 x float> %x, - %w = fadd <4 x float> %y, %z + %y = fadd nexc nrnd <4 x float> %x, %x + %z = fmul nexc nrnd <4 x float> %x, + %w = fadd nexc nrnd <4 x float> %y, %z ret <4 x float> %w } @@ -125,9 +125,9 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulss {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd float %x, %x - %z = fmul float %x, 2.0 - %w = fadd float %z, %y + %y = fadd nexc nrnd float %x, %x + %z = fmul nexc nrnd float %x, 2.0 + %w = fadd nexc nrnd float %z, %y ret float %w } @@ -140,9 +140,9 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulps {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd <4 x float> %x, %x - %z = fmul <4 x float> %x, - %w = fadd <4 x float> %z, %y + %y = fadd nexc nrnd <4 x float> %x, %x + %z = fmul nexc nrnd <4 x float> %x, + %w = fadd nexc nrnd <4 x float> %z, %y ret <4 x float> %w } @@ -152,8 +152,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulss {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd float %x, %x - %z = fadd float %x, %y + %y = fadd nexc nrnd float %x, %x + %z = fadd nexc nrnd float %x, %y ret float %z } @@ -166,8 +166,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulps {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd <4 x float> %x, %x - %z = fadd <4 x float> %x, %y + %y = fadd nexc nrnd <4 x float> %x, %x + %z = fadd nexc nrnd <4 x float> %x, %y ret <4 x float> %z } @@ -177,8 +177,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulss {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd float %x, %x - %z = fadd float %y, %x + %y = fadd nexc nrnd float %x, %x + %z = fadd nexc nrnd float %y, %x ret float %z } @@ -191,8 +191,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulps {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd <4 x float> %x, %x - %z = fadd <4 x float> %y, %x + %y = fadd nexc nrnd <4 x float> %x, %x + %z = fadd nexc nrnd <4 x float> %y, %x ret <4 x float> %z } @@ -202,8 +202,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulss {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd float %x, %x - %z = fadd float %y, %y + %y = fadd nexc nrnd float %x, %x + %z = fadd nexc nrnd float %y, %y ret float %z } @@ -216,8 +216,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulps {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %y = fadd <4 x float> %x, %x - %z = fadd <4 x float> %y, %y + %y = fadd nexc nrnd <4 x float> %x, %x + %z = fadd nexc nrnd <4 x float> %y, %y ret <4 x float> %z } Index: test/CodeGen/X86/fdiv-combine.ll =================================================================== --- test/CodeGen/X86/fdiv-combine.ll +++ test/CodeGen/X86/fdiv-combine.ll @@ -10,7 +10,7 @@ ; CHECK: # BB#0: ; CHECK-NEXT: divss %xmm1, %xmm0 ; CHECK-NEXT: retq - %div1 = fdiv arcp float %x, %y + %div1 = fdiv nexc nrnd arcp float %x, %y ret float %div1 } @@ -25,9 +25,9 @@ ; CHECK-NEXT: mulss %xmm1, %xmm0 ; CHECK-NEXT: mulss %xmm3, %xmm0 ; CHECK-NEXT: retq - %div1 = fdiv arcp float %x, %z - %mul = fmul arcp float %div1, %y - %div2 = fdiv arcp float %mul, %z + %div1 = fdiv nexc nrnd arcp float %x, %z + %mul = fmul nexc nrnd arcp float %div1, %y + %div2 = fdiv nexc nrnd arcp float %mul, %z ret float %div2 } @@ -40,9 +40,9 @@ ; CHECK-NEXT: mulss %xmm1, %xmm0 ; CHECK-NEXT: divss %xmm2, %xmm0 ; CHECK-NEXT: retq - %div1 = fdiv float %x, %z - %mul = fmul arcp float %div1, %y - %div2 = fdiv arcp float %mul, %z + %div1 = fdiv nexc nrnd float %x, %z + %mul = fmul nexc nrnd arcp float %div1, %y + %div2 = fdiv nexc nrnd arcp float %mul, %z ret float %div2 } @@ -55,9 +55,9 @@ ; CHECK-NEXT: mulss %xmm1, %xmm0 ; CHECK-NEXT: divss %xmm2, %xmm0 ; CHECK-NEXT: retq - %div1 = fdiv arcp float %x, %z - %mul = fmul arcp float %div1, %y - %div2 = fdiv float %mul, %z + %div1 = fdiv nexc nrnd arcp float %x, %z + %mul = fmul nexc nrnd arcp float %div1, %y + %div2 = fdiv nexc nrnd float %mul, %z ret float %div2 } @@ -72,9 +72,9 @@ ; CHECK-NEXT: mulss %xmm1, %xmm0 ; CHECK-NEXT: mulss %xmm3, %xmm0 ; CHECK-NEXT: retq - %div1 = fdiv arcp float %x, %z - %mul = fmul float %div1, %y - %div2 = fdiv arcp float %mul, %z + %div1 = fdiv nexc nrnd arcp float %x, %z + %mul = fmul nexc nrnd float %div1, %y + %div2 = fdiv nexc nrnd arcp float %mul, %z ret float %div2 } @@ -89,9 +89,9 @@ ; CHECK-NEXT: mulsd %xmm2, %xmm0 ; CHECK-NEXT: addsd %xmm2, %xmm0 ; CHECK-NEXT: retq - %div1 = fdiv fast double 1.0, %y - %div2 = fdiv fast double %x, %y - %ret = fadd fast double %div2, %div1 + %div1 = fdiv nexc nrnd fast double 1.0, %y + %div2 = fdiv nexc nrnd fast double %x, %y + %ret = fadd nexc nrnd fast double %div2, %div1 ret double %ret } @@ -108,7 +108,7 @@ %call = call { double, double } @g(double %x.0) %xv0 = extractvalue { double, double } %call, 0 %xv1 = extractvalue { double, double } %call, 1 - %div = fdiv arcp double %xv0, %xv1 + %div = fdiv nexc nrnd arcp double %xv0, %xv1 br label %while.body } Index: test/CodeGen/X86/fdiv.ll =================================================================== --- test/CodeGen/X86/fdiv.ll +++ test/CodeGen/X86/fdiv.ll @@ -7,7 +7,7 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulsd {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %div = fdiv double %x, 2.0 + %div = fdiv nexc nrnd double %x, 2.0 ret double %div } @@ -17,7 +17,7 @@ ; CHECK: # BB#0: ; CHECK-NEXT: mulsd {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %div = fdiv double %x, 0x41DFFFFFFFC00000 + %div = fdiv nexc nrnd double %x, 0x41DFFFFFFFC00000 ret double %div } @@ -28,7 +28,7 @@ ; CHECK-NEXT: xorpd %xmm1, %xmm1 ; CHECK-NEXT: divsd %xmm1, %xmm0 ; CHECK-NEXT: retq - %div = fdiv double %x, 0.0 + %div = fdiv nexc nrnd double %x, 0.0 ret double %div } @@ -38,7 +38,7 @@ ; CHECK: # BB#0: ; CHECK-NEXT: divsd {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %div = fdiv double %x, 0x7FD0000000000001 + %div = fdiv nexc nrnd double %x, 0x7FD0000000000001 ret double %div } @@ -48,7 +48,7 @@ ; CHECK: # BB#0: ; CHECK-NEXT: divsd {{.*}}(%rip), %xmm0 ; CHECK-NEXT: retq - %div = fdiv double %x, 0x7FEFFFFFFFFFFFFF + %div = fdiv nexc nrnd double %x, 0x7FEFFFFFFFFFFFFF ret double %div } @@ -59,9 +59,9 @@ ; CHECK: # BB#0: ; CHECK-NEXT: divss %xmm1, %xmm0 ; CHECK-NEXT: retq - %neg1 = fsub float -0.0, %x - %neg2 = fsub float -0.0, %y - %div = fdiv float %neg1, %neg2 + %neg1 = fsub nexc nrnd float -0.0, %x + %neg2 = fsub nexc nrnd float -0.0, %y + %div = fdiv nexc nrnd float %neg1, %neg2 ret float %div } Index: test/CodeGen/X86/fma-do-not-commute.ll =================================================================== --- test/CodeGen/X86/fma-do-not-commute.ll +++ test/CodeGen/X86/fma-do-not-commute.ll @@ -20,8 +20,8 @@ %sum0 = phi float [ %fma, %loop ], [ %arg, %entry ] %addrVal = load float, float* %addr, align 4 %addr2Val = load float, float* %addr2, align 4 - %fmul = fmul float %addrVal, %addr2Val - %fma = fadd float %sum0, %fmul + %fmul = fmul nexc nrnd float %addrVal, %addr2Val + %fma = fadd nexc nrnd float %sum0, %fmul br i1 true, label %exit, label %loop exit: Index: test/CodeGen/X86/fma_patterns.ll =================================================================== --- test/CodeGen/X86/fma_patterns.ll +++ test/CodeGen/X86/fma_patterns.ll @@ -24,8 +24,8 @@ ; AVX512-NEXT: vfmadd213ss %xmm2, %xmm0, %xmm1 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul float %a0, %a1 - %res = fadd float %x, %a2 + %x = fmul nexc nrnd float %a0, %a1 + %res = fadd nexc nrnd float %x, %a2 ret float %res } @@ -44,8 +44,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213ps %xmm2, %xmm1, %xmm0 ; AVX512-NEXT: retq - %x = fmul <4 x float> %a0, %a1 - %res = fadd <4 x float> %x, %a2 + %x = fmul nexc nrnd <4 x float> %a0, %a1 + %res = fadd nexc nrnd <4 x float> %x, %a2 ret <4 x float> %res } @@ -64,8 +64,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213ps %ymm2, %ymm1, %ymm0 ; AVX512-NEXT: retq - %x = fmul <8 x float> %a0, %a1 - %res = fadd <8 x float> %x, %a2 + %x = fmul nexc nrnd <8 x float> %a0, %a1 + %res = fadd nexc nrnd <8 x float> %x, %a2 ret <8 x float> %res } @@ -85,8 +85,8 @@ ; AVX512-NEXT: vfmadd213sd %xmm2, %xmm0, %xmm1 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul double %a0, %a1 - %res = fadd double %x, %a2 + %x = fmul nexc nrnd double %a0, %a1 + %res = fadd nexc nrnd double %x, %a2 ret double %res } @@ -105,8 +105,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213pd %xmm2, %xmm1, %xmm0 ; AVX512-NEXT: retq - %x = fmul <2 x double> %a0, %a1 - %res = fadd <2 x double> %x, %a2 + %x = fmul nexc nrnd <2 x double> %a0, %a1 + %res = fadd nexc nrnd <2 x double> %x, %a2 ret <2 x double> %res } @@ -125,8 +125,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213pd %ymm2, %ymm1, %ymm0 ; AVX512-NEXT: retq - %x = fmul <4 x double> %a0, %a1 - %res = fadd <4 x double> %x, %a2 + %x = fmul nexc nrnd <4 x double> %a0, %a1 + %res = fadd nexc nrnd <4 x double> %x, %a2 ret <4 x double> %res } @@ -150,8 +150,8 @@ ; AVX512-NEXT: vfmsub213ss %xmm2, %xmm0, %xmm1 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul float %a0, %a1 - %res = fsub float %x, %a2 + %x = fmul nexc nrnd float %a0, %a1 + %res = fsub nexc nrnd float %x, %a2 ret float %res } @@ -170,8 +170,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213ps %xmm2, %xmm1, %xmm0 ; AVX512-NEXT: retq - %x = fmul <4 x float> %a0, %a1 - %res = fsub <4 x float> %x, %a2 + %x = fmul nexc nrnd <4 x float> %a0, %a1 + %res = fsub nexc nrnd <4 x float> %x, %a2 ret <4 x float> %res } @@ -190,8 +190,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213ps %ymm2, %ymm1, %ymm0 ; AVX512-NEXT: retq - %x = fmul <8 x float> %a0, %a1 - %res = fsub <8 x float> %x, %a2 + %x = fmul nexc nrnd <8 x float> %a0, %a1 + %res = fsub nexc nrnd <8 x float> %x, %a2 ret <8 x float> %res } @@ -211,8 +211,8 @@ ; AVX512-NEXT: vfmsub213sd %xmm2, %xmm0, %xmm1 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul double %a0, %a1 - %res = fsub double %x, %a2 + %x = fmul nexc nrnd double %a0, %a1 + %res = fsub nexc nrnd double %x, %a2 ret double %res } @@ -231,8 +231,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213pd %xmm2, %xmm1, %xmm0 ; AVX512-NEXT: retq - %x = fmul <2 x double> %a0, %a1 - %res = fsub <2 x double> %x, %a2 + %x = fmul nexc nrnd <2 x double> %a0, %a1 + %res = fsub nexc nrnd <2 x double> %x, %a2 ret <2 x double> %res } @@ -251,8 +251,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213pd %ymm2, %ymm1, %ymm0 ; AVX512-NEXT: retq - %x = fmul <4 x double> %a0, %a1 - %res = fsub <4 x double> %x, %a2 + %x = fmul nexc nrnd <4 x double> %a0, %a1 + %res = fsub nexc nrnd <4 x double> %x, %a2 ret <4 x double> %res } @@ -276,8 +276,8 @@ ; AVX512-NEXT: vfnmadd213ss %xmm2, %xmm0, %xmm1 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul float %a0, %a1 - %res = fsub float %a2, %x + %x = fmul nexc nrnd float %a0, %a1 + %res = fsub nexc nrnd float %a2, %x ret float %res } @@ -296,8 +296,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213ps %xmm2, %xmm1, %xmm0 ; AVX512-NEXT: retq - %x = fmul <4 x float> %a0, %a1 - %res = fsub <4 x float> %a2, %x + %x = fmul nexc nrnd <4 x float> %a0, %a1 + %res = fsub nexc nrnd <4 x float> %a2, %x ret <4 x float> %res } @@ -316,8 +316,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213ps %ymm2, %ymm1, %ymm0 ; AVX512-NEXT: retq - %x = fmul <8 x float> %a0, %a1 - %res = fsub <8 x float> %a2, %x + %x = fmul nexc nrnd <8 x float> %a0, %a1 + %res = fsub nexc nrnd <8 x float> %a2, %x ret <8 x float> %res } @@ -337,8 +337,8 @@ ; AVX512-NEXT: vfnmadd213sd %xmm2, %xmm0, %xmm1 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul double %a0, %a1 - %res = fsub double %a2, %x + %x = fmul nexc nrnd double %a0, %a1 + %res = fsub nexc nrnd double %a2, %x ret double %res } @@ -357,8 +357,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213pd %xmm2, %xmm1, %xmm0 ; AVX512-NEXT: retq - %x = fmul <2 x double> %a0, %a1 - %res = fsub <2 x double> %a2, %x + %x = fmul nexc nrnd <2 x double> %a0, %a1 + %res = fsub nexc nrnd <2 x double> %a2, %x ret <2 x double> %res } @@ -377,8 +377,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213pd %ymm2, %ymm1, %ymm0 ; AVX512-NEXT: retq - %x = fmul <4 x double> %a0, %a1 - %res = fsub <4 x double> %a2, %x + %x = fmul nexc nrnd <4 x double> %a0, %a1 + %res = fsub nexc nrnd <4 x double> %a2, %x ret <4 x double> %res } @@ -402,9 +402,9 @@ ; AVX512-NEXT: vfnmsub213ss %xmm2, %xmm0, %xmm1 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul float %a0, %a1 - %y = fsub float -0.000000e+00, %x - %res = fsub float %y, %a2 + %x = fmul nexc nrnd float %a0, %a1 + %y = fsub nexc nrnd float -0.000000e+00, %x + %res = fsub nexc nrnd float %y, %a2 ret float %res } @@ -423,9 +423,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213ps %xmm2, %xmm1, %xmm0 ; AVX512-NEXT: retq - %x = fmul <4 x float> %a0, %a1 - %y = fsub <4 x float> , %x - %res = fsub <4 x float> %y, %a2 + %x = fmul nexc nrnd <4 x float> %a0, %a1 + %y = fsub nexc nrnd <4 x float> , %x + %res = fsub nexc nrnd <4 x float> %y, %a2 ret <4 x float> %res } @@ -444,9 +444,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213ps %ymm2, %ymm1, %ymm0 ; AVX512-NEXT: retq - %x = fmul <8 x float> %a0, %a1 - %y = fsub <8 x float> , %x - %res = fsub <8 x float> %y, %a2 + %x = fmul nexc nrnd <8 x float> %a0, %a1 + %y = fsub nexc nrnd <8 x float> , %x + %res = fsub nexc nrnd <8 x float> %y, %a2 ret <8 x float> %res } @@ -466,9 +466,9 @@ ; AVX512-NEXT: vfnmsub213sd %xmm2, %xmm0, %xmm1 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul double %a0, %a1 - %y = fsub double -0.000000e+00, %x - %res = fsub double %y, %a2 + %x = fmul nexc nrnd double %a0, %a1 + %y = fsub nexc nrnd double -0.000000e+00, %x + %res = fsub nexc nrnd double %y, %a2 ret double %res } @@ -487,9 +487,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213pd %xmm2, %xmm1, %xmm0 ; AVX512-NEXT: retq - %x = fmul <2 x double> %a0, %a1 - %y = fsub <2 x double> , %x - %res = fsub <2 x double> %y, %a2 + %x = fmul nexc nrnd <2 x double> %a0, %a1 + %y = fsub nexc nrnd <2 x double> , %x + %res = fsub nexc nrnd <2 x double> %y, %a2 ret <2 x double> %res } @@ -508,9 +508,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213pd %ymm2, %ymm1, %ymm0 ; AVX512-NEXT: retq - %x = fmul <4 x double> %a0, %a1 - %y = fsub <4 x double> , %x - %res = fsub <4 x double> %y, %a2 + %x = fmul nexc nrnd <4 x double> %a0, %a1 + %y = fsub nexc nrnd <4 x double> , %x + %res = fsub nexc nrnd <4 x double> %y, %a2 ret <4 x double> %res } @@ -536,8 +536,8 @@ ; AVX512-NEXT: vmovaps %zmm2, %zmm0 ; AVX512-NEXT: retq %x = load <4 x float>, <4 x float>* %a0 - %y = fmul <4 x float> %x, %a1 - %res = fadd <4 x float> %y, %a2 + %y = fmul nexc nrnd <4 x float> %x, %a1 + %res = fadd nexc nrnd <4 x float> %y, %a2 ret <4 x float> %res } @@ -559,8 +559,8 @@ ; AVX512-NEXT: vmovaps %zmm2, %zmm0 ; AVX512-NEXT: retq %x = load <2 x double>, <2 x double>* %a0 - %y = fmul <2 x double> %x, %a1 - %res = fsub <2 x double> %y, %a2 + %y = fmul nexc nrnd <2 x double> %x, %a1 + %res = fsub nexc nrnd <2 x double> %y, %a2 ret <2 x double> %res } @@ -583,8 +583,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %a = fadd <4 x float> %x, - %m = fmul <4 x float> %a, %y + %a = fadd nexc nrnd <4 x float> %x, + %m = fmul nexc nrnd <4 x float> %a, %y ret <4 x float> %m } @@ -603,8 +603,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %a = fadd <4 x float> %x, - %m = fmul <4 x float> %y, %a + %a = fadd nexc nrnd <4 x float> %x, + %m = fmul nexc nrnd <4 x float> %y, %a ret <4 x float> %m } @@ -623,8 +623,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %a = fadd <4 x float> %x, - %m = fmul <4 x float> %a, %y + %a = fadd nexc nrnd <4 x float> %x, + %m = fmul nexc nrnd <4 x float> %a, %y ret <4 x float> %m } @@ -643,8 +643,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %a = fadd <4 x float> %x, - %m = fmul <4 x float> %y, %a + %a = fadd nexc nrnd <4 x float> %x, + %m = fmul nexc nrnd <4 x float> %y, %a ret <4 x float> %m } @@ -663,8 +663,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %s = fsub <4 x float> , %x - %m = fmul <4 x float> %s, %y + %s = fsub nexc nrnd <4 x float> , %x + %m = fmul nexc nrnd <4 x float> %s, %y ret <4 x float> %m } @@ -683,8 +683,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %s = fsub <4 x float> , %x - %m = fmul <4 x float> %y, %s + %s = fsub nexc nrnd <4 x float> , %x + %m = fmul nexc nrnd <4 x float> %y, %s ret <4 x float> %m } @@ -703,8 +703,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %s = fsub <4 x float> , %x - %m = fmul <4 x float> %s, %y + %s = fsub nexc nrnd <4 x float> , %x + %m = fmul nexc nrnd <4 x float> %s, %y ret <4 x float> %m } @@ -723,8 +723,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %s = fsub <4 x float> , %x - %m = fmul <4 x float> %y, %s + %s = fsub nexc nrnd <4 x float> , %x + %m = fmul nexc nrnd <4 x float> %y, %s ret <4 x float> %m } @@ -743,8 +743,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %s = fsub <4 x float> %x, - %m = fmul <4 x float> %s, %y + %s = fsub nexc nrnd <4 x float> %x, + %m = fmul nexc nrnd <4 x float> %s, %y ret <4 x float> %m } @@ -763,8 +763,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %s = fsub <4 x float> %x, - %m = fmul <4 x float> %y, %s + %s = fsub nexc nrnd <4 x float> %x, + %m = fmul nexc nrnd <4 x float> %y, %s ret <4 x float> %m } @@ -783,8 +783,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %s = fsub <4 x float> %x, - %m = fmul <4 x float> %s, %y + %s = fsub nexc nrnd <4 x float> %x, + %m = fmul nexc nrnd <4 x float> %s, %y ret <4 x float> %m } @@ -803,8 +803,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213ps %xmm1, %xmm1, %xmm0 ; AVX512-NEXT: retq - %s = fsub <4 x float> %x, - %m = fmul <4 x float> %y, %s + %s = fsub nexc nrnd <4 x float> %x, + %m = fmul nexc nrnd <4 x float> %y, %s ret <4 x float> %m } @@ -831,10 +831,10 @@ ; AVX512-NEXT: vfmadd213ss %xmm1, %xmm0, %xmm2 ; AVX512-NEXT: vmovaps %zmm2, %zmm0 ; AVX512-NEXT: retq - %t1 = fsub float 1.0, %t - %tx = fmul float %x, %t - %ty = fmul float %y, %t1 - %r = fadd float %tx, %ty + %t1 = fsub nexc nrnd float 1.0, %t + %tx = fmul nexc nrnd float %x, %t + %ty = fmul nexc nrnd float %y, %t1 + %r = fadd nexc nrnd float %tx, %ty ret float %r } @@ -857,10 +857,10 @@ ; AVX512-NEXT: vfnmadd213ps %xmm1, %xmm1, %xmm3 ; AVX512-NEXT: vfmadd213ps %xmm3, %xmm2, %xmm0 ; AVX512-NEXT: retq - %t1 = fsub <4 x float> , %t - %tx = fmul <4 x float> %x, %t - %ty = fmul <4 x float> %y, %t1 - %r = fadd <4 x float> %tx, %ty + %t1 = fsub nexc nrnd <4 x float> , %t + %tx = fmul nexc nrnd <4 x float> %x, %t + %ty = fmul nexc nrnd <4 x float> %y, %t1 + %r = fadd nexc nrnd <4 x float> %tx, %ty ret <4 x float> %r } @@ -883,10 +883,10 @@ ; AVX512-NEXT: vfnmadd213ps %ymm1, %ymm1, %ymm3 ; AVX512-NEXT: vfmadd213ps %ymm3, %ymm2, %ymm0 ; AVX512-NEXT: retq - %t1 = fsub <8 x float> , %t - %tx = fmul <8 x float> %x, %t - %ty = fmul <8 x float> %y, %t1 - %r = fadd <8 x float> %tx, %ty + %t1 = fsub nexc nrnd <8 x float> , %t + %tx = fmul nexc nrnd <8 x float> %x, %t + %ty = fmul nexc nrnd <8 x float> %y, %t1 + %r = fadd nexc nrnd <8 x float> %tx, %ty ret <8 x float> %r } @@ -909,10 +909,10 @@ ; AVX512-NEXT: vfmadd213sd %xmm1, %xmm0, %xmm2 ; AVX512-NEXT: vmovaps %zmm2, %zmm0 ; AVX512-NEXT: retq - %t1 = fsub double 1.0, %t - %tx = fmul double %x, %t - %ty = fmul double %y, %t1 - %r = fadd double %tx, %ty + %t1 = fsub nexc nrnd double 1.0, %t + %tx = fmul nexc nrnd double %x, %t + %ty = fmul nexc nrnd double %y, %t1 + %r = fadd nexc nrnd double %tx, %ty ret double %r } @@ -935,10 +935,10 @@ ; AVX512-NEXT: vfnmadd213pd %xmm1, %xmm1, %xmm3 ; AVX512-NEXT: vfmadd213pd %xmm3, %xmm2, %xmm0 ; AVX512-NEXT: retq - %t1 = fsub <2 x double> , %t - %tx = fmul <2 x double> %x, %t - %ty = fmul <2 x double> %y, %t1 - %r = fadd <2 x double> %tx, %ty + %t1 = fsub nexc nrnd <2 x double> , %t + %tx = fmul nexc nrnd <2 x double> %x, %t + %ty = fmul nexc nrnd <2 x double> %y, %t1 + %r = fadd nexc nrnd <2 x double> %tx, %ty ret <2 x double> %r } @@ -961,10 +961,10 @@ ; AVX512-NEXT: vfnmadd213pd %ymm1, %ymm1, %ymm3 ; AVX512-NEXT: vfmadd213pd %ymm3, %ymm2, %ymm0 ; AVX512-NEXT: retq - %t1 = fsub <4 x double> , %t - %tx = fmul <4 x double> %x, %t - %ty = fmul <4 x double> %y, %t1 - %r = fadd <4 x double> %tx, %ty + %t1 = fsub nexc nrnd <4 x double> , %t + %tx = fmul nexc nrnd <4 x double> %x, %t + %ty = fmul nexc nrnd <4 x double> %y, %t1 + %r = fadd nexc nrnd <4 x double> %tx, %ty ret <4 x double> %r } @@ -987,9 +987,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213ps %xmm2, %xmm1, %xmm0 ; AVX512-NEXT: retq - %mul = fmul <4 x float> %a0, %a1 - %add = fadd <4 x float> %mul, %a2 - %neg = fsub <4 x float> , %add + %mul = fmul nexc nrnd <4 x float> %a0, %a1 + %add = fadd nexc nrnd <4 x float> %mul, %a2 + %neg = fsub nexc nrnd <4 x float> , %add ret <4 x float> %neg } @@ -1008,9 +1008,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213pd %ymm2, %ymm1, %ymm0 ; AVX512-NEXT: retq - %mul = fmul <4 x double> %a0, %a1 - %sub = fsub <4 x double> %mul, %a2 - %neg = fsub <4 x double> , %sub + %mul = fmul nexc nrnd <4 x double> %a0, %a1 + %sub = fsub nexc nrnd <4 x double> %mul, %a2 + %neg = fsub nexc nrnd <4 x double> , %sub ret <4 x double> %neg } @@ -1029,10 +1029,10 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213ps %xmm2, %xmm1, %xmm0 ; AVX512-NEXT: retq - %mul = fmul <4 x float> %a0, %a1 - %neg0 = fsub <4 x float> , %mul - %add = fadd <4 x float> %neg0, %a2 - %neg1 = fsub <4 x float> , %add + %mul = fmul nexc nrnd <4 x float> %a0, %a1 + %neg0 = fsub nexc nrnd <4 x float> , %mul + %add = fadd nexc nrnd <4 x float> %neg0, %a2 + %neg1 = fsub nexc nrnd <4 x float> , %add ret <4 x float> %neg1 } @@ -1051,10 +1051,10 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213pd %ymm2, %ymm1, %ymm0 ; AVX512-NEXT: retq - %mul = fmul <4 x double> %a0, %a1 - %neg0 = fsub <4 x double> , %mul - %sub = fsub <4 x double> %neg0, %a2 - %neg1 = fsub <4 x double> , %sub + %mul = fmul nexc nrnd <4 x double> %a0, %a1 + %neg0 = fsub nexc nrnd <4 x double> , %mul + %sub = fsub nexc nrnd <4 x double> %neg0, %a2 + %neg1 = fsub nexc nrnd <4 x double> , %sub ret <4 x double> %neg1 } @@ -1077,9 +1077,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vmulps {{.*}}(%rip){1to4}, %xmm0, %xmm0 ; AVX512-NEXT: retq - %m0 = fmul <4 x float> %x, - %m1 = fmul <4 x float> %x, - %a = fadd <4 x float> %m0, %m1 + %m0 = fmul nexc nrnd <4 x float> %x, + %m1 = fmul nexc nrnd <4 x float> %x, + %a = fadd nexc nrnd <4 x float> %m0, %m1 ret <4 x float> %a } @@ -1103,9 +1103,9 @@ ; AVX512-NEXT: vfmadd231ps {{.*}}(%rip), %xmm0, %xmm1 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 ; AVX512-NEXT: retq - %m0 = fmul <4 x float> %x, - %m1 = fmul <4 x float> %m0, - %a = fadd <4 x float> %m1, %y + %m0 = fmul nexc nrnd <4 x float> %x, + %m1 = fmul nexc nrnd <4 x float> %m0, + %a = fadd nexc nrnd <4 x float> %m1, %y ret <4 x float> %a } Index: test/CodeGen/X86/fma_patterns_wide.ll =================================================================== --- test/CodeGen/X86/fma_patterns_wide.ll +++ test/CodeGen/X86/fma_patterns_wide.ll @@ -25,8 +25,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213ps %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul <16 x float> %a0, %a1 - %res = fadd <16 x float> %x, %a2 + %x = fmul nexc nrnd <16 x float> %a0, %a1 + %res = fadd nexc nrnd <16 x float> %x, %a2 ret <16 x float> %res } @@ -47,8 +47,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213pd %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul <8 x double> %a0, %a1 - %res = fadd <8 x double> %x, %a2 + %x = fmul nexc nrnd <8 x double> %a0, %a1 + %res = fadd nexc nrnd <8 x double> %x, %a2 ret <8 x double> %res } @@ -73,8 +73,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213ps %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul <16 x float> %a0, %a1 - %res = fsub <16 x float> %x, %a2 + %x = fmul nexc nrnd <16 x float> %a0, %a1 + %res = fsub nexc nrnd <16 x float> %x, %a2 ret <16 x float> %res } @@ -95,8 +95,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213pd %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul <8 x double> %a0, %a1 - %res = fsub <8 x double> %x, %a2 + %x = fmul nexc nrnd <8 x double> %a0, %a1 + %res = fsub nexc nrnd <8 x double> %x, %a2 ret <8 x double> %res } @@ -121,8 +121,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213ps %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul <16 x float> %a0, %a1 - %res = fsub <16 x float> %a2, %x + %x = fmul nexc nrnd <16 x float> %a0, %a1 + %res = fsub nexc nrnd <16 x float> %a2, %x ret <16 x float> %res } @@ -143,8 +143,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213pd %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul <8 x double> %a0, %a1 - %res = fsub <8 x double> %a2, %x + %x = fmul nexc nrnd <8 x double> %a0, %a1 + %res = fsub nexc nrnd <8 x double> %a2, %x ret <8 x double> %res } @@ -169,9 +169,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213ps %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul <16 x float> %a0, %a1 - %y = fsub <16 x float> , %x - %res = fsub <16 x float> %y, %a2 + %x = fmul nexc nrnd <16 x float> %a0, %a1 + %y = fsub nexc nrnd <16 x float> , %x + %res = fsub nexc nrnd <16 x float> %y, %a2 ret <16 x float> %res } @@ -192,9 +192,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213pd %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %x = fmul <8 x double> %a0, %a1 - %y = fsub <8 x double> , %x - %res = fsub <8 x double> %y, %a2 + %x = fmul nexc nrnd <8 x double> %a0, %a1 + %y = fsub nexc nrnd <8 x double> , %x + %res = fsub nexc nrnd <8 x double> %y, %a2 ret <8 x double> %res } @@ -222,8 +222,8 @@ ; AVX512-NEXT: vmovaps %zmm2, %zmm0 ; AVX512-NEXT: retq %x = load <16 x float>, <16 x float>* %a0 - %y = fmul <16 x float> %x, %a1 - %res = fadd <16 x float> %y, %a2 + %y = fmul nexc nrnd <16 x float> %x, %a1 + %res = fadd nexc nrnd <16 x float> %y, %a2 ret <16 x float> %res } @@ -247,8 +247,8 @@ ; AVX512-NEXT: vmovaps %zmm2, %zmm0 ; AVX512-NEXT: retq %x = load <8 x double>, <8 x double>* %a0 - %y = fmul <8 x double> %x, %a1 - %res = fsub <8 x double> %y, %a2 + %y = fmul nexc nrnd <8 x double> %x, %a1 + %res = fsub nexc nrnd <8 x double> %y, %a2 ret <8 x double> %res } @@ -273,8 +273,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213ps %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %a = fadd <16 x float> %x, - %m = fmul <16 x float> %a, %y + %a = fadd nexc nrnd <16 x float> %x, + %m = fmul nexc nrnd <16 x float> %a, %y ret <16 x float> %m } @@ -295,8 +295,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213pd %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %a = fadd <8 x double> %x, - %m = fmul <8 x double> %y, %a + %a = fadd nexc nrnd <8 x double> %x, + %m = fmul nexc nrnd <8 x double> %y, %a ret <8 x double> %m } @@ -317,8 +317,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213ps %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %a = fadd <16 x float> %x, - %m = fmul <16 x float> %a, %y + %a = fadd nexc nrnd <16 x float> %x, + %m = fmul nexc nrnd <16 x float> %a, %y ret <16 x float> %m } @@ -339,8 +339,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213pd %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %a = fadd <8 x double> %x, - %m = fmul <8 x double> %y, %a + %a = fadd nexc nrnd <8 x double> %x, + %m = fmul nexc nrnd <8 x double> %y, %a ret <8 x double> %m } @@ -361,8 +361,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213ps %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %s = fsub <16 x float> , %x - %m = fmul <16 x float> %s, %y + %s = fsub nexc nrnd <16 x float> , %x + %m = fmul nexc nrnd <16 x float> %s, %y ret <16 x float> %m } @@ -383,8 +383,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213pd %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %s = fsub <8 x double> , %x - %m = fmul <8 x double> %y, %s + %s = fsub nexc nrnd <8 x double> , %x + %m = fmul nexc nrnd <8 x double> %y, %s ret <8 x double> %m } @@ -405,8 +405,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213ps %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %s = fsub <16 x float> , %x - %m = fmul <16 x float> %s, %y + %s = fsub nexc nrnd <16 x float> , %x + %m = fmul nexc nrnd <16 x float> %s, %y ret <16 x float> %m } @@ -427,8 +427,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213pd %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %s = fsub <8 x double> , %x - %m = fmul <8 x double> %y, %s + %s = fsub nexc nrnd <8 x double> , %x + %m = fmul nexc nrnd <8 x double> %y, %s ret <8 x double> %m } @@ -449,8 +449,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213ps %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %s = fsub <16 x float> %x, - %m = fmul <16 x float> %s, %y + %s = fsub nexc nrnd <16 x float> %x, + %m = fmul nexc nrnd <16 x float> %s, %y ret <16 x float> %m } @@ -471,8 +471,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213pd %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %s = fsub <8 x double> %x, - %m = fmul <8 x double> %y, %s + %s = fsub nexc nrnd <8 x double> %x, + %m = fmul nexc nrnd <8 x double> %y, %s ret <8 x double> %m } @@ -493,8 +493,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213ps %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %s = fsub <16 x float> %x, - %m = fmul <16 x float> %s, %y + %s = fsub nexc nrnd <16 x float> %x, + %m = fmul nexc nrnd <16 x float> %s, %y ret <16 x float> %m } @@ -515,8 +515,8 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213pd %zmm1, %zmm1, %zmm0 ; AVX512-NEXT: retq - %s = fsub <8 x double> %x, - %m = fmul <8 x double> %y, %s + %s = fsub nexc nrnd <8 x double> %x, + %m = fmul nexc nrnd <8 x double> %y, %s ret <8 x double> %m } @@ -547,10 +547,10 @@ ; AVX512-NEXT: vfnmadd213ps %zmm1, %zmm1, %zmm3 ; AVX512-NEXT: vfmadd213ps %zmm3, %zmm2, %zmm0 ; AVX512-NEXT: retq - %t1 = fsub <16 x float> , %t - %tx = fmul <16 x float> %x, %t - %ty = fmul <16 x float> %y, %t1 - %r = fadd <16 x float> %tx, %ty + %t1 = fsub nexc nrnd <16 x float> , %t + %tx = fmul nexc nrnd <16 x float> %x, %t + %ty = fmul nexc nrnd <16 x float> %y, %t1 + %r = fadd nexc nrnd <16 x float> %tx, %ty ret <16 x float> %r } @@ -577,10 +577,10 @@ ; AVX512-NEXT: vfnmadd213pd %zmm1, %zmm1, %zmm3 ; AVX512-NEXT: vfmadd213pd %zmm3, %zmm2, %zmm0 ; AVX512-NEXT: retq - %t1 = fsub <8 x double> , %t - %tx = fmul <8 x double> %x, %t - %ty = fmul <8 x double> %y, %t1 - %r = fadd <8 x double> %tx, %ty + %t1 = fsub nexc nrnd <8 x double> , %t + %tx = fmul nexc nrnd <8 x double> %x, %t + %ty = fmul nexc nrnd <8 x double> %y, %t1 + %r = fadd nexc nrnd <8 x double> %tx, %ty ret <8 x double> %r } @@ -605,9 +605,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmsub213ps %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %mul = fmul <16 x float> %a0, %a1 - %add = fadd <16 x float> %mul, %a2 - %neg = fsub <16 x float> , %add + %mul = fmul nexc nrnd <16 x float> %a0, %a1 + %add = fadd nexc nrnd <16 x float> %mul, %a2 + %neg = fsub nexc nrnd <16 x float> , %add ret <16 x float> %neg } @@ -628,9 +628,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfnmadd213pd %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %mul = fmul <8 x double> %a0, %a1 - %sub = fsub <8 x double> %mul, %a2 - %neg = fsub <8 x double> , %sub + %mul = fmul nexc nrnd <8 x double> %a0, %a1 + %sub = fsub nexc nrnd <8 x double> %mul, %a2 + %neg = fsub nexc nrnd <8 x double> , %sub ret <8 x double> %neg } @@ -651,10 +651,10 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmsub213ps %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %mul = fmul <16 x float> %a0, %a1 - %neg0 = fsub <16 x float> , %mul - %add = fadd <16 x float> %neg0, %a2 - %neg1 = fsub <16 x float> , %add + %mul = fmul nexc nrnd <16 x float> %a0, %a1 + %neg0 = fsub nexc nrnd <16 x float> , %mul + %add = fadd nexc nrnd <16 x float> %neg0, %a2 + %neg1 = fsub nexc nrnd <16 x float> , %add ret <16 x float> %neg1 } @@ -675,10 +675,10 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vfmadd213pd %zmm2, %zmm1, %zmm0 ; AVX512-NEXT: retq - %mul = fmul <8 x double> %a0, %a1 - %neg0 = fsub <8 x double> , %mul - %sub = fsub <8 x double> %neg0, %a2 - %neg1 = fsub <8 x double> , %sub + %mul = fmul nexc nrnd <8 x double> %a0, %a1 + %neg0 = fsub nexc nrnd <8 x double> , %mul + %sub = fsub nexc nrnd <8 x double> %neg0, %a2 + %neg1 = fsub nexc nrnd <8 x double> , %sub ret <8 x double> %neg1 } @@ -703,9 +703,9 @@ ; AVX512: # BB#0: ; AVX512-NEXT: vmulps {{.*}}(%rip), %zmm0, %zmm0 ; AVX512-NEXT: retq - %m0 = fmul <16 x float> %x, - %m1 = fmul <16 x float> %x, - %a = fadd <16 x float> %m0, %m1 + %m0 = fmul nexc nrnd <16 x float> %x, + %m1 = fmul nexc nrnd <16 x float> %x, + %a = fadd nexc nrnd <16 x float> %m0, %m1 ret <16 x float> %a } @@ -731,9 +731,9 @@ ; AVX512-NEXT: vfmadd231ps {{.*}}(%rip), %zmm0, %zmm1 ; AVX512-NEXT: vmovaps %zmm1, %zmm0 ; AVX512-NEXT: retq - %m0 = fmul <16 x float> %x, - %m1 = fmul <16 x float> %m0, - %a = fadd <16 x float> %m1, %y + %m0 = fmul nexc nrnd <16 x float> %x, + %m1 = fmul nexc nrnd <16 x float> %m0, + %a = fadd nexc nrnd <16 x float> %m1, %y ret <16 x float> %a } Index: test/CodeGen/X86/fmul-combines.ll =================================================================== --- test/CodeGen/X86/fmul-combines.ll +++ test/CodeGen/X86/fmul-combines.ll @@ -3,17 +3,17 @@ ; CHECK-LABEL: fmul2_f32: ; CHECK: addss %xmm0, %xmm0 define float @fmul2_f32(float %x) { - %y = fmul float %x, 2.0 + %y = fmul nexc nrnd float %x, 2.0 ret float %y } -; fmul 2.0, x -> fadd x, x for vectors. +; fmul 2.0, x -> fadd nexc nrnd x, x for vectors. ; CHECK-LABEL: fmul2_v4f32: ; CHECK: addps %xmm0, %xmm0 ; CHECK-NEXT: retq define <4 x float> @fmul2_v4f32(<4 x float> %x) { - %y = fmul <4 x float> %x, + %y = fmul nexc nrnd <4 x float> %x, ret <4 x float> %y } @@ -21,7 +21,7 @@ ; CHECK: movaps ; CHECK-NEXT: ret define <4 x float> @constant_fold_fmul_v4f32(<4 x float> %x) { - %y = fmul <4 x float> , + %y = fmul nexc nrnd <4 x float> , ret <4 x float> %y } @@ -29,7 +29,7 @@ ; CHECK: xorps %xmm0, %xmm0 ; CHECK-NEXT: retq define <4 x float> @fmul0_v4f32(<4 x float> %x) #0 { - %y = fmul <4 x float> %x, + %y = fmul nexc nrnd <4 x float> %x, ret <4 x float> %y } @@ -39,8 +39,8 @@ ; CHECK-NOT: mulps ; CHECK-NEXT: ret define <4 x float> @fmul_c2_c4_v4f32(<4 x float> %x) #0 { - %y = fmul <4 x float> %x, - %z = fmul <4 x float> %y, + %y = fmul nexc nrnd <4 x float> %x, + %z = fmul nexc nrnd <4 x float> %y, ret <4 x float> %z } @@ -50,8 +50,8 @@ ; CHECK-NOT: mulps ; CHECK-NEXT: ret define <4 x float> @fmul_c3_c4_v4f32(<4 x float> %x) #0 { - %y = fmul <4 x float> %x, - %z = fmul <4 x float> %y, + %y = fmul nexc nrnd <4 x float> %x, + %z = fmul nexc nrnd <4 x float> %y, ret <4 x float> %z } @@ -65,8 +65,8 @@ ; CHECK-NOT: mulps ; CHECK-NEXT: ret define <4 x float> @fmul_v4f32_two_consts_no_splat(<4 x float> %x) #0 { - %y = fmul <4 x float> %x, - %z = fmul <4 x float> %y, + %y = fmul nexc nrnd <4 x float> %x, + %z = fmul nexc nrnd <4 x float> %y, ret <4 x float> %z } @@ -80,8 +80,8 @@ ; CHECK-NOT: mulps ; CHECK-NEXT: ret define <4 x float> @fmul_v4f32_two_consts_no_splat_non_canonical(<4 x float> %x) #0 { - %y = fmul <4 x float> , %x - %z = fmul <4 x float> , %y + %y = fmul nexc nrnd <4 x float> , %x + %z = fmul nexc nrnd <4 x float> , %y ret <4 x float> %z } @@ -95,9 +95,9 @@ ; CHECK: mulps ; CHECK: ret define <4 x float> @fmul_v4f32_two_consts_no_splat_multiple_use(<4 x float> %x) #0 { - %y = fmul <4 x float> %x, - %z = fmul <4 x float> %y, - %a = fadd <4 x float> %y, %z + %y = fmul nexc nrnd <4 x float> %x, + %z = fmul nexc nrnd <4 x float> %y, + %a = fadd nexc nrnd <4 x float> %y, %z ret <4 x float> %a } @@ -105,9 +105,9 @@ ; Make sure that we don't infinite loop swapping constants back and forth. define <4 x float> @PR22698_splats(<4 x float> %a) #0 { - %mul1 = fmul fast <4 x float> , - %mul2 = fmul fast <4 x float> , %mul1 - %mul3 = fmul fast <4 x float> %a, %mul2 + %mul1 = fmul nexc nrnd fast <4 x float> , + %mul2 = fmul nexc nrnd fast <4 x float> , %mul1 + %mul3 = fmul nexc nrnd fast <4 x float> %a, %mul2 ret <4 x float> %mul3 ; CHECK: float 2.400000e+01 @@ -121,9 +121,9 @@ ; Same as above, but verify that non-splat vectors are handled correctly too. define <4 x float> @PR22698_no_splats(<4 x float> %a) #0 { - %mul1 = fmul fast <4 x float> , - %mul2 = fmul fast <4 x float> , %mul1 - %mul3 = fmul fast <4 x float> %a, %mul2 + %mul1 = fmul nexc nrnd fast <4 x float> , + %mul2 = fmul nexc nrnd fast <4 x float> , %mul1 + %mul3 = fmul nexc nrnd fast <4 x float> %a, %mul2 ret <4 x float> %mul3 ; CHECK: float 4.500000e+01 @@ -141,8 +141,8 @@ ; CHECK-NOT: mulss ; CHECK-NEXT: ret define float @fmul_c2_c4_f32(float %x) #0 { - %y = fmul float %x, 2.0 - %z = fmul float %y, 4.0 + %y = fmul nexc nrnd float %x, 2.0 + %z = fmul nexc nrnd float %y, 4.0 ret float %z } @@ -152,8 +152,8 @@ ; CHECK-NOT: mulss ; CHECK-NET: ret define float @fmul_c3_c4_f32(float %x) #0 { - %y = fmul float %x, 3.0 - %z = fmul float %y, 4.0 + %y = fmul nexc nrnd float %x, 3.0 + %z = fmul nexc nrnd float %y, 4.0 ret float %z } @@ -161,18 +161,18 @@ ; CHECK: mulss %xmm1, %xmm0 ; CHECK-NEXT: retq define float @fmul_fneg_fneg_f32(float %x, float %y) { - %x.neg = fsub float -0.0, %x - %y.neg = fsub float -0.0, %y - %mul = fmul float %x.neg, %y.neg + %x.neg = fsub nexc nrnd float -0.0, %x + %y.neg = fsub nexc nrnd float -0.0, %y + %mul = fmul nexc nrnd float %x.neg, %y.neg ret float %mul } ; CHECK-LABEL: fmul_fneg_fneg_v4f32: ; CHECK: mulps {{%xmm1|\(%rdx\)}}, %xmm0 ; CHECK-NEXT: retq define <4 x float> @fmul_fneg_fneg_v4f32(<4 x float> %x, <4 x float> %y) { - %x.neg = fsub <4 x float> , %x - %y.neg = fsub <4 x float> , %y - %mul = fmul <4 x float> %x.neg, %y.neg + %x.neg = fsub nexc nrnd <4 x float> , %x + %y.neg = fsub nexc nrnd <4 x float> , %y + %mul = fmul nexc nrnd <4 x float> %x.neg, %y.neg ret <4 x float> %mul } Index: test/CodeGen/X86/fmul-zero.ll =================================================================== --- test/CodeGen/X86/fmul-zero.ll +++ test/CodeGen/X86/fmul-zero.ll @@ -3,7 +3,7 @@ define void @test14(<4 x float>*) nounwind { load <4 x float>, <4 x float>* %0, align 1 - fmul <4 x float> %2, zeroinitializer + fmul nexc nrnd <4 x float> %2, zeroinitializer store <4 x float> %3, <4 x float>* %0, align 1 ret void } Index: test/CodeGen/X86/fold-load-binops.ll =================================================================== --- test/CodeGen/X86/fold-load-binops.ll +++ test/CodeGen/X86/fold-load-binops.ll @@ -18,7 +18,7 @@ ; AVX-NEXT: retq %a = extractelement <4 x float> %va, i32 0 %b = load float, float* %pb - %r = fadd float %a, %b + %r = fadd nexc nrnd float %a, %b %vr = insertelement <4 x float> %va, float %r, i32 0 ret <4 x float> %vr } @@ -35,7 +35,7 @@ ; AVX-NEXT: retq %a = extractelement <2 x double> %va, i32 0 %b = load double, double* %pb - %r = fadd double %a, %b + %r = fadd nexc nrnd double %a, %b %vr = insertelement <2 x double> %va, double %r, i32 0 ret <2 x double> %vr } @@ -52,7 +52,7 @@ ; AVX-NEXT: retq %a = extractelement <4 x float> %va, i32 0 %b = load float, float* %pb - %r = fsub float %a, %b + %r = fsub nexc nrnd float %a, %b %vr = insertelement <4 x float> %va, float %r, i32 0 ret <4 x float> %vr } @@ -69,7 +69,7 @@ ; AVX-NEXT: retq %a = extractelement <2 x double> %va, i32 0 %b = load double, double* %pb - %r = fsub double %a, %b + %r = fsub nexc nrnd double %a, %b %vr = insertelement <2 x double> %va, double %r, i32 0 ret <2 x double> %vr } @@ -86,7 +86,7 @@ ; AVX-NEXT: retq %a = extractelement <4 x float> %va, i32 0 %b = load float, float* %pb - %r = fmul float %a, %b + %r = fmul nexc nrnd float %a, %b %vr = insertelement <4 x float> %va, float %r, i32 0 ret <4 x float> %vr } @@ -103,7 +103,7 @@ ; AVX-NEXT: retq %a = extractelement <2 x double> %va, i32 0 %b = load double, double* %pb - %r = fmul double %a, %b + %r = fmul nexc nrnd double %a, %b %vr = insertelement <2 x double> %va, double %r, i32 0 ret <2 x double> %vr } @@ -120,7 +120,7 @@ ; AVX-NEXT: retq %a = extractelement <4 x float> %va, i32 0 %b = load float, float* %pb - %r = fdiv float %a, %b + %r = fdiv nexc nrnd float %a, %b %vr = insertelement <4 x float> %va, float %r, i32 0 ret <4 x float> %vr } @@ -137,7 +137,7 @@ ; AVX-NEXT: retq %a = extractelement <2 x double> %va, i32 0 %b = load double, double* %pb - %r = fdiv double %a, %b + %r = fdiv nexc nrnd double %a, %b %vr = insertelement <2 x double> %va, double %r, i32 0 ret <2 x double> %vr } Index: test/CodeGen/X86/fold-xmm-zero.ll =================================================================== --- test/CodeGen/X86/fold-xmm-zero.ll +++ test/CodeGen/X86/fold-xmm-zero.ll @@ -18,7 +18,7 @@ %asmresult12 = extractvalue %0 %0, 5 %asmresult13 = extractvalue %0 %0, 6 %asmresult14 = extractvalue %0 %0, 7 - %div = fdiv float %asmresult, 0.000000e+00 + %div = fdiv nexc nrnd float %asmresult, 0.000000e+00 %1 = tail call %0 asm sideeffect "bar", "={xmm0},={xmm1},={xmm2},={xmm3},={xmm4},={xmm5},={xmm6},={xmm7},0,1,2,3,4,5,6,7,~{dirflag},~{fpsr},~{flags}"(float %div, float %asmresult8, float %asmresult9, float %asmresult10, float %asmresult11, float %asmresult12, float %asmresult13, float %asmresult14) nounwind %asmresult24 = extractvalue %0 %1, 0 %asmresult25 = extractvalue %0 %1, 1 @@ -28,7 +28,7 @@ %asmresult29 = extractvalue %0 %1, 5 %asmresult30 = extractvalue %0 %1, 6 %asmresult31 = extractvalue %0 %1, 7 - %div33 = fdiv float %asmresult24, 0.000000e+00 + %div33 = fdiv nexc nrnd float %asmresult24, 0.000000e+00 %2 = tail call %0 asm sideeffect "baz", "={xmm0},={xmm1},={xmm2},={xmm3},={xmm4},={xmm5},={xmm6},={xmm7},0,1,2,3,4,5,6,7,~{dirflag},~{fpsr},~{flags}"(float %div33, float %asmresult25, float %asmresult26, float %asmresult27, float %asmresult28, float %asmresult29, float %asmresult30, float %asmresult31) nounwind ret void } Index: test/CodeGen/X86/fp-fast.ll =================================================================== --- test/CodeGen/X86/fp-fast.ll +++ test/CodeGen/X86/fp-fast.ll @@ -6,8 +6,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: vmulss {{.*}}(%rip), %xmm0, %xmm0 ; CHECK-NEXT: retq - %t1 = fadd float %a, %a - %r = fadd float %t1, %t1 + %t1 = fadd nexc nrnd float %a, %a + %r = fadd nexc nrnd float %t1, %t1 ret float %r } @@ -16,9 +16,9 @@ ; CHECK: # BB#0: ; CHECK-NEXT: vmulss {{.*}}(%rip), %xmm0, %xmm0 ; CHECK-NEXT: retq - %t1 = fmul float 4.0, %a - %t2 = fadd float %a, %a - %r = fadd float %t1, %t2 + %t1 = fmul nexc nrnd float 4.0, %a + %t2 = fadd nexc nrnd float %a, %a + %r = fadd nexc nrnd float %t1, %t2 ret float %r } @@ -27,9 +27,9 @@ ; CHECK: # BB#0: ; CHECK-NEXT: vmulss {{.*}}(%rip), %xmm0, %xmm0 ; CHECK-NEXT: retq - %t1 = fmul float %a, 4.0 - %t2 = fadd float %a, %a - %r = fadd float %t1, %t2 + %t1 = fmul nexc nrnd float %a, 4.0 + %t2 = fadd nexc nrnd float %a, %a + %r = fadd nexc nrnd float %t1, %t2 ret float %r } @@ -38,9 +38,9 @@ ; CHECK: # BB#0: ; CHECK-NEXT: vmulss {{.*}}(%rip), %xmm0, %xmm0 ; CHECK-NEXT: retq - %t1 = fadd float %a, %a - %t2 = fmul float 4.0, %a - %r = fadd float %t1, %t2 + %t1 = fadd nexc nrnd float %a, %a + %t2 = fmul nexc nrnd float 4.0, %a + %r = fadd nexc nrnd float %t1, %t2 ret float %r } @@ -49,9 +49,9 @@ ; CHECK: # BB#0: ; CHECK-NEXT: vmulss {{.*}}(%rip), %xmm0, %xmm0 ; CHECK-NEXT: retq - %t1 = fadd float %a, %a - %t2 = fmul float %a, 4.0 - %r = fadd float %t1, %t2 + %t1 = fadd nexc nrnd float %a, %a + %t2 = fmul nexc nrnd float %a, 4.0 + %r = fadd nexc nrnd float %t1, %t2 ret float %r } @@ -60,9 +60,9 @@ ; CHECK: # BB#0: ; CHECK-NEXT: vxorps %xmm0, %xmm0, %xmm0 ; CHECK-NEXT: retq - %t1 = fmul float 2.0, %a - %t2 = fadd float %a, %a - %r = fsub float %t1, %t2 + %t1 = fmul nexc nrnd float 2.0, %a + %t2 = fadd nexc nrnd float %a, %a + %r = fsub nexc nrnd float %t1, %t2 ret float %r } @@ -71,9 +71,9 @@ ; CHECK: # BB#0: ; CHECK-NEXT: vxorps %xmm0, %xmm0, %xmm0 ; CHECK-NEXT: retq - %t1 = fmul float %a, 2.0 - %t2 = fadd float %a, %a - %r = fsub float %t1, %t2 + %t1 = fmul nexc nrnd float %a, 2.0 + %t2 = fadd nexc nrnd float %a, %a + %r = fsub nexc nrnd float %t1, %t2 ret float %r } @@ -81,8 +81,8 @@ ; CHECK-LABEL: test8: ; CHECK: # BB#0: ; CHECK-NEXT: retq - %t1 = fmul float %a, 0.0 - %t2 = fadd float %a, %t1 + %t1 = fmul nexc nrnd float %a, 0.0 + %t2 = fadd nexc nrnd float %a, %t1 ret float %t2 } @@ -90,8 +90,8 @@ ; CHECK-LABEL: test9: ; CHECK: # BB#0: ; CHECK-NEXT: retq - %t1 = fmul float 0.0, %a - %t2 = fadd float %t1, %a + %t1 = fmul nexc nrnd float 0.0, %a + %t2 = fadd nexc nrnd float %t1, %a ret float %t2 } @@ -100,8 +100,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: vxorps %xmm0, %xmm0, %xmm0 ; CHECK-NEXT: retq - %t1 = fsub float -0.0, %a - %t2 = fadd float %a, %t1 + %t1 = fsub nexc nrnd float -0.0, %a + %t2 = fadd nexc nrnd float %a, %t1 ret float %t2 } @@ -110,8 +110,8 @@ ; CHECK: # BB#0: ; CHECK-NEXT: vxorps %xmm0, %xmm0, %xmm0 ; CHECK-NEXT: retq - %t1 = fsub float -0.0, %a - %t2 = fadd float %a, %t1 + %t1 = fsub nexc nrnd float -0.0, %a + %t2 = fadd nexc nrnd float %a, %t1 ret float %t2 } Index: test/CodeGen/X86/fp_constant_op.ll =================================================================== --- test/CodeGen/X86/fp_constant_op.ll +++ test/CodeGen/X86/fp_constant_op.ll @@ -3,42 +3,42 @@ define double @foo_add(double %P) { - %tmp.1 = fadd double %P, 1.230000e+02 ; [#uses=1] + %tmp.1 = fadd nexc nrnd double %P, 1.230000e+02 ; [#uses=1] ret double %tmp.1 } ; CHECK-LABEL: foo_add: ; CHECK: fadd dword ptr define double @foo_mul(double %P) { - %tmp.1 = fmul double %P, 1.230000e+02 ; [#uses=1] + %tmp.1 = fmul nexc nrnd double %P, 1.230000e+02 ; [#uses=1] ret double %tmp.1 } ; CHECK-LABEL: foo_mul: ; CHECK: fmul dword ptr define double @foo_sub(double %P) { - %tmp.1 = fsub double %P, 1.230000e+02 ; [#uses=1] + %tmp.1 = fsub nexc nrnd double %P, 1.230000e+02 ; [#uses=1] ret double %tmp.1 } ; CHECK-LABEL: foo_sub: ; CHECK: fadd dword ptr define double @foo_subr(double %P) { - %tmp.1 = fsub double 1.230000e+02, %P ; [#uses=1] + %tmp.1 = fsub nexc nrnd double 1.230000e+02, %P ; [#uses=1] ret double %tmp.1 } ; CHECK-LABEL: foo_subr: ; CHECK: fsub qword ptr define double @foo_div(double %P) { - %tmp.1 = fdiv double %P, 1.230000e+02 ; [#uses=1] + %tmp.1 = fdiv nexc nrnd double %P, 1.230000e+02 ; [#uses=1] ret double %tmp.1 } ; CHECK-LABEL: foo_div: ; CHECK: fdiv dword ptr define double @foo_divr(double %P) { - %tmp.1 = fdiv double 1.230000e+02, %P ; [#uses=1] + %tmp.1 = fdiv nexc nrnd double 1.230000e+02, %P ; [#uses=1] ret double %tmp.1 } ; CHECK-LABEL: foo_divr: Index: test/CodeGen/X86/haddsub-2.ll =================================================================== --- test/CodeGen/X86/haddsub-2.ll +++ test/CodeGen/X86/haddsub-2.ll @@ -8,19 +8,19 @@ define <4 x float> @hadd_ps_test1(<4 x float> %A, <4 x float> %B) { %vecext = extractelement <4 x float> %A, i32 0 %vecext1 = extractelement <4 x float> %A, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %add, i32 0 %vecext2 = extractelement <4 x float> %A, i32 2 %vecext3 = extractelement <4 x float> %A, i32 3 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 1 %vecext6 = extractelement <4 x float> %B, i32 0 %vecext7 = extractelement <4 x float> %B, i32 1 - %add8 = fadd float %vecext6, %vecext7 + %add8 = fadd nexc nrnd float %vecext6, %vecext7 %vecinit9 = insertelement <4 x float> %vecinit5, float %add8, i32 2 %vecext10 = extractelement <4 x float> %B, i32 2 %vecext11 = extractelement <4 x float> %B, i32 3 - %add12 = fadd float %vecext10, %vecext11 + %add12 = fadd nexc nrnd float %vecext10, %vecext11 %vecinit13 = insertelement <4 x float> %vecinit9, float %add12, i32 3 ret <4 x float> %vecinit13 } @@ -32,19 +32,19 @@ define <4 x float> @hadd_ps_test2(<4 x float> %A, <4 x float> %B) { %vecext = extractelement <4 x float> %A, i32 2 %vecext1 = extractelement <4 x float> %A, i32 3 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %add, i32 1 %vecext2 = extractelement <4 x float> %A, i32 0 %vecext3 = extractelement <4 x float> %A, i32 1 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 0 %vecext6 = extractelement <4 x float> %B, i32 2 %vecext7 = extractelement <4 x float> %B, i32 3 - %add8 = fadd float %vecext6, %vecext7 + %add8 = fadd nexc nrnd float %vecext6, %vecext7 %vecinit9 = insertelement <4 x float> %vecinit5, float %add8, i32 3 %vecext10 = extractelement <4 x float> %B, i32 0 %vecext11 = extractelement <4 x float> %B, i32 1 - %add12 = fadd float %vecext10, %vecext11 + %add12 = fadd nexc nrnd float %vecext10, %vecext11 %vecinit13 = insertelement <4 x float> %vecinit9, float %add12, i32 2 ret <4 x float> %vecinit13 } @@ -56,19 +56,19 @@ define <4 x float> @hsub_ps_test1(<4 x float> %A, <4 x float> %B) { %vecext = extractelement <4 x float> %A, i32 0 %vecext1 = extractelement <4 x float> %A, i32 1 - %sub = fsub float %vecext, %vecext1 + %sub = fsub nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %sub, i32 0 %vecext2 = extractelement <4 x float> %A, i32 2 %vecext3 = extractelement <4 x float> %A, i32 3 - %sub4 = fsub float %vecext2, %vecext3 + %sub4 = fsub nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <4 x float> %vecinit, float %sub4, i32 1 %vecext6 = extractelement <4 x float> %B, i32 0 %vecext7 = extractelement <4 x float> %B, i32 1 - %sub8 = fsub float %vecext6, %vecext7 + %sub8 = fsub nexc nrnd float %vecext6, %vecext7 %vecinit9 = insertelement <4 x float> %vecinit5, float %sub8, i32 2 %vecext10 = extractelement <4 x float> %B, i32 2 %vecext11 = extractelement <4 x float> %B, i32 3 - %sub12 = fsub float %vecext10, %vecext11 + %sub12 = fsub nexc nrnd float %vecext10, %vecext11 %vecinit13 = insertelement <4 x float> %vecinit9, float %sub12, i32 3 ret <4 x float> %vecinit13 } @@ -80,19 +80,19 @@ define <4 x float> @hsub_ps_test2(<4 x float> %A, <4 x float> %B) { %vecext = extractelement <4 x float> %A, i32 2 %vecext1 = extractelement <4 x float> %A, i32 3 - %sub = fsub float %vecext, %vecext1 + %sub = fsub nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %sub, i32 1 %vecext2 = extractelement <4 x float> %A, i32 0 %vecext3 = extractelement <4 x float> %A, i32 1 - %sub4 = fsub float %vecext2, %vecext3 + %sub4 = fsub nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <4 x float> %vecinit, float %sub4, i32 0 %vecext6 = extractelement <4 x float> %B, i32 2 %vecext7 = extractelement <4 x float> %B, i32 3 - %sub8 = fsub float %vecext6, %vecext7 + %sub8 = fsub nexc nrnd float %vecext6, %vecext7 %vecinit9 = insertelement <4 x float> %vecinit5, float %sub8, i32 3 %vecext10 = extractelement <4 x float> %B, i32 0 %vecext11 = extractelement <4 x float> %B, i32 1 - %sub12 = fsub float %vecext10, %vecext11 + %sub12 = fsub nexc nrnd float %vecext10, %vecext11 %vecinit13 = insertelement <4 x float> %vecinit9, float %sub12, i32 2 ret <4 x float> %vecinit13 } @@ -212,11 +212,11 @@ define <2 x double> @hadd_pd_test1(<2 x double> %A, <2 x double> %B) { %vecext = extractelement <2 x double> %A, i32 0 %vecext1 = extractelement <2 x double> %A, i32 1 - %add = fadd double %vecext, %vecext1 + %add = fadd nexc nrnd double %vecext, %vecext1 %vecinit = insertelement <2 x double> undef, double %add, i32 0 %vecext2 = extractelement <2 x double> %B, i32 0 %vecext3 = extractelement <2 x double> %B, i32 1 - %add2 = fadd double %vecext2, %vecext3 + %add2 = fadd nexc nrnd double %vecext2, %vecext3 %vecinit2 = insertelement <2 x double> %vecinit, double %add2, i32 1 ret <2 x double> %vecinit2 } @@ -228,11 +228,11 @@ define <2 x double> @hadd_pd_test2(<2 x double> %A, <2 x double> %B) { %vecext = extractelement <2 x double> %A, i32 1 %vecext1 = extractelement <2 x double> %A, i32 0 - %add = fadd double %vecext, %vecext1 + %add = fadd nexc nrnd double %vecext, %vecext1 %vecinit = insertelement <2 x double> undef, double %add, i32 0 %vecext2 = extractelement <2 x double> %B, i32 1 %vecext3 = extractelement <2 x double> %B, i32 0 - %add2 = fadd double %vecext2, %vecext3 + %add2 = fadd nexc nrnd double %vecext2, %vecext3 %vecinit2 = insertelement <2 x double> %vecinit, double %add2, i32 1 ret <2 x double> %vecinit2 } @@ -244,11 +244,11 @@ define <2 x double> @hsub_pd_test1(<2 x double> %A, <2 x double> %B) { %vecext = extractelement <2 x double> %A, i32 0 %vecext1 = extractelement <2 x double> %A, i32 1 - %sub = fsub double %vecext, %vecext1 + %sub = fsub nexc nrnd double %vecext, %vecext1 %vecinit = insertelement <2 x double> undef, double %sub, i32 0 %vecext2 = extractelement <2 x double> %B, i32 0 %vecext3 = extractelement <2 x double> %B, i32 1 - %sub2 = fsub double %vecext2, %vecext3 + %sub2 = fsub nexc nrnd double %vecext2, %vecext3 %vecinit2 = insertelement <2 x double> %vecinit, double %sub2, i32 1 ret <2 x double> %vecinit2 } @@ -260,11 +260,11 @@ define <2 x double> @hsub_pd_test2(<2 x double> %A, <2 x double> %B) { %vecext = extractelement <2 x double> %B, i32 0 %vecext1 = extractelement <2 x double> %B, i32 1 - %sub = fsub double %vecext, %vecext1 + %sub = fsub nexc nrnd double %vecext, %vecext1 %vecinit = insertelement <2 x double> undef, double %sub, i32 1 %vecext2 = extractelement <2 x double> %A, i32 0 %vecext3 = extractelement <2 x double> %A, i32 1 - %sub2 = fsub double %vecext2, %vecext3 + %sub2 = fsub nexc nrnd double %vecext2, %vecext3 %vecinit2 = insertelement <2 x double> %vecinit, double %sub2, i32 0 ret <2 x double> %vecinit2 } @@ -276,19 +276,19 @@ define <4 x double> @avx_vhadd_pd_test(<4 x double> %A, <4 x double> %B) { %vecext = extractelement <4 x double> %A, i32 0 %vecext1 = extractelement <4 x double> %A, i32 1 - %add = fadd double %vecext, %vecext1 + %add = fadd nexc nrnd double %vecext, %vecext1 %vecinit = insertelement <4 x double> undef, double %add, i32 0 %vecext2 = extractelement <4 x double> %A, i32 2 %vecext3 = extractelement <4 x double> %A, i32 3 - %add4 = fadd double %vecext2, %vecext3 + %add4 = fadd nexc nrnd double %vecext2, %vecext3 %vecinit5 = insertelement <4 x double> %vecinit, double %add4, i32 1 %vecext6 = extractelement <4 x double> %B, i32 0 %vecext7 = extractelement <4 x double> %B, i32 1 - %add8 = fadd double %vecext6, %vecext7 + %add8 = fadd nexc nrnd double %vecext6, %vecext7 %vecinit9 = insertelement <4 x double> %vecinit5, double %add8, i32 2 %vecext10 = extractelement <4 x double> %B, i32 2 %vecext11 = extractelement <4 x double> %B, i32 3 - %add12 = fadd double %vecext10, %vecext11 + %add12 = fadd nexc nrnd double %vecext10, %vecext11 %vecinit13 = insertelement <4 x double> %vecinit9, double %add12, i32 3 ret <4 x double> %vecinit13 } @@ -307,19 +307,19 @@ define <4 x double> @avx_vhsub_pd_test(<4 x double> %A, <4 x double> %B) { %vecext = extractelement <4 x double> %A, i32 0 %vecext1 = extractelement <4 x double> %A, i32 1 - %sub = fsub double %vecext, %vecext1 + %sub = fsub nexc nrnd double %vecext, %vecext1 %vecinit = insertelement <4 x double> undef, double %sub, i32 0 %vecext2 = extractelement <4 x double> %A, i32 2 %vecext3 = extractelement <4 x double> %A, i32 3 - %sub4 = fsub double %vecext2, %vecext3 + %sub4 = fsub nexc nrnd double %vecext2, %vecext3 %vecinit5 = insertelement <4 x double> %vecinit, double %sub4, i32 1 %vecext6 = extractelement <4 x double> %B, i32 0 %vecext7 = extractelement <4 x double> %B, i32 1 - %sub8 = fsub double %vecext6, %vecext7 + %sub8 = fsub nexc nrnd double %vecext6, %vecext7 %vecinit9 = insertelement <4 x double> %vecinit5, double %sub8, i32 2 %vecext10 = extractelement <4 x double> %B, i32 2 %vecext11 = extractelement <4 x double> %B, i32 3 - %sub12 = fsub double %vecext10, %vecext11 + %sub12 = fsub nexc nrnd double %vecext10, %vecext11 %vecinit13 = insertelement <4 x double> %vecinit9, double %sub12, i32 3 ret <4 x double> %vecinit13 } @@ -487,19 +487,19 @@ define <4 x float> @not_a_hsub_2(<4 x float> %A, <4 x float> %B) { %vecext = extractelement <4 x float> %A, i32 2 %vecext1 = extractelement <4 x float> %A, i32 3 - %sub = fsub float %vecext, %vecext1 + %sub = fsub nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %sub, i32 1 %vecext2 = extractelement <4 x float> %A, i32 0 %vecext3 = extractelement <4 x float> %A, i32 1 - %sub4 = fsub float %vecext2, %vecext3 + %sub4 = fsub nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <4 x float> %vecinit, float %sub4, i32 0 %vecext6 = extractelement <4 x float> %B, i32 3 %vecext7 = extractelement <4 x float> %B, i32 2 - %sub8 = fsub float %vecext6, %vecext7 + %sub8 = fsub nexc nrnd float %vecext6, %vecext7 %vecinit9 = insertelement <4 x float> %vecinit5, float %sub8, i32 3 %vecext10 = extractelement <4 x float> %B, i32 0 %vecext11 = extractelement <4 x float> %B, i32 1 - %sub12 = fsub float %vecext10, %vecext11 + %sub12 = fsub nexc nrnd float %vecext10, %vecext11 %vecinit13 = insertelement <4 x float> %vecinit9, float %sub12, i32 2 ret <4 x float> %vecinit13 } @@ -511,11 +511,11 @@ define <2 x double> @not_a_hsub_3(<2 x double> %A, <2 x double> %B) { %vecext = extractelement <2 x double> %B, i32 0 %vecext1 = extractelement <2 x double> %B, i32 1 - %sub = fsub double %vecext, %vecext1 + %sub = fsub nexc nrnd double %vecext, %vecext1 %vecinit = insertelement <2 x double> undef, double %sub, i32 1 %vecext2 = extractelement <2 x double> %A, i32 1 %vecext3 = extractelement <2 x double> %A, i32 0 - %sub2 = fsub double %vecext2, %vecext3 + %sub2 = fsub nexc nrnd double %vecext2, %vecext3 %vecinit2 = insertelement <2 x double> %vecinit, double %sub2, i32 0 ret <2 x double> %vecinit2 } @@ -530,35 +530,35 @@ define <8 x float> @avx_vhadd_ps(<8 x float> %a, <8 x float> %b) { %vecext = extractelement <8 x float> %a, i32 0 %vecext1 = extractelement <8 x float> %a, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <8 x float> undef, float %add, i32 0 %vecext2 = extractelement <8 x float> %a, i32 2 %vecext3 = extractelement <8 x float> %a, i32 3 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <8 x float> %vecinit, float %add4, i32 1 %vecext6 = extractelement <8 x float> %b, i32 0 %vecext7 = extractelement <8 x float> %b, i32 1 - %add8 = fadd float %vecext6, %vecext7 + %add8 = fadd nexc nrnd float %vecext6, %vecext7 %vecinit9 = insertelement <8 x float> %vecinit5, float %add8, i32 2 %vecext10 = extractelement <8 x float> %b, i32 2 %vecext11 = extractelement <8 x float> %b, i32 3 - %add12 = fadd float %vecext10, %vecext11 + %add12 = fadd nexc nrnd float %vecext10, %vecext11 %vecinit13 = insertelement <8 x float> %vecinit9, float %add12, i32 3 %vecext14 = extractelement <8 x float> %a, i32 4 %vecext15 = extractelement <8 x float> %a, i32 5 - %add16 = fadd float %vecext14, %vecext15 + %add16 = fadd nexc nrnd float %vecext14, %vecext15 %vecinit17 = insertelement <8 x float> %vecinit13, float %add16, i32 4 %vecext18 = extractelement <8 x float> %a, i32 6 %vecext19 = extractelement <8 x float> %a, i32 7 - %add20 = fadd float %vecext18, %vecext19 + %add20 = fadd nexc nrnd float %vecext18, %vecext19 %vecinit21 = insertelement <8 x float> %vecinit17, float %add20, i32 5 %vecext22 = extractelement <8 x float> %b, i32 4 %vecext23 = extractelement <8 x float> %b, i32 5 - %add24 = fadd float %vecext22, %vecext23 + %add24 = fadd nexc nrnd float %vecext22, %vecext23 %vecinit25 = insertelement <8 x float> %vecinit21, float %add24, i32 6 %vecext26 = extractelement <8 x float> %b, i32 6 %vecext27 = extractelement <8 x float> %b, i32 7 - %add28 = fadd float %vecext26, %vecext27 + %add28 = fadd nexc nrnd float %vecext26, %vecext27 %vecinit29 = insertelement <8 x float> %vecinit25, float %add28, i32 7 ret <8 x float> %vecinit29 } @@ -575,35 +575,35 @@ define <8 x float> @avx_vhsub_ps(<8 x float> %a, <8 x float> %b) { %vecext = extractelement <8 x float> %a, i32 0 %vecext1 = extractelement <8 x float> %a, i32 1 - %sub = fsub float %vecext, %vecext1 + %sub = fsub nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <8 x float> undef, float %sub, i32 0 %vecext2 = extractelement <8 x float> %a, i32 2 %vecext3 = extractelement <8 x float> %a, i32 3 - %sub4 = fsub float %vecext2, %vecext3 + %sub4 = fsub nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <8 x float> %vecinit, float %sub4, i32 1 %vecext6 = extractelement <8 x float> %b, i32 0 %vecext7 = extractelement <8 x float> %b, i32 1 - %sub8 = fsub float %vecext6, %vecext7 + %sub8 = fsub nexc nrnd float %vecext6, %vecext7 %vecinit9 = insertelement <8 x float> %vecinit5, float %sub8, i32 2 %vecext10 = extractelement <8 x float> %b, i32 2 %vecext11 = extractelement <8 x float> %b, i32 3 - %sub12 = fsub float %vecext10, %vecext11 + %sub12 = fsub nexc nrnd float %vecext10, %vecext11 %vecinit13 = insertelement <8 x float> %vecinit9, float %sub12, i32 3 %vecext14 = extractelement <8 x float> %a, i32 4 %vecext15 = extractelement <8 x float> %a, i32 5 - %sub16 = fsub float %vecext14, %vecext15 + %sub16 = fsub nexc nrnd float %vecext14, %vecext15 %vecinit17 = insertelement <8 x float> %vecinit13, float %sub16, i32 4 %vecext18 = extractelement <8 x float> %a, i32 6 %vecext19 = extractelement <8 x float> %a, i32 7 - %sub20 = fsub float %vecext18, %vecext19 + %sub20 = fsub nexc nrnd float %vecext18, %vecext19 %vecinit21 = insertelement <8 x float> %vecinit17, float %sub20, i32 5 %vecext22 = extractelement <8 x float> %b, i32 4 %vecext23 = extractelement <8 x float> %b, i32 5 - %sub24 = fsub float %vecext22, %vecext23 + %sub24 = fsub nexc nrnd float %vecext22, %vecext23 %vecinit25 = insertelement <8 x float> %vecinit21, float %sub24, i32 6 %vecext26 = extractelement <8 x float> %b, i32 6 %vecext27 = extractelement <8 x float> %b, i32 7 - %sub28 = fsub float %vecext26, %vecext27 + %sub28 = fsub nexc nrnd float %vecext26, %vecext27 %vecinit29 = insertelement <8 x float> %vecinit25, float %sub28, i32 7 ret <8 x float> %vecinit29 } @@ -620,19 +620,19 @@ define <4 x double> @avx_hadd_pd(<4 x double> %a, <4 x double> %b) { %vecext = extractelement <4 x double> %a, i32 0 %vecext1 = extractelement <4 x double> %a, i32 1 - %add = fadd double %vecext, %vecext1 + %add = fadd nexc nrnd double %vecext, %vecext1 %vecinit = insertelement <4 x double> undef, double %add, i32 0 %vecext2 = extractelement <4 x double> %b, i32 0 %vecext3 = extractelement <4 x double> %b, i32 1 - %add4 = fadd double %vecext2, %vecext3 + %add4 = fadd nexc nrnd double %vecext2, %vecext3 %vecinit5 = insertelement <4 x double> %vecinit, double %add4, i32 1 %vecext6 = extractelement <4 x double> %a, i32 2 %vecext7 = extractelement <4 x double> %a, i32 3 - %add8 = fadd double %vecext6, %vecext7 + %add8 = fadd nexc nrnd double %vecext6, %vecext7 %vecinit9 = insertelement <4 x double> %vecinit5, double %add8, i32 2 %vecext10 = extractelement <4 x double> %b, i32 2 %vecext11 = extractelement <4 x double> %b, i32 3 - %add12 = fadd double %vecext10, %vecext11 + %add12 = fadd nexc nrnd double %vecext10, %vecext11 %vecinit13 = insertelement <4 x double> %vecinit9, double %add12, i32 3 ret <4 x double> %vecinit13 } @@ -649,19 +649,19 @@ define <4 x double> @avx_hsub_pd(<4 x double> %a, <4 x double> %b) { %vecext = extractelement <4 x double> %a, i32 0 %vecext1 = extractelement <4 x double> %a, i32 1 - %sub = fsub double %vecext, %vecext1 + %sub = fsub nexc nrnd double %vecext, %vecext1 %vecinit = insertelement <4 x double> undef, double %sub, i32 0 %vecext2 = extractelement <4 x double> %b, i32 0 %vecext3 = extractelement <4 x double> %b, i32 1 - %sub4 = fsub double %vecext2, %vecext3 + %sub4 = fsub nexc nrnd double %vecext2, %vecext3 %vecinit5 = insertelement <4 x double> %vecinit, double %sub4, i32 1 %vecext6 = extractelement <4 x double> %a, i32 2 %vecext7 = extractelement <4 x double> %a, i32 3 - %sub8 = fsub double %vecext6, %vecext7 + %sub8 = fsub nexc nrnd double %vecext6, %vecext7 %vecinit9 = insertelement <4 x double> %vecinit5, double %sub8, i32 2 %vecext10 = extractelement <4 x double> %b, i32 2 %vecext11 = extractelement <4 x double> %b, i32 3 - %sub12 = fsub double %vecext10, %vecext11 + %sub12 = fsub nexc nrnd double %vecext10, %vecext11 %vecinit13 = insertelement <4 x double> %vecinit9, double %sub12, i32 3 ret <4 x double> %vecinit13 } Index: test/CodeGen/X86/haddsub-undef.ll =================================================================== --- test/CodeGen/X86/haddsub-undef.ll +++ test/CodeGen/X86/haddsub-undef.ll @@ -7,15 +7,15 @@ define <4 x float> @test1_undef(<4 x float> %a, <4 x float> %b) { %vecext = extractelement <4 x float> %a, i32 0 %vecext1 = extractelement <4 x float> %a, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %add, i32 0 %vecext2 = extractelement <4 x float> %a, i32 2 %vecext3 = extractelement <4 x float> %a, i32 3 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 1 %vecext10 = extractelement <4 x float> %b, i32 2 %vecext11 = extractelement <4 x float> %b, i32 3 - %add12 = fadd float %vecext10, %vecext11 + %add12 = fadd nexc nrnd float %vecext10, %vecext11 %vecinit13 = insertelement <4 x float> %vecinit5, float %add12, i32 3 ret <4 x float> %vecinit13 } @@ -29,15 +29,15 @@ define <4 x float> @test2_undef(<4 x float> %a, <4 x float> %b) { %vecext = extractelement <4 x float> %a, i32 0 %vecext1 = extractelement <4 x float> %a, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %add, i32 0 %vecext6 = extractelement <4 x float> %b, i32 0 %vecext7 = extractelement <4 x float> %b, i32 1 - %add8 = fadd float %vecext6, %vecext7 + %add8 = fadd nexc nrnd float %vecext6, %vecext7 %vecinit9 = insertelement <4 x float> %vecinit, float %add8, i32 2 %vecext10 = extractelement <4 x float> %b, i32 2 %vecext11 = extractelement <4 x float> %b, i32 3 - %add12 = fadd float %vecext10, %vecext11 + %add12 = fadd nexc nrnd float %vecext10, %vecext11 %vecinit13 = insertelement <4 x float> %vecinit9, float %add12, i32 3 ret <4 x float> %vecinit13 } @@ -51,15 +51,15 @@ define <4 x float> @test3_undef(<4 x float> %a, <4 x float> %b) { %vecext = extractelement <4 x float> %a, i32 0 %vecext1 = extractelement <4 x float> %a, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %add, i32 0 %vecext2 = extractelement <4 x float> %a, i32 2 %vecext3 = extractelement <4 x float> %a, i32 3 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 1 %vecext6 = extractelement <4 x float> %b, i32 0 %vecext7 = extractelement <4 x float> %b, i32 1 - %add8 = fadd float %vecext6, %vecext7 + %add8 = fadd nexc nrnd float %vecext6, %vecext7 %vecinit9 = insertelement <4 x float> %vecinit5, float %add8, i32 2 ret <4 x float> %vecinit9 } @@ -73,7 +73,7 @@ define <4 x float> @test4_undef(<4 x float> %a, <4 x float> %b) { %vecext = extractelement <4 x float> %a, i32 0 %vecext1 = extractelement <4 x float> %a, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %add, i32 0 ret <4 x float> %vecinit } @@ -85,7 +85,7 @@ define <2 x double> @test5_undef(<2 x double> %a, <2 x double> %b) { %vecext = extractelement <2 x double> %a, i32 0 %vecext1 = extractelement <2 x double> %a, i32 1 - %add = fadd double %vecext, %vecext1 + %add = fadd nexc nrnd double %vecext, %vecext1 %vecinit = insertelement <2 x double> undef, double %add, i32 0 ret <2 x double> %vecinit } @@ -97,11 +97,11 @@ define <4 x float> @test6_undef(<4 x float> %a, <4 x float> %b) { %vecext = extractelement <4 x float> %a, i32 0 %vecext1 = extractelement <4 x float> %a, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %add, i32 0 %vecext2 = extractelement <4 x float> %a, i32 2 %vecext3 = extractelement <4 x float> %a, i32 3 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 1 ret <4 x float> %vecinit5 } @@ -115,11 +115,11 @@ define <4 x float> @test7_undef(<4 x float> %a, <4 x float> %b) { %vecext = extractelement <4 x float> %b, i32 0 %vecext1 = extractelement <4 x float> %b, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %add, i32 2 %vecext2 = extractelement <4 x float> %b, i32 2 %vecext3 = extractelement <4 x float> %b, i32 3 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 3 ret <4 x float> %vecinit5 } @@ -133,11 +133,11 @@ define <4 x float> @test8_undef(<4 x float> %a, <4 x float> %b) { %vecext = extractelement <4 x float> %a, i32 0 %vecext1 = extractelement <4 x float> %a, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %add, i32 0 %vecext2 = extractelement <4 x float> %a, i32 2 %vecext3 = extractelement <4 x float> %a, i32 3 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 2 ret <4 x float> %vecinit5 } @@ -149,11 +149,11 @@ define <4 x float> @test9_undef(<4 x float> %a, <4 x float> %b) { %vecext = extractelement <4 x float> %a, i32 0 %vecext1 = extractelement <4 x float> %a, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <4 x float> undef, float %add, i32 0 %vecext2 = extractelement <4 x float> %b, i32 2 %vecext3 = extractelement <4 x float> %b, i32 3 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 3 ret <4 x float> %vecinit5 } @@ -164,11 +164,11 @@ define <8 x float> @test10_undef(<8 x float> %a, <8 x float> %b) { %vecext = extractelement <8 x float> %a, i32 0 %vecext1 = extractelement <8 x float> %a, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <8 x float> undef, float %add, i32 0 %vecext2 = extractelement <8 x float> %b, i32 2 %vecext3 = extractelement <8 x float> %b, i32 3 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <8 x float> %vecinit, float %add4, i32 3 ret <8 x float> %vecinit5 } @@ -182,11 +182,11 @@ define <8 x float> @test11_undef(<8 x float> %a, <8 x float> %b) { %vecext = extractelement <8 x float> %a, i32 0 %vecext1 = extractelement <8 x float> %a, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <8 x float> undef, float %add, i32 0 %vecext2 = extractelement <8 x float> %b, i32 4 %vecext3 = extractelement <8 x float> %b, i32 5 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <8 x float> %vecinit, float %add4, i32 6 ret <8 x float> %vecinit5 } @@ -199,11 +199,11 @@ define <8 x float> @test12_undef(<8 x float> %a, <8 x float> %b) { %vecext = extractelement <8 x float> %a, i32 0 %vecext1 = extractelement <8 x float> %a, i32 1 - %add = fadd float %vecext, %vecext1 + %add = fadd nexc nrnd float %vecext, %vecext1 %vecinit = insertelement <8 x float> undef, float %add, i32 0 %vecext2 = extractelement <8 x float> %a, i32 2 %vecext3 = extractelement <8 x float> %a, i32 3 - %add4 = fadd float %vecext2, %vecext3 + %add4 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit5 = insertelement <8 x float> %vecinit, float %add4, i32 1 ret <8 x float> %vecinit5 } @@ -217,19 +217,19 @@ define <8 x float> @test13_undef(<8 x float> %a, <8 x float> %b) { %vecext = extractelement <8 x float> %a, i32 0 %vecext1 = extractelement <8 x float> %a, i32 1 - %add1 = fadd float %vecext, %vecext1 + %add1 = fadd nexc nrnd float %vecext, %vecext1 %vecinit1 = insertelement <8 x float> undef, float %add1, i32 0 %vecext2 = extractelement <8 x float> %a, i32 2 %vecext3 = extractelement <8 x float> %a, i32 3 - %add2 = fadd float %vecext2, %vecext3 + %add2 = fadd nexc nrnd float %vecext2, %vecext3 %vecinit2 = insertelement <8 x float> %vecinit1, float %add2, i32 1 %vecext4 = extractelement <8 x float> %a, i32 4 %vecext5 = extractelement <8 x float> %a, i32 5 - %add3 = fadd float %vecext4, %vecext5 + %add3 = fadd nexc nrnd float %vecext4, %vecext5 %vecinit3 = insertelement <8 x float> %vecinit2, float %add3, i32 2 %vecext6 = extractelement <8 x float> %a, i32 6 %vecext7 = extractelement <8 x float> %a, i32 7 - %add4 = fadd float %vecext6, %vecext7 + %add4 = fadd nexc nrnd float %vecext6, %vecext7 %vecinit4 = insertelement <8 x float> %vecinit3, float %add4, i32 3 ret <8 x float> %vecinit4 } Index: test/CodeGen/X86/haddsub.ll =================================================================== --- test/CodeGen/X86/haddsub.ll +++ test/CodeGen/X86/haddsub.ll @@ -9,7 +9,7 @@ define <2 x double> @haddpd1(<2 x double> %x, <2 x double> %y) { %a = shufflevector <2 x double> %x, <2 x double> %y, <2 x i32> %b = shufflevector <2 x double> %x, <2 x double> %y, <2 x i32> - %r = fadd <2 x double> %a, %b + %r = fadd nexc nrnd <2 x double> %a, %b ret <2 x double> %r } @@ -21,7 +21,7 @@ define <2 x double> @haddpd2(<2 x double> %x, <2 x double> %y) { %a = shufflevector <2 x double> %x, <2 x double> %y, <2 x i32> %b = shufflevector <2 x double> %y, <2 x double> %x, <2 x i32> - %r = fadd <2 x double> %a, %b + %r = fadd nexc nrnd <2 x double> %a, %b ret <2 x double> %r } @@ -33,7 +33,7 @@ define <2 x double> @haddpd3(<2 x double> %x) { %a = shufflevector <2 x double> %x, <2 x double> undef, <2 x i32> %b = shufflevector <2 x double> %x, <2 x double> undef, <2 x i32> - %r = fadd <2 x double> %a, %b + %r = fadd nexc nrnd <2 x double> %a, %b ret <2 x double> %r } @@ -45,7 +45,7 @@ define <4 x float> @haddps1(<4 x float> %x, <4 x float> %y) { %a = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> %b = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> - %r = fadd <4 x float> %a, %b + %r = fadd nexc nrnd <4 x float> %a, %b ret <4 x float> %r } @@ -57,7 +57,7 @@ define <4 x float> @haddps2(<4 x float> %x, <4 x float> %y) { %a = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> %b = shufflevector <4 x float> %y, <4 x float> %x, <4 x i32> - %r = fadd <4 x float> %a, %b + %r = fadd nexc nrnd <4 x float> %a, %b ret <4 x float> %r } @@ -69,7 +69,7 @@ define <4 x float> @haddps3(<4 x float> %x) { %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> - %r = fadd <4 x float> %a, %b + %r = fadd nexc nrnd <4 x float> %a, %b ret <4 x float> %r } @@ -81,7 +81,7 @@ define <4 x float> @haddps4(<4 x float> %x) { %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> - %r = fadd <4 x float> %a, %b + %r = fadd nexc nrnd <4 x float> %a, %b ret <4 x float> %r } @@ -93,7 +93,7 @@ define <4 x float> @haddps5(<4 x float> %x) { %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> - %r = fadd <4 x float> %a, %b + %r = fadd nexc nrnd <4 x float> %a, %b ret <4 x float> %r } @@ -105,7 +105,7 @@ define <4 x float> @haddps6(<4 x float> %x) { %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> - %r = fadd <4 x float> %a, %b + %r = fadd nexc nrnd <4 x float> %a, %b ret <4 x float> %r } @@ -117,7 +117,7 @@ define <4 x float> @haddps7(<4 x float> %x) { %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> - %r = fadd <4 x float> %a, %b + %r = fadd nexc nrnd <4 x float> %a, %b ret <4 x float> %r } @@ -129,7 +129,7 @@ define <2 x double> @hsubpd1(<2 x double> %x, <2 x double> %y) { %a = shufflevector <2 x double> %x, <2 x double> %y, <2 x i32> %b = shufflevector <2 x double> %x, <2 x double> %y, <2 x i32> - %r = fsub <2 x double> %a, %b + %r = fsub nexc nrnd <2 x double> %a, %b ret <2 x double> %r } @@ -141,7 +141,7 @@ define <2 x double> @hsubpd2(<2 x double> %x) { %a = shufflevector <2 x double> %x, <2 x double> undef, <2 x i32> %b = shufflevector <2 x double> %x, <2 x double> undef, <2 x i32> - %r = fsub <2 x double> %a, %b + %r = fsub nexc nrnd <2 x double> %a, %b ret <2 x double> %r } @@ -153,7 +153,7 @@ define <4 x float> @hsubps1(<4 x float> %x, <4 x float> %y) { %a = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> %b = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> - %r = fsub <4 x float> %a, %b + %r = fsub nexc nrnd <4 x float> %a, %b ret <4 x float> %r } @@ -165,7 +165,7 @@ define <4 x float> @hsubps2(<4 x float> %x) { %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> - %r = fsub <4 x float> %a, %b + %r = fsub nexc nrnd <4 x float> %a, %b ret <4 x float> %r } @@ -177,7 +177,7 @@ define <4 x float> @hsubps3(<4 x float> %x) { %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> - %r = fsub <4 x float> %a, %b + %r = fsub nexc nrnd <4 x float> %a, %b ret <4 x float> %r } @@ -189,7 +189,7 @@ define <4 x float> @hsubps4(<4 x float> %x) { %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> - %r = fsub <4 x float> %a, %b + %r = fsub nexc nrnd <4 x float> %a, %b ret <4 x float> %r } @@ -202,7 +202,7 @@ define <8 x float> @vhaddps1(<8 x float> %x, <8 x float> %y) { %a = shufflevector <8 x float> %x, <8 x float> %y, <8 x i32> %b = shufflevector <8 x float> %x, <8 x float> %y, <8 x i32> - %r = fadd <8 x float> %a, %b + %r = fadd nexc nrnd <8 x float> %a, %b ret <8 x float> %r } @@ -215,7 +215,7 @@ define <8 x float> @vhaddps2(<8 x float> %x, <8 x float> %y) { %a = shufflevector <8 x float> %x, <8 x float> %y, <8 x i32> %b = shufflevector <8 x float> %y, <8 x float> %x, <8 x i32> - %r = fadd <8 x float> %a, %b + %r = fadd nexc nrnd <8 x float> %a, %b ret <8 x float> %r } @@ -228,7 +228,7 @@ define <8 x float> @vhaddps3(<8 x float> %x) { %a = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> %b = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> - %r = fadd <8 x float> %a, %b + %r = fadd nexc nrnd <8 x float> %a, %b ret <8 x float> %r } @@ -241,7 +241,7 @@ define <8 x float> @vhsubps1(<8 x float> %x, <8 x float> %y) { %a = shufflevector <8 x float> %x, <8 x float> %y, <8 x i32> %b = shufflevector <8 x float> %x, <8 x float> %y, <8 x i32> - %r = fsub <8 x float> %a, %b + %r = fsub nexc nrnd <8 x float> %a, %b ret <8 x float> %r } @@ -254,7 +254,7 @@ define <8 x float> @vhsubps3(<8 x float> %x) { %a = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> %b = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> - %r = fsub <8 x float> %a, %b + %r = fsub nexc nrnd <8 x float> %a, %b ret <8 x float> %r } @@ -267,7 +267,7 @@ define <4 x double> @vhaddpd1(<4 x double> %x, <4 x double> %y) { %a = shufflevector <4 x double> %x, <4 x double> %y, <4 x i32> %b = shufflevector <4 x double> %x, <4 x double> %y, <4 x i32> - %r = fadd <4 x double> %a, %b + %r = fadd nexc nrnd <4 x double> %a, %b ret <4 x double> %r } @@ -280,7 +280,7 @@ define <4 x double> @vhsubpd1(<4 x double> %x, <4 x double> %y) { %a = shufflevector <4 x double> %x, <4 x double> %y, <4 x i32> %b = shufflevector <4 x double> %x, <4 x double> %y, <4 x i32> - %r = fsub <4 x double> %a, %b + %r = fsub nexc nrnd <4 x double> %a, %b ret <4 x double> %r } @@ -292,8 +292,8 @@ %v0.1 = extractelement <4 x float> %v0, i32 1 %v0.2 = extractelement <4 x float> %v0, i32 2 %v0.3 = extractelement <4 x float> %v0, i32 3 - %op0 = fadd float %v0.0, %v0.1 - %op1 = fadd float %v0.2, %v0.3 + %op0 = fadd nexc nrnd float %v0.0, %v0.1 + %op1 = fadd nexc nrnd float %v0.2, %v0.3 %res0 = insertelement <2 x float> undef, float %op0, i32 0 %res1 = insertelement <2 x float> %res0, float %op1, i32 1 ret <2 x float> %res1 Index: test/CodeGen/X86/load-slice.ll =================================================================== --- test/CodeGen/X86/load-slice.ll +++ test/CodeGen/X86/load-slice.ll @@ -58,11 +58,11 @@ %arrayidx2 = getelementptr inbounds %class.Complex, %class.Complex* %out, i64 %add %i.i = getelementptr inbounds %class.Complex, %class.Complex* %arrayidx2, i64 0, i32 0 %tmp4 = load float, float* %i.i, align 4 - %add.i = fadd float %tmp4, %tmp2 + %add.i = fadd nexc nrnd float %tmp4, %tmp2 %retval.sroa.0.0.vec.insert.i = insertelement <2 x float> undef, float %add.i, i32 0 %r.i = getelementptr inbounds %class.Complex, %class.Complex* %arrayidx2, i64 0, i32 1 %tmp5 = load float, float* %r.i, align 4 - %add5.i = fadd float %tmp5, %tmp3 + %add5.i = fadd nexc nrnd float %tmp5, %tmp3 %retval.sroa.0.4.vec.insert.i = insertelement <2 x float> %retval.sroa.0.0.vec.insert.i, float %add5.i, i32 1 %ref.tmp.sroa.0.0.cast = bitcast %class.Complex* %arrayidx to <2 x float>* store <2 x float> %retval.sroa.0.4.vec.insert.i, <2 x float>* %ref.tmp.sroa.0.0.cast, align 4 Index: test/CodeGen/X86/lsr-static-addr.ll =================================================================== --- test/CodeGen/X86/lsr-static-addr.ll +++ test/CodeGen/X86/lsr-static-addr.ll @@ -31,7 +31,7 @@ %i.06 = phi i64 [ %inc, %for.body ], [ 0, %entry ] %arrayidx = getelementptr [0 x double], [0 x double]* @A, i64 0, i64 %i.06 %tmp3 = load double, double* %arrayidx, align 8 - %mul = fmul double %tmp3, 2.300000e+00 + %mul = fmul nexc nrnd double %tmp3, 2.300000e+00 store double %mul, double* %arrayidx, align 8 %inc = add nsw i64 %i.06, 1 %exitcond = icmp eq i64 %inc, %n Index: test/CodeGen/X86/machine-combiner.ll =================================================================== --- test/CodeGen/X86/machine-combiner.ll +++ test/CodeGen/X86/machine-combiner.ll @@ -18,9 +18,9 @@ ; AVX-NEXT: vaddss %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vaddss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fadd float %x0, %x1 - %t1 = fadd float %t0, %x2 - %t2 = fadd float %t1, %x3 + %t0 = fadd nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %t0, %x2 + %t2 = fadd nexc nrnd float %t1, %x3 ret float %t2 } @@ -38,9 +38,9 @@ ; AVX-NEXT: vaddss %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vaddss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fadd float %x0, %x1 - %t1 = fadd float %x2, %t0 - %t2 = fadd float %t1, %x3 + %t0 = fadd nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %x2, %t0 + %t2 = fadd nexc nrnd float %t1, %x3 ret float %t2 } @@ -58,9 +58,9 @@ ; AVX-NEXT: vaddss %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vaddss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fadd float %x0, %x1 - %t1 = fadd float %t0, %x2 - %t2 = fadd float %x3, %t1 + %t0 = fadd nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %t0, %x2 + %t2 = fadd nexc nrnd float %x3, %t1 ret float %t2 } @@ -78,9 +78,9 @@ ; AVX-NEXT: vaddss %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vaddss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fadd float %x0, %x1 - %t1 = fadd float %x2, %t0 - %t2 = fadd float %x3, %t1 + %t0 = fadd nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %x2, %t0 + %t2 = fadd nexc nrnd float %x3, %t1 ret float %t2 } @@ -109,13 +109,13 @@ ; AVX-NEXT: vaddss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: vaddss %xmm7, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fadd float %x0, %x1 - %t1 = fadd float %t0, %x2 - %t2 = fadd float %t1, %x3 - %t3 = fadd float %t2, %x4 - %t4 = fadd float %t3, %x5 - %t5 = fadd float %t4, %x6 - %t6 = fadd float %t5, %x7 + %t0 = fadd nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %t0, %x2 + %t2 = fadd nexc nrnd float %t1, %x3 + %t3 = fadd nexc nrnd float %t2, %x4 + %t4 = fadd nexc nrnd float %t3, %x5 + %t5 = fadd nexc nrnd float %t4, %x6 + %t6 = fadd nexc nrnd float %t5, %x7 ret float %t6 } @@ -138,9 +138,9 @@ ; AVX-NEXT: vaddss %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vaddss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fdiv float %x0, %x1 - %t1 = fadd float %x2, %t0 - %t2 = fadd float %x3, %t1 + %t0 = fdiv nexc nrnd float %x0, %x1 + %t1 = fadd nexc nrnd float %x2, %t0 + %t2 = fadd nexc nrnd float %x3, %t1 ret float %t2 } @@ -160,9 +160,9 @@ ; AVX-NEXT: vmulss %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vmulss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fdiv float %x0, %x1 - %t1 = fmul float %x2, %t0 - %t2 = fmul float %x3, %t1 + %t0 = fdiv nexc nrnd float %x0, %x1 + %t1 = fmul nexc nrnd float %x2, %t0 + %t2 = fmul nexc nrnd float %x3, %t1 ret float %t2 } @@ -182,9 +182,9 @@ ; AVX-NEXT: vaddsd %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vaddsd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fdiv double %x0, %x1 - %t1 = fadd double %x2, %t0 - %t2 = fadd double %x3, %t1 + %t0 = fdiv nexc nrnd double %x0, %x1 + %t1 = fadd nexc nrnd double %x2, %t0 + %t2 = fadd nexc nrnd double %x3, %t1 ret double %t2 } @@ -204,9 +204,9 @@ ; AVX-NEXT: vmulsd %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vmulsd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fdiv double %x0, %x1 - %t1 = fmul double %x2, %t0 - %t2 = fmul double %x3, %t1 + %t0 = fdiv nexc nrnd double %x0, %x1 + %t1 = fmul nexc nrnd double %x2, %t0 + %t2 = fmul nexc nrnd double %x3, %t1 ret double %t2 } @@ -226,9 +226,9 @@ ; AVX-NEXT: vaddps %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vaddps %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fmul <4 x float> %x0, %x1 - %t1 = fadd <4 x float> %x2, %t0 - %t2 = fadd <4 x float> %x3, %t1 + %t0 = fmul nexc nrnd <4 x float> %x0, %x1 + %t1 = fadd nexc nrnd <4 x float> %x2, %t0 + %t2 = fadd nexc nrnd <4 x float> %x3, %t1 ret <4 x float> %t2 } @@ -248,9 +248,9 @@ ; AVX-NEXT: vaddpd %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vaddpd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fmul <2 x double> %x0, %x1 - %t1 = fadd <2 x double> %x2, %t0 - %t2 = fadd <2 x double> %x3, %t1 + %t0 = fmul nexc nrnd <2 x double> %x0, %x1 + %t1 = fadd nexc nrnd <2 x double> %x2, %t0 + %t2 = fadd nexc nrnd <2 x double> %x3, %t1 ret <2 x double> %t2 } @@ -270,9 +270,9 @@ ; AVX-NEXT: vmulps %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vmulps %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fadd <4 x float> %x0, %x1 - %t1 = fmul <4 x float> %x2, %t0 - %t2 = fmul <4 x float> %x3, %t1 + %t0 = fadd nexc nrnd <4 x float> %x0, %x1 + %t1 = fmul nexc nrnd <4 x float> %x2, %t0 + %t2 = fmul nexc nrnd <4 x float> %x3, %t1 ret <4 x float> %t2 } @@ -292,9 +292,9 @@ ; AVX-NEXT: vmulpd %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vmulpd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fadd <2 x double> %x0, %x1 - %t1 = fmul <2 x double> %x2, %t0 - %t2 = fmul <2 x double> %x3, %t1 + %t0 = fadd nexc nrnd <2 x double> %x0, %x1 + %t1 = fmul nexc nrnd <2 x double> %x2, %t0 + %t2 = fmul nexc nrnd <2 x double> %x3, %t1 ret <2 x double> %t2 } @@ -307,9 +307,9 @@ ; AVX-NEXT: vaddps %ymm3, %ymm2, %ymm1 ; AVX-NEXT: vaddps %ymm1, %ymm0, %ymm0 ; AVX-NEXT: retq - %t0 = fmul <8 x float> %x0, %x1 - %t1 = fadd <8 x float> %x2, %t0 - %t2 = fadd <8 x float> %x3, %t1 + %t0 = fmul nexc nrnd <8 x float> %x0, %x1 + %t1 = fadd nexc nrnd <8 x float> %x2, %t0 + %t2 = fadd nexc nrnd <8 x float> %x3, %t1 ret <8 x float> %t2 } @@ -322,9 +322,9 @@ ; AVX-NEXT: vaddpd %ymm3, %ymm2, %ymm1 ; AVX-NEXT: vaddpd %ymm1, %ymm0, %ymm0 ; AVX-NEXT: retq - %t0 = fmul <4 x double> %x0, %x1 - %t1 = fadd <4 x double> %x2, %t0 - %t2 = fadd <4 x double> %x3, %t1 + %t0 = fmul nexc nrnd <4 x double> %x0, %x1 + %t1 = fadd nexc nrnd <4 x double> %x2, %t0 + %t2 = fadd nexc nrnd <4 x double> %x3, %t1 ret <4 x double> %t2 } @@ -337,9 +337,9 @@ ; AVX-NEXT: vmulps %ymm3, %ymm2, %ymm1 ; AVX-NEXT: vmulps %ymm1, %ymm0, %ymm0 ; AVX-NEXT: retq - %t0 = fadd <8 x float> %x0, %x1 - %t1 = fmul <8 x float> %x2, %t0 - %t2 = fmul <8 x float> %x3, %t1 + %t0 = fadd nexc nrnd <8 x float> %x0, %x1 + %t1 = fmul nexc nrnd <8 x float> %x2, %t0 + %t2 = fmul nexc nrnd <8 x float> %x3, %t1 ret <8 x float> %t2 } @@ -352,9 +352,9 @@ ; AVX-NEXT: vmulpd %ymm3, %ymm2, %ymm1 ; AVX-NEXT: vmulpd %ymm1, %ymm0, %ymm0 ; AVX-NEXT: retq - %t0 = fadd <4 x double> %x0, %x1 - %t1 = fmul <4 x double> %x2, %t0 - %t2 = fmul <4 x double> %x3, %t1 + %t0 = fadd nexc nrnd <4 x double> %x0, %x1 + %t1 = fmul nexc nrnd <4 x double> %x2, %t0 + %t2 = fmul nexc nrnd <4 x double> %x3, %t1 ret <4 x double> %t2 } @@ -374,7 +374,7 @@ ; AVX-NEXT: vminss %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vminss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fdiv float %x0, %x1 + %t0 = fdiv nexc nrnd float %x0, %x1 %cmp1 = fcmp olt float %x2, %t0 %sel1 = select i1 %cmp1, float %x2, float %t0 %cmp2 = fcmp olt float %x3, %sel1 @@ -398,7 +398,7 @@ ; AVX-NEXT: vmaxss %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vmaxss %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fdiv float %x0, %x1 + %t0 = fdiv nexc nrnd float %x0, %x1 %cmp1 = fcmp ogt float %x2, %t0 %sel1 = select i1 %cmp1, float %x2, float %t0 %cmp2 = fcmp ogt float %x3, %sel1 @@ -422,7 +422,7 @@ ; AVX-NEXT: vminsd %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vminsd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fdiv double %x0, %x1 + %t0 = fdiv nexc nrnd double %x0, %x1 %cmp1 = fcmp olt double %x2, %t0 %sel1 = select i1 %cmp1, double %x2, double %t0 %cmp2 = fcmp olt double %x3, %sel1 @@ -446,7 +446,7 @@ ; AVX-NEXT: vmaxsd %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vmaxsd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fdiv double %x0, %x1 + %t0 = fdiv nexc nrnd double %x0, %x1 %cmp1 = fcmp ogt double %x2, %t0 %sel1 = select i1 %cmp1, double %x2, double %t0 %cmp2 = fcmp ogt double %x3, %sel1 @@ -470,7 +470,7 @@ ; AVX-NEXT: vminps %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vminps %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fadd <4 x float> %x0, %x1 + %t0 = fadd nexc nrnd <4 x float> %x0, %x1 %cmp1 = fcmp olt <4 x float> %x2, %t0 %sel1 = select <4 x i1> %cmp1, <4 x float> %x2, <4 x float> %t0 %cmp2 = fcmp olt <4 x float> %x3, %sel1 @@ -494,7 +494,7 @@ ; AVX-NEXT: vmaxps %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vmaxps %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fadd <4 x float> %x0, %x1 + %t0 = fadd nexc nrnd <4 x float> %x0, %x1 %cmp1 = fcmp ogt <4 x float> %x2, %t0 %sel1 = select <4 x i1> %cmp1, <4 x float> %x2, <4 x float> %t0 %cmp2 = fcmp ogt <4 x float> %x3, %sel1 @@ -518,7 +518,7 @@ ; AVX-NEXT: vminpd %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vminpd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fadd <2 x double> %x0, %x1 + %t0 = fadd nexc nrnd <2 x double> %x0, %x1 %cmp1 = fcmp olt <2 x double> %x2, %t0 %sel1 = select <2 x i1> %cmp1, <2 x double> %x2, <2 x double> %t0 %cmp2 = fcmp olt <2 x double> %x3, %sel1 @@ -542,7 +542,7 @@ ; AVX-NEXT: vmaxpd %xmm3, %xmm2, %xmm1 ; AVX-NEXT: vmaxpd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %t0 = fadd <2 x double> %x0, %x1 + %t0 = fadd nexc nrnd <2 x double> %x0, %x1 %cmp1 = fcmp ogt <2 x double> %x2, %t0 %sel1 = select <2 x i1> %cmp1, <2 x double> %x2, <2 x double> %t0 %cmp2 = fcmp ogt <2 x double> %x3, %sel1 @@ -559,7 +559,7 @@ ; AVX-NEXT: vminps %ymm3, %ymm2, %ymm1 ; AVX-NEXT: vminps %ymm1, %ymm0, %ymm0 ; AVX-NEXT: retq - %t0 = fadd <8 x float> %x0, %x1 + %t0 = fadd nexc nrnd <8 x float> %x0, %x1 %cmp1 = fcmp olt <8 x float> %x2, %t0 %sel1 = select <8 x i1> %cmp1, <8 x float> %x2, <8 x float> %t0 %cmp2 = fcmp olt <8 x float> %x3, %sel1 @@ -576,7 +576,7 @@ ; AVX-NEXT: vmaxps %ymm3, %ymm2, %ymm1 ; AVX-NEXT: vmaxps %ymm1, %ymm0, %ymm0 ; AVX-NEXT: retq - %t0 = fadd <8 x float> %x0, %x1 + %t0 = fadd nexc nrnd <8 x float> %x0, %x1 %cmp1 = fcmp ogt <8 x float> %x2, %t0 %sel1 = select <8 x i1> %cmp1, <8 x float> %x2, <8 x float> %t0 %cmp2 = fcmp ogt <8 x float> %x3, %sel1 @@ -593,7 +593,7 @@ ; AVX-NEXT: vminpd %ymm3, %ymm2, %ymm1 ; AVX-NEXT: vminpd %ymm1, %ymm0, %ymm0 ; AVX-NEXT: retq - %t0 = fadd <4 x double> %x0, %x1 + %t0 = fadd nexc nrnd <4 x double> %x0, %x1 %cmp1 = fcmp olt <4 x double> %x2, %t0 %sel1 = select <4 x i1> %cmp1, <4 x double> %x2, <4 x double> %t0 %cmp2 = fcmp olt <4 x double> %x3, %sel1 @@ -610,7 +610,7 @@ ; AVX-NEXT: vmaxpd %ymm3, %ymm2, %ymm1 ; AVX-NEXT: vmaxpd %ymm1, %ymm0, %ymm0 ; AVX-NEXT: retq - %t0 = fadd <4 x double> %x0, %x1 + %t0 = fadd nexc nrnd <4 x double> %x0, %x1 %cmp1 = fcmp ogt <4 x double> %x2, %t0 %sel1 = select <4 x i1> %cmp1, <4 x double> %x2, <4 x double> %t0 %cmp2 = fcmp ogt <4 x double> %x3, %sel1 @@ -641,9 +641,9 @@ %x1 = call double @bar() %x2 = call double @bar() %x3 = call double @bar() - %t0 = fadd double %x0, %x1 - %t1 = fadd double %t0, %x2 - %t2 = fadd double %t1, %x3 + %t0 = fadd nexc nrnd double %x0, %x1 + %t1 = fadd nexc nrnd double %t0, %x2 + %t2 = fadd nexc nrnd double %t1, %x3 ret double %t2 } @@ -665,9 +665,9 @@ %x1 = call double @bar() %x2 = call double @bar() %x3 = call double @bar() - %t0 = fadd double %x0, %x1 - %t1 = fadd double %x2, %x3 - %t2 = fadd double %t0, %t1 + %t0 = fadd nexc nrnd double %x0, %x1 + %t1 = fadd nexc nrnd double %x2, %x3 + %t2 = fadd nexc nrnd double %t0, %t1 ret double %t2 } Index: test/CodeGen/X86/misched-copy.ll =================================================================== --- test/CodeGen/X86/misched-copy.ll +++ test/CodeGen/X86/misched-copy.ll @@ -26,14 +26,14 @@ ; Do some dependent long latency stuff. %trunc = trunc i64 %mul to i32 %convm = sitofp i32 %trunc to float - %divm = fdiv float %convm, 0.75 - ;%addmb = fadd float %divm, %convb - ;%divmb = fdiv float %addmb, 0.125 + %divm = fdiv nexc nrnd float %convm, 0.75 + ;%addmb = fadd nexc nrnd float %divm, %convb + ;%divmb = fdiv nexc nrnd float %addmb, 0.125 ; Do some independent long latency stuff. %conva = sitofp i32 %a to float - %diva = fdiv float %conva, 0.75 - %addab = fadd float %diva, %convb - %divab = fdiv float %addab, 0.125 + %diva = fdiv nexc nrnd float %conva, 0.75 + %addab = fadd nexc nrnd float %diva, %convb + %divab = fdiv nexc nrnd float %addab, 0.125 br label %end end: Index: test/CodeGen/X86/misched-ilp.ll =================================================================== --- test/CodeGen/X86/misched-ilp.ll +++ test/CodeGen/X86/misched-ilp.ll @@ -16,10 +16,10 @@ ; MIN: addss define float @ilpsched(float %a, float %b, float %c, float %d, float %e, float %f) nounwind uwtable readnone ssp { entry: - %add = fadd float %a, %b - %add1 = fadd float %c, %d - %add2 = fadd float %e, %f - %add3 = fsub float %add1, %add2 - %add4 = fadd float %add, %add3 + %add = fadd nexc nrnd float %a, %b + %add1 = fadd nexc nrnd float %c, %d + %add2 = fadd nexc nrnd float %e, %f + %add3 = fsub nexc nrnd float %add1, %add2 + %add4 = fadd nexc nrnd float %add, %add3 ret float %add4 } Index: test/CodeGen/X86/misched-matmul.ll =================================================================== --- test/CodeGen/X86/misched-matmul.ll +++ test/CodeGen/X86/misched-matmul.ll @@ -18,178 +18,178 @@ %0 = load double, double* %arrayidx1.i, align 8 %arrayidx3.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 0, i64 0 %1 = load double, double* %arrayidx3.i, align 8 - %mul.i = fmul double %0, %1 + %mul.i = fmul nexc nrnd double %0, %1 %arrayidx5.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 0, i64 1 %2 = load double, double* %arrayidx5.i, align 8 %arrayidx7.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 1, i64 0 %3 = load double, double* %arrayidx7.i, align 8 - %mul8.i = fmul double %2, %3 - %add.i = fadd double %mul.i, %mul8.i + %mul8.i = fmul nexc nrnd double %2, %3 + %add.i = fadd nexc nrnd double %mul.i, %mul8.i %arrayidx10.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 0, i64 2 %4 = load double, double* %arrayidx10.i, align 8 %arrayidx12.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 2, i64 0 %5 = load double, double* %arrayidx12.i, align 8 - %mul13.i = fmul double %4, %5 - %add14.i = fadd double %add.i, %mul13.i + %mul13.i = fmul nexc nrnd double %4, %5 + %add14.i = fadd nexc nrnd double %add.i, %mul13.i %arrayidx16.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 0, i64 3 %6 = load double, double* %arrayidx16.i, align 8 %arrayidx18.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 3, i64 0 %7 = load double, double* %arrayidx18.i, align 8 - %mul19.i = fmul double %6, %7 - %add20.i = fadd double %add14.i, %mul19.i + %mul19.i = fmul nexc nrnd double %6, %7 + %add20.i = fadd nexc nrnd double %add14.i, %mul19.i %arrayidx25.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 0, i64 1 %8 = load double, double* %arrayidx25.i, align 8 - %mul26.i = fmul double %0, %8 + %mul26.i = fmul nexc nrnd double %0, %8 %arrayidx30.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 1, i64 1 %9 = load double, double* %arrayidx30.i, align 8 - %mul31.i = fmul double %2, %9 - %add32.i = fadd double %mul26.i, %mul31.i + %mul31.i = fmul nexc nrnd double %2, %9 + %add32.i = fadd nexc nrnd double %mul26.i, %mul31.i %arrayidx36.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 2, i64 1 %10 = load double, double* %arrayidx36.i, align 8 - %mul37.i = fmul double %4, %10 - %add38.i = fadd double %add32.i, %mul37.i + %mul37.i = fmul nexc nrnd double %4, %10 + %add38.i = fadd nexc nrnd double %add32.i, %mul37.i %arrayidx42.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 3, i64 1 %11 = load double, double* %arrayidx42.i, align 8 - %mul43.i = fmul double %6, %11 - %add44.i = fadd double %add38.i, %mul43.i + %mul43.i = fmul nexc nrnd double %6, %11 + %add44.i = fadd nexc nrnd double %add38.i, %mul43.i %arrayidx49.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 0, i64 2 %12 = load double, double* %arrayidx49.i, align 8 - %mul50.i = fmul double %0, %12 + %mul50.i = fmul nexc nrnd double %0, %12 %arrayidx54.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 1, i64 2 %13 = load double, double* %arrayidx54.i, align 8 - %mul55.i = fmul double %2, %13 - %add56.i = fadd double %mul50.i, %mul55.i + %mul55.i = fmul nexc nrnd double %2, %13 + %add56.i = fadd nexc nrnd double %mul50.i, %mul55.i %arrayidx60.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 2, i64 2 %14 = load double, double* %arrayidx60.i, align 8 - %mul61.i = fmul double %4, %14 - %add62.i = fadd double %add56.i, %mul61.i + %mul61.i = fmul nexc nrnd double %4, %14 + %add62.i = fadd nexc nrnd double %add56.i, %mul61.i %arrayidx66.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 3, i64 2 %15 = load double, double* %arrayidx66.i, align 8 - %mul67.i = fmul double %6, %15 - %add68.i = fadd double %add62.i, %mul67.i + %mul67.i = fmul nexc nrnd double %6, %15 + %add68.i = fadd nexc nrnd double %add62.i, %mul67.i %arrayidx73.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 0, i64 3 %16 = load double, double* %arrayidx73.i, align 8 - %mul74.i = fmul double %0, %16 + %mul74.i = fmul nexc nrnd double %0, %16 %arrayidx78.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 1, i64 3 %17 = load double, double* %arrayidx78.i, align 8 - %mul79.i = fmul double %2, %17 - %add80.i = fadd double %mul74.i, %mul79.i + %mul79.i = fmul nexc nrnd double %2, %17 + %add80.i = fadd nexc nrnd double %mul74.i, %mul79.i %arrayidx84.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 2, i64 3 %18 = load double, double* %arrayidx84.i, align 8 - %mul85.i = fmul double %4, %18 - %add86.i = fadd double %add80.i, %mul85.i + %mul85.i = fmul nexc nrnd double %4, %18 + %add86.i = fadd nexc nrnd double %add80.i, %mul85.i %arrayidx90.i = getelementptr inbounds [4 x double], [4 x double]* %B, i64 3, i64 3 %19 = load double, double* %arrayidx90.i, align 8 - %mul91.i = fmul double %6, %19 - %add92.i = fadd double %add86.i, %mul91.i + %mul91.i = fmul nexc nrnd double %6, %19 + %add92.i = fadd nexc nrnd double %add86.i, %mul91.i %arrayidx95.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 1, i64 0 %20 = load double, double* %arrayidx95.i, align 8 - %mul98.i = fmul double %1, %20 + %mul98.i = fmul nexc nrnd double %1, %20 %arrayidx100.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 1, i64 1 %21 = load double, double* %arrayidx100.i, align 8 - %mul103.i = fmul double %3, %21 - %add104.i = fadd double %mul98.i, %mul103.i + %mul103.i = fmul nexc nrnd double %3, %21 + %add104.i = fadd nexc nrnd double %mul98.i, %mul103.i %arrayidx106.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 1, i64 2 %22 = load double, double* %arrayidx106.i, align 8 - %mul109.i = fmul double %5, %22 - %add110.i = fadd double %add104.i, %mul109.i + %mul109.i = fmul nexc nrnd double %5, %22 + %add110.i = fadd nexc nrnd double %add104.i, %mul109.i %arrayidx112.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 1, i64 3 %23 = load double, double* %arrayidx112.i, align 8 - %mul115.i = fmul double %7, %23 - %add116.i = fadd double %add110.i, %mul115.i - %mul122.i = fmul double %8, %20 - %mul127.i = fmul double %9, %21 - %add128.i = fadd double %mul122.i, %mul127.i - %mul133.i = fmul double %10, %22 - %add134.i = fadd double %add128.i, %mul133.i - %mul139.i = fmul double %11, %23 - %add140.i = fadd double %add134.i, %mul139.i - %mul146.i = fmul double %12, %20 - %mul151.i = fmul double %13, %21 - %add152.i = fadd double %mul146.i, %mul151.i - %mul157.i = fmul double %14, %22 - %add158.i = fadd double %add152.i, %mul157.i - %mul163.i = fmul double %15, %23 - %add164.i = fadd double %add158.i, %mul163.i - %mul170.i = fmul double %16, %20 - %mul175.i = fmul double %17, %21 - %add176.i = fadd double %mul170.i, %mul175.i - %mul181.i = fmul double %18, %22 - %add182.i = fadd double %add176.i, %mul181.i - %mul187.i = fmul double %19, %23 - %add188.i = fadd double %add182.i, %mul187.i + %mul115.i = fmul nexc nrnd double %7, %23 + %add116.i = fadd nexc nrnd double %add110.i, %mul115.i + %mul122.i = fmul nexc nrnd double %8, %20 + %mul127.i = fmul nexc nrnd double %9, %21 + %add128.i = fadd nexc nrnd double %mul122.i, %mul127.i + %mul133.i = fmul nexc nrnd double %10, %22 + %add134.i = fadd nexc nrnd double %add128.i, %mul133.i + %mul139.i = fmul nexc nrnd double %11, %23 + %add140.i = fadd nexc nrnd double %add134.i, %mul139.i + %mul146.i = fmul nexc nrnd double %12, %20 + %mul151.i = fmul nexc nrnd double %13, %21 + %add152.i = fadd nexc nrnd double %mul146.i, %mul151.i + %mul157.i = fmul nexc nrnd double %14, %22 + %add158.i = fadd nexc nrnd double %add152.i, %mul157.i + %mul163.i = fmul nexc nrnd double %15, %23 + %add164.i = fadd nexc nrnd double %add158.i, %mul163.i + %mul170.i = fmul nexc nrnd double %16, %20 + %mul175.i = fmul nexc nrnd double %17, %21 + %add176.i = fadd nexc nrnd double %mul170.i, %mul175.i + %mul181.i = fmul nexc nrnd double %18, %22 + %add182.i = fadd nexc nrnd double %add176.i, %mul181.i + %mul187.i = fmul nexc nrnd double %19, %23 + %add188.i = fadd nexc nrnd double %add182.i, %mul187.i %arrayidx191.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 2, i64 0 %24 = load double, double* %arrayidx191.i, align 8 - %mul194.i = fmul double %1, %24 + %mul194.i = fmul nexc nrnd double %1, %24 %arrayidx196.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 2, i64 1 %25 = load double, double* %arrayidx196.i, align 8 - %mul199.i = fmul double %3, %25 - %add200.i = fadd double %mul194.i, %mul199.i + %mul199.i = fmul nexc nrnd double %3, %25 + %add200.i = fadd nexc nrnd double %mul194.i, %mul199.i %arrayidx202.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 2, i64 2 %26 = load double, double* %arrayidx202.i, align 8 - %mul205.i = fmul double %5, %26 - %add206.i = fadd double %add200.i, %mul205.i + %mul205.i = fmul nexc nrnd double %5, %26 + %add206.i = fadd nexc nrnd double %add200.i, %mul205.i %arrayidx208.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 2, i64 3 %27 = load double, double* %arrayidx208.i, align 8 - %mul211.i = fmul double %7, %27 - %add212.i = fadd double %add206.i, %mul211.i - %mul218.i = fmul double %8, %24 - %mul223.i = fmul double %9, %25 - %add224.i = fadd double %mul218.i, %mul223.i - %mul229.i = fmul double %10, %26 - %add230.i = fadd double %add224.i, %mul229.i - %mul235.i = fmul double %11, %27 - %add236.i = fadd double %add230.i, %mul235.i - %mul242.i = fmul double %12, %24 - %mul247.i = fmul double %13, %25 - %add248.i = fadd double %mul242.i, %mul247.i - %mul253.i = fmul double %14, %26 - %add254.i = fadd double %add248.i, %mul253.i - %mul259.i = fmul double %15, %27 - %add260.i = fadd double %add254.i, %mul259.i - %mul266.i = fmul double %16, %24 - %mul271.i = fmul double %17, %25 - %add272.i = fadd double %mul266.i, %mul271.i - %mul277.i = fmul double %18, %26 - %add278.i = fadd double %add272.i, %mul277.i - %mul283.i = fmul double %19, %27 - %add284.i = fadd double %add278.i, %mul283.i + %mul211.i = fmul nexc nrnd double %7, %27 + %add212.i = fadd nexc nrnd double %add206.i, %mul211.i + %mul218.i = fmul nexc nrnd double %8, %24 + %mul223.i = fmul nexc nrnd double %9, %25 + %add224.i = fadd nexc nrnd double %mul218.i, %mul223.i + %mul229.i = fmul nexc nrnd double %10, %26 + %add230.i = fadd nexc nrnd double %add224.i, %mul229.i + %mul235.i = fmul nexc nrnd double %11, %27 + %add236.i = fadd nexc nrnd double %add230.i, %mul235.i + %mul242.i = fmul nexc nrnd double %12, %24 + %mul247.i = fmul nexc nrnd double %13, %25 + %add248.i = fadd nexc nrnd double %mul242.i, %mul247.i + %mul253.i = fmul nexc nrnd double %14, %26 + %add254.i = fadd nexc nrnd double %add248.i, %mul253.i + %mul259.i = fmul nexc nrnd double %15, %27 + %add260.i = fadd nexc nrnd double %add254.i, %mul259.i + %mul266.i = fmul nexc nrnd double %16, %24 + %mul271.i = fmul nexc nrnd double %17, %25 + %add272.i = fadd nexc nrnd double %mul266.i, %mul271.i + %mul277.i = fmul nexc nrnd double %18, %26 + %add278.i = fadd nexc nrnd double %add272.i, %mul277.i + %mul283.i = fmul nexc nrnd double %19, %27 + %add284.i = fadd nexc nrnd double %add278.i, %mul283.i %arrayidx287.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 3, i64 0 %28 = load double, double* %arrayidx287.i, align 8 - %mul290.i = fmul double %1, %28 + %mul290.i = fmul nexc nrnd double %1, %28 %arrayidx292.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 3, i64 1 %29 = load double, double* %arrayidx292.i, align 8 - %mul295.i = fmul double %3, %29 - %add296.i = fadd double %mul290.i, %mul295.i + %mul295.i = fmul nexc nrnd double %3, %29 + %add296.i = fadd nexc nrnd double %mul290.i, %mul295.i %arrayidx298.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 3, i64 2 %30 = load double, double* %arrayidx298.i, align 8 - %mul301.i = fmul double %5, %30 - %add302.i = fadd double %add296.i, %mul301.i + %mul301.i = fmul nexc nrnd double %5, %30 + %add302.i = fadd nexc nrnd double %add296.i, %mul301.i %arrayidx304.i = getelementptr inbounds [4 x double], [4 x double]* %A, i64 3, i64 3 %31 = load double, double* %arrayidx304.i, align 8 - %mul307.i = fmul double %7, %31 - %add308.i = fadd double %add302.i, %mul307.i - %mul314.i = fmul double %8, %28 - %mul319.i = fmul double %9, %29 - %add320.i = fadd double %mul314.i, %mul319.i - %mul325.i = fmul double %10, %30 - %add326.i = fadd double %add320.i, %mul325.i - %mul331.i = fmul double %11, %31 - %add332.i = fadd double %add326.i, %mul331.i - %mul338.i = fmul double %12, %28 - %mul343.i = fmul double %13, %29 - %add344.i = fadd double %mul338.i, %mul343.i - %mul349.i = fmul double %14, %30 - %add350.i = fadd double %add344.i, %mul349.i - %mul355.i = fmul double %15, %31 - %add356.i = fadd double %add350.i, %mul355.i - %mul362.i = fmul double %16, %28 - %mul367.i = fmul double %17, %29 - %add368.i = fadd double %mul362.i, %mul367.i - %mul373.i = fmul double %18, %30 - %add374.i = fadd double %add368.i, %mul373.i - %mul379.i = fmul double %19, %31 - %add380.i = fadd double %add374.i, %mul379.i + %mul307.i = fmul nexc nrnd double %7, %31 + %add308.i = fadd nexc nrnd double %add302.i, %mul307.i + %mul314.i = fmul nexc nrnd double %8, %28 + %mul319.i = fmul nexc nrnd double %9, %29 + %add320.i = fadd nexc nrnd double %mul314.i, %mul319.i + %mul325.i = fmul nexc nrnd double %10, %30 + %add326.i = fadd nexc nrnd double %add320.i, %mul325.i + %mul331.i = fmul nexc nrnd double %11, %31 + %add332.i = fadd nexc nrnd double %add326.i, %mul331.i + %mul338.i = fmul nexc nrnd double %12, %28 + %mul343.i = fmul nexc nrnd double %13, %29 + %add344.i = fadd nexc nrnd double %mul338.i, %mul343.i + %mul349.i = fmul nexc nrnd double %14, %30 + %add350.i = fadd nexc nrnd double %add344.i, %mul349.i + %mul355.i = fmul nexc nrnd double %15, %31 + %add356.i = fadd nexc nrnd double %add350.i, %mul355.i + %mul362.i = fmul nexc nrnd double %16, %28 + %mul367.i = fmul nexc nrnd double %17, %29 + %add368.i = fadd nexc nrnd double %mul362.i, %mul367.i + %mul373.i = fmul nexc nrnd double %18, %30 + %add374.i = fadd nexc nrnd double %add368.i, %mul373.i + %mul379.i = fmul nexc nrnd double %19, %31 + %add380.i = fadd nexc nrnd double %add374.i, %mul379.i store double %add20.i, double* %Out, align 8 %Res.i.sroa.1.8.idx2 = getelementptr inbounds double, double* %Out, i64 1 store double %add44.i, double* %Res.i.sroa.1.8.idx2, align 8 Index: test/CodeGen/X86/negative-sin.ll =================================================================== --- test/CodeGen/X86/negative-sin.ll +++ test/CodeGen/X86/negative-sin.ll @@ -5,8 +5,8 @@ define double @foo(double %e) { - %f = fsub double 0.0, %e + %f = fsub nexc nrnd double 0.0, %e %g = call double @sin(double %f) readonly - %h = fsub double 0.0, %g + %h = fsub nexc nrnd double 0.0, %g ret double %h } Index: test/CodeGen/X86/pr23103.ll =================================================================== --- test/CodeGen/X86/pr23103.ll +++ test/CodeGen/X86/pr23103.ll @@ -16,6 +16,6 @@ entry: %V = load <1 x double>, <1 x double>* %Vp, align 8 %call = call zeroext i1 @foo(<1 x double> %V) - %fadd = fadd <1 x double> %V, undef + %fadd = fadd nexc nrnd <1 x double> %V, undef ret <1 x double> %fadd } Index: test/CodeGen/X86/pr24139.ll =================================================================== --- test/CodeGen/X86/pr24139.ll +++ test/CodeGen/X86/pr24139.ll @@ -9,33 +9,33 @@ define <2 x double> @PR24139(<2 x double> %arg, <2 x double> %arg1, <2 x double> %arg2) { %tmp = bitcast <2 x double> %arg to <4 x float> - %tmp3 = fmul <4 x float> %tmp, + %tmp3 = fmul nexc nrnd <4 x float> %tmp, %tmp4 = bitcast <2 x double> %arg to <4 x i32> %tmp5 = and <4 x i32> %tmp4, %tmp6 = or <4 x i32> %tmp5, %tmp7 = bitcast <4 x i32> %tmp6 to <4 x float> - %tmp8 = fadd <4 x float> %tmp3, %tmp7 + %tmp8 = fadd nexc nrnd <4 x float> %tmp3, %tmp7 %tmp9 = tail call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> %tmp8) #2 %tmp10 = bitcast <4 x i32> %tmp9 to <2 x i64> %tmp11 = tail call <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32> %tmp9) #2 - %tmp12 = fmul <4 x float> %tmp11, - %tmp13 = fsub <4 x float> %tmp, %tmp12 - %tmp14 = fmul <4 x float> %tmp11, - %tmp15 = fsub <4 x float> %tmp13, %tmp14 - %tmp16 = fmul <4 x float> %tmp15, %tmp15 - %tmp17 = fmul <4 x float> %tmp15, %tmp16 - %tmp18 = fmul <4 x float> %tmp16, - %tmp19 = fadd <4 x float> %tmp18, - %tmp20 = fmul <4 x float> %tmp16, - %tmp21 = fadd <4 x float> %tmp20, - %tmp22 = fmul <4 x float> %tmp16, %tmp19 - %tmp23 = fadd <4 x float> %tmp22, - %tmp24 = fmul <4 x float> %tmp16, %tmp21 - %tmp25 = fadd <4 x float> %tmp24, - %tmp26 = fmul <4 x float> %tmp16, %tmp23 - %tmp27 = fadd <4 x float> %tmp26, - %tmp28 = fmul <4 x float> %tmp17, %tmp25 - %tmp29 = fadd <4 x float> %tmp15, %tmp28 + %tmp12 = fmul nexc nrnd <4 x float> %tmp11, + %tmp13 = fsub nexc nrnd <4 x float> %tmp, %tmp12 + %tmp14 = fmul nexc nrnd <4 x float> %tmp11, + %tmp15 = fsub nexc nrnd <4 x float> %tmp13, %tmp14 + %tmp16 = fmul nexc nrnd <4 x float> %tmp15, %tmp15 + %tmp17 = fmul nexc nrnd <4 x float> %tmp15, %tmp16 + %tmp18 = fmul nexc nrnd <4 x float> %tmp16, + %tmp19 = fadd nexc nrnd <4 x float> %tmp18, + %tmp20 = fmul nexc nrnd <4 x float> %tmp16, + %tmp21 = fadd nexc nrnd <4 x float> %tmp20, + %tmp22 = fmul nexc nrnd <4 x float> %tmp16, %tmp19 + %tmp23 = fadd nexc nrnd <4 x float> %tmp22, + %tmp24 = fmul nexc nrnd <4 x float> %tmp16, %tmp21 + %tmp25 = fadd nexc nrnd <4 x float> %tmp24, + %tmp26 = fmul nexc nrnd <4 x float> %tmp16, %tmp23 + %tmp27 = fadd nexc nrnd <4 x float> %tmp26, + %tmp28 = fmul nexc nrnd <4 x float> %tmp17, %tmp25 + %tmp29 = fadd nexc nrnd <4 x float> %tmp15, %tmp28 %tmp30 = and <2 x i64> %tmp10, %tmp31 = bitcast <2 x i64> %tmp30 to <4 x i32> %tmp32 = icmp eq <4 x i32> %tmp31, zeroinitializer @@ -52,33 +52,33 @@ %tmp43 = bitcast <4 x i32> %tmp39 to <4 x float> %tmp44 = tail call <4 x float> @llvm.x86.sse41.blendvps(<4 x float> %tmp42, <4 x float> %tmp35, <4 x float> %tmp43) #2 %tmp45 = bitcast <2 x double> %arg1 to <4 x float> - %tmp46 = fmul <4 x float> %tmp45, + %tmp46 = fmul nexc nrnd <4 x float> %tmp45, %tmp47 = bitcast <2 x double> %arg1 to <4 x i32> %tmp48 = and <4 x i32> %tmp47, %tmp49 = or <4 x i32> %tmp48, %tmp50 = bitcast <4 x i32> %tmp49 to <4 x float> - %tmp51 = fadd <4 x float> %tmp46, %tmp50 + %tmp51 = fadd nexc nrnd <4 x float> %tmp46, %tmp50 %tmp52 = tail call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> %tmp51) #2 %tmp53 = bitcast <4 x i32> %tmp52 to <2 x i64> %tmp54 = tail call <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32> %tmp52) #2 - %tmp55 = fmul <4 x float> %tmp54, - %tmp56 = fsub <4 x float> %tmp45, %tmp55 - %tmp57 = fmul <4 x float> %tmp54, - %tmp58 = fsub <4 x float> %tmp56, %tmp57 - %tmp59 = fmul <4 x float> %tmp58, %tmp58 - %tmp60 = fmul <4 x float> %tmp58, %tmp59 - %tmp61 = fmul <4 x float> %tmp59, - %tmp62 = fadd <4 x float> %tmp61, - %tmp63 = fmul <4 x float> %tmp59, - %tmp64 = fadd <4 x float> %tmp63, - %tmp65 = fmul <4 x float> %tmp59, %tmp62 - %tmp66 = fadd <4 x float> %tmp65, - %tmp67 = fmul <4 x float> %tmp59, %tmp64 - %tmp68 = fadd <4 x float> %tmp67, - %tmp69 = fmul <4 x float> %tmp59, %tmp66 - %tmp70 = fadd <4 x float> %tmp69, - %tmp71 = fmul <4 x float> %tmp60, %tmp68 - %tmp72 = fadd <4 x float> %tmp58, %tmp71 + %tmp55 = fmul nexc nrnd <4 x float> %tmp54, + %tmp56 = fsub nexc nrnd <4 x float> %tmp45, %tmp55 + %tmp57 = fmul nexc nrnd <4 x float> %tmp54, + %tmp58 = fsub nexc nrnd <4 x float> %tmp56, %tmp57 + %tmp59 = fmul nexc nrnd <4 x float> %tmp58, %tmp58 + %tmp60 = fmul nexc nrnd <4 x float> %tmp58, %tmp59 + %tmp61 = fmul nexc nrnd <4 x float> %tmp59, + %tmp62 = fadd nexc nrnd <4 x float> %tmp61, + %tmp63 = fmul nexc nrnd <4 x float> %tmp59, + %tmp64 = fadd nexc nrnd <4 x float> %tmp63, + %tmp65 = fmul nexc nrnd <4 x float> %tmp59, %tmp62 + %tmp66 = fadd nexc nrnd <4 x float> %tmp65, + %tmp67 = fmul nexc nrnd <4 x float> %tmp59, %tmp64 + %tmp68 = fadd nexc nrnd <4 x float> %tmp67, + %tmp69 = fmul nexc nrnd <4 x float> %tmp59, %tmp66 + %tmp70 = fadd nexc nrnd <4 x float> %tmp69, + %tmp71 = fmul nexc nrnd <4 x float> %tmp60, %tmp68 + %tmp72 = fadd nexc nrnd <4 x float> %tmp58, %tmp71 %tmp73 = and <2 x i64> %tmp53, %tmp74 = bitcast <2 x i64> %tmp73 to <4 x i32> %tmp75 = icmp eq <4 x i32> %tmp74, zeroinitializer @@ -94,35 +94,35 @@ %tmp85 = bitcast <4 x i32> %tmp84 to <4 x float> %tmp86 = bitcast <4 x i32> %tmp82 to <4 x float> %tmp87 = tail call <4 x float> @llvm.x86.sse41.blendvps(<4 x float> %tmp85, <4 x float> %tmp78, <4 x float> %tmp86) #2 - %tmp88 = fadd <4 x float> %tmp44, %tmp87 + %tmp88 = fadd nexc nrnd <4 x float> %tmp44, %tmp87 %tmp89 = bitcast <2 x double> %arg2 to <4 x float> - %tmp90 = fmul <4 x float> %tmp89, + %tmp90 = fmul nexc nrnd <4 x float> %tmp89, %tmp91 = bitcast <2 x double> %arg2 to <4 x i32> %tmp92 = and <4 x i32> %tmp91, %tmp93 = or <4 x i32> %tmp92, %tmp94 = bitcast <4 x i32> %tmp93 to <4 x float> - %tmp95 = fadd <4 x float> %tmp90, %tmp94 + %tmp95 = fadd nexc nrnd <4 x float> %tmp90, %tmp94 %tmp96 = tail call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> %tmp95) #2 %tmp97 = bitcast <4 x i32> %tmp96 to <2 x i64> %tmp98 = tail call <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32> %tmp96) #2 - %tmp99 = fmul <4 x float> %tmp98, - %tmp100 = fsub <4 x float> %tmp89, %tmp99 - %tmp101 = fmul <4 x float> %tmp98, - %tmp102 = fsub <4 x float> %tmp100, %tmp101 - %tmp103 = fmul <4 x float> %tmp102, %tmp102 - %tmp104 = fmul <4 x float> %tmp102, %tmp103 - %tmp105 = fmul <4 x float> %tmp103, - %tmp106 = fadd <4 x float> %tmp105, - %tmp107 = fmul <4 x float> %tmp103, - %tmp108 = fadd <4 x float> %tmp107, - %tmp109 = fmul <4 x float> %tmp103, %tmp106 - %tmp110 = fadd <4 x float> %tmp109, - %tmp111 = fmul <4 x float> %tmp103, %tmp108 - %tmp112 = fadd <4 x float> %tmp111, - %tmp113 = fmul <4 x float> %tmp103, %tmp110 - %tmp114 = fadd <4 x float> %tmp113, - %tmp115 = fmul <4 x float> %tmp104, %tmp112 - %tmp116 = fadd <4 x float> %tmp102, %tmp115 + %tmp99 = fmul nexc nrnd <4 x float> %tmp98, + %tmp100 = fsub nexc nrnd <4 x float> %tmp89, %tmp99 + %tmp101 = fmul nexc nrnd <4 x float> %tmp98, + %tmp102 = fsub nexc nrnd <4 x float> %tmp100, %tmp101 + %tmp103 = fmul nexc nrnd <4 x float> %tmp102, %tmp102 + %tmp104 = fmul nexc nrnd <4 x float> %tmp102, %tmp103 + %tmp105 = fmul nexc nrnd <4 x float> %tmp103, + %tmp106 = fadd nexc nrnd <4 x float> %tmp105, + %tmp107 = fmul nexc nrnd <4 x float> %tmp103, + %tmp108 = fadd nexc nrnd <4 x float> %tmp107, + %tmp109 = fmul nexc nrnd <4 x float> %tmp103, %tmp106 + %tmp110 = fadd nexc nrnd <4 x float> %tmp109, + %tmp111 = fmul nexc nrnd <4 x float> %tmp103, %tmp108 + %tmp112 = fadd nexc nrnd <4 x float> %tmp111, + %tmp113 = fmul nexc nrnd <4 x float> %tmp103, %tmp110 + %tmp114 = fadd nexc nrnd <4 x float> %tmp113, + %tmp115 = fmul nexc nrnd <4 x float> %tmp104, %tmp112 + %tmp116 = fadd nexc nrnd <4 x float> %tmp102, %tmp115 %tmp117 = and <2 x i64> %tmp97, %tmp118 = bitcast <2 x i64> %tmp117 to <4 x i32> %tmp119 = icmp eq <4 x i32> %tmp118, zeroinitializer @@ -138,7 +138,7 @@ %tmp129 = bitcast <4 x i32> %tmp128 to <4 x float> %tmp130 = bitcast <4 x i32> %tmp126 to <4 x float> %tmp131 = tail call <4 x float> @llvm.x86.sse41.blendvps(<4 x float> %tmp129, <4 x float> %tmp122, <4 x float> %tmp130) #2 - %tmp132 = fadd <4 x float> %tmp88, %tmp131 + %tmp132 = fadd nexc nrnd <4 x float> %tmp88, %tmp131 %tmp133 = bitcast <4 x float> %tmp132 to <2 x double> ret <2 x double> %tmp133 } Index: test/CodeGen/X86/select.ll =================================================================== --- test/CodeGen/X86/select.ll +++ test/CodeGen/X86/select.ll @@ -84,12 +84,12 @@ define void @test6(i32 %C, <4 x float>* %A, <4 x float>* %B) nounwind { %tmp = load <4 x float>, <4 x float>* %A ; <<4 x float>> [#uses=1] %tmp3 = load <4 x float>, <4 x float>* %B ; <<4 x float>> [#uses=2] - %tmp9 = fmul <4 x float> %tmp3, %tmp3 ; <<4 x float>> [#uses=1] + %tmp9 = fmul nexc nrnd <4 x float> %tmp3, %tmp3 ; <<4 x float>> [#uses=1] %tmp.upgrd.1 = icmp eq i32 %C, 0 ; [#uses=1] %iftmp.38.0 = select i1 %tmp.upgrd.1, <4 x float> %tmp9, <4 x float> %tmp ; <<4 x float>> [#uses=1] store <4 x float> %iftmp.38.0, <4 x float>* %A ret void -; Verify that the fmul gets sunk into the one part of the diamond where it is +; Verify that the fmul nexc nrnd gets sunk into the one part of the diamond where it is ; needed. ; CHECK-LABEL: test6: ; CHECK: je @@ -398,6 +398,6 @@ br i1 %Cmp60, label %CF242, label %CF244 CF244: - %B122 = fadd float %Sl59, undef + %B122 = fadd nexc nrnd float %Sl59, undef ret void } Index: test/CodeGen/X86/sincos-opt.ll =================================================================== --- test/CodeGen/X86/sincos-opt.ll +++ test/CodeGen/X86/sincos-opt.ll @@ -23,7 +23,7 @@ ; OSX_NOOPT: callq _cosf %call = tail call float @sinf(float %x) nounwind readnone %call1 = tail call float @cosf(float %x) nounwind readnone - %add = fadd float %call, %call1 + %add = fadd nexc nrnd float %call, %call1 ret float %add } @@ -43,7 +43,7 @@ ; OSX_NOOPT: callq _cos %call = tail call double @sin(double %x) nounwind readnone %call1 = tail call double @cos(double %x) nounwind readnone - %add = fadd double %call, %call1 + %add = fadd nexc nrnd double %call, %call1 ret double %add } @@ -55,7 +55,7 @@ ; GNU_SINCOS: ret %call = tail call x86_fp80 @sinl(x86_fp80 %x) nounwind %call1 = tail call x86_fp80 @cosl(x86_fp80 %x) nounwind - %add = fadd x86_fp80 %call, %call1 + %add = fadd nexc nrnd x86_fp80 %call, %call1 ret x86_fp80 %add } Index: test/CodeGen/X86/sink-hoist.ll =================================================================== --- test/CodeGen/X86/sink-hoist.ll +++ test/CodeGen/X86/sink-hoist.ll @@ -14,8 +14,8 @@ ; CHECK: divsd define double @foo(double %x, double %y, i1 %c) nounwind { - %a = fdiv double %x, 3.2 - %b = fdiv double %y, 3.3 + %a = fdiv nexc nrnd double %x, 3.2 + %b = fdiv nexc nrnd double %y, 3.3 %z = select i1 %c, double %a, double %b ret double %z } @@ -31,7 +31,7 @@ ; CHECK: movapd ; CHECK: ret define double @split(double %x, double %y, i1 %c) nounwind { - %a = fdiv double %x, 3.2 + %a = fdiv nexc nrnd double %x, 3.2 %z = select i1 %c, double %a, double %y ret double %z } @@ -51,7 +51,7 @@ %i.03 = phi i64 [ 0, %entry ], [ %3, %bb ] %scevgep = getelementptr double, double* %p, i64 %i.03 %1 = load double, double* %scevgep, align 8 - %2 = fdiv double 3.200000e+00, %1 + %2 = fdiv nexc nrnd double 3.200000e+00, %1 store double %2, double* %scevgep, align 8 %3 = add nsw i64 %i.03, 1 %exitcond = icmp eq i64 %3, %n @@ -116,12 +116,12 @@ %tmp37 = and <4 x i32> %tmp36, ; <<4 x i32>> [#uses=1] %tmp42 = or <4 x i32> %tmp37, %tmp27 ; <<4 x i32>> [#uses=1] %tmp43 = bitcast <4 x i32> %tmp42 to <4 x float> ; <<4 x float>> [#uses=2] - %tmp45 = fadd <4 x float> %1, %tmp43 ; <<4 x float>> [#uses=1] - %tmp47 = fsub <4 x float> %tmp45, %tmp43 ; <<4 x float>> [#uses=2] + %tmp45 = fadd nexc nrnd <4 x float> %1, %tmp43 ; <<4 x float>> [#uses=1] + %tmp47 = fsub nexc nrnd <4 x float> %tmp45, %tmp43 ; <<4 x float>> [#uses=2] %tmp49 = call <4 x float> @llvm.x86.sse.cmp.ps(<4 x float> %1, <4 x float> %tmp47, i8 1) ; <<4 x float>> [#uses=1] %2 = bitcast <4 x float> %tmp49 to <4 x i32> ; <<4 x i32>> [#uses=1] %3 = call <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32> %2) nounwind readnone ; <<4 x float>> [#uses=1] - %tmp53 = fadd <4 x float> %tmp47, %3 ; <<4 x float>> [#uses=1] + %tmp53 = fadd nexc nrnd <4 x float> %tmp47, %3 ; <<4 x float>> [#uses=1] %tmp55 = bitcast <4 x float> %tmp53 to <4 x i32> ; <<4 x i32>> [#uses=1] %tmp57 = or <4 x i32> %tmp55, %tmp27 ; <<4 x i32>> [#uses=1] %tmp58 = bitcast <4 x i32> %tmp57 to <4 x float> ; <<4 x float>> [#uses=1] Index: test/CodeGen/X86/sse-fcopysign.ll =================================================================== --- test/CodeGen/X86/sse-fcopysign.ll +++ test/CodeGen/X86/sse-fcopysign.ll @@ -40,7 +40,7 @@ ; X64: addss %xmm2, %xmm1 ; X64-NEXT: cvtss2sd %xmm1, %xmm1 ; X64-NEXT: jmp copysign - %tmp1 = fadd float %b, %c + %tmp1 = fadd nexc nrnd float %b, %c %tmp2 = fpext float %tmp1 to double %tmp = tail call double @copysign( double %a, double %tmp2 ) ret double %tmp @@ -96,7 +96,7 @@ ; X64-NEXT: andpd .LCPI3_1(%rip), %xmm0 ; X64-NEXT: orpd %xmm1, %xmm0 ; X64-NEXT: retq - %tmp1 = fadd float %b, %c + %tmp1 = fadd nexc nrnd float %b, %c %tmp2 = fpext float %tmp1 to double %tmp = tail call double @llvm.copysign.f64( double %a, double %tmp2 ) ret double %tmp @@ -124,7 +124,7 @@ ; X64-LABEL: @cst2 ; X64: movsd .LCPI5_0(%rip), %xmm0 {{.*#+}} xmm0 = mem[0],zero ; X64-NEXT: retq - %tmp1 = fadd float -1.0, -1.0 + %tmp1 = fadd nexc nrnd float -1.0, -1.0 %tmp2 = fpext float %tmp1 to double %tmp = tail call double @llvm.copysign.f64( double 0.0, double %tmp2 ) ret double %tmp Index: test/CodeGen/X86/sse1.ll =================================================================== --- test/CodeGen/X86/sse1.ll +++ test/CodeGen/X86/sse1.ll @@ -26,8 +26,8 @@ %tmp5 = extractelement <2 x float> %A, i32 1 %tmp3 = extractelement <2 x float> %B, i32 0 %tmp1 = extractelement <2 x float> %B, i32 1 - %add.r = fadd float %tmp7, %tmp3 - %add.i = fsub float %tmp5, %tmp1 + %add.r = fadd nexc nrnd float %tmp7, %tmp3 + %add.i = fsub nexc nrnd float %tmp5, %tmp1 %tmp11 = insertelement <2 x float> undef, float %add.r, i32 0 %tmp9 = insertelement <2 x float> %tmp11, float %add.i, i32 1 ret <2 x float> %tmp9 Index: test/CodeGen/X86/sse3-avx-addsub-2.ll =================================================================== --- test/CodeGen/X86/sse3-avx-addsub-2.ll +++ test/CodeGen/X86/sse3-avx-addsub-2.ll @@ -17,16 +17,16 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 0 %2 = extractelement <4 x float> %B, i32 0 - %sub = fsub float %1, %2 + %sub = fsub nexc nrnd float %1, %2 %3 = extractelement <4 x float> %A, i32 2 %4 = extractelement <4 x float> %B, i32 2 - %sub2 = fsub float %3, %4 + %sub2 = fsub nexc nrnd float %3, %4 %5 = extractelement <4 x float> %A, i32 1 %6 = extractelement <4 x float> %B, i32 1 - %add = fadd float %5, %6 + %add = fadd nexc nrnd float %5, %6 %7 = extractelement <4 x float> %A, i32 3 %8 = extractelement <4 x float> %B, i32 3 - %add2 = fadd float %7, %8 + %add2 = fadd nexc nrnd float %7, %8 %vecinsert1 = insertelement <4 x float> undef, float %add, i32 1 %vecinsert2 = insertelement <4 x float> %vecinsert1, float %add2, i32 3 %vecinsert3 = insertelement <4 x float> %vecinsert2, float %sub, i32 0 @@ -46,10 +46,10 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 2 %2 = extractelement <4 x float> %B, i32 2 - %sub2 = fsub float %1, %2 + %sub2 = fsub nexc nrnd float %1, %2 %3 = extractelement <4 x float> %A, i32 3 %4 = extractelement <4 x float> %B, i32 3 - %add2 = fadd float %3, %4 + %add2 = fadd nexc nrnd float %3, %4 %vecinsert1 = insertelement <4 x float> undef, float %sub2, i32 2 %vecinsert2 = insertelement <4 x float> %vecinsert1, float %add2, i32 3 ret <4 x float> %vecinsert2 @@ -67,10 +67,10 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 0 %2 = extractelement <4 x float> %B, i32 0 - %sub = fsub float %1, %2 + %sub = fsub nexc nrnd float %1, %2 %3 = extractelement <4 x float> %A, i32 3 %4 = extractelement <4 x float> %B, i32 3 - %add = fadd float %4, %3 + %add = fadd nexc nrnd float %4, %3 %vecinsert1 = insertelement <4 x float> undef, float %sub, i32 0 %vecinsert2 = insertelement <4 x float> %vecinsert1, float %add, i32 3 ret <4 x float> %vecinsert2 @@ -88,10 +88,10 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 2 %2 = extractelement <4 x float> %B, i32 2 - %sub = fsub float %1, %2 + %sub = fsub nexc nrnd float %1, %2 %3 = extractelement <4 x float> %A, i32 1 %4 = extractelement <4 x float> %B, i32 1 - %add = fadd float %3, %4 + %add = fadd nexc nrnd float %3, %4 %vecinsert1 = insertelement <4 x float> undef, float %sub, i32 2 %vecinsert2 = insertelement <4 x float> %vecinsert1, float %add, i32 1 ret <4 x float> %vecinsert2 @@ -109,10 +109,10 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 0 %2 = extractelement <4 x float> %B, i32 0 - %sub2 = fsub float %1, %2 + %sub2 = fsub nexc nrnd float %1, %2 %3 = extractelement <4 x float> %A, i32 1 %4 = extractelement <4 x float> %B, i32 1 - %add2 = fadd float %3, %4 + %add2 = fadd nexc nrnd float %3, %4 %vecinsert1 = insertelement <4 x float> undef, float %sub2, i32 0 %vecinsert2 = insertelement <4 x float> %vecinsert1, float %add2, i32 1 ret <4 x float> %vecinsert2 @@ -130,16 +130,16 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 0 %2 = extractelement <4 x float> %B, i32 0 - %sub = fsub float %1, %2 + %sub = fsub nexc nrnd float %1, %2 %3 = extractelement <4 x float> %A, i32 2 %4 = extractelement <4 x float> %B, i32 2 - %sub2 = fsub float %3, %4 + %sub2 = fsub nexc nrnd float %3, %4 %5 = extractelement <4 x float> %A, i32 1 %6 = extractelement <4 x float> %B, i32 1 - %add = fadd float %5, %6 + %add = fadd nexc nrnd float %5, %6 %7 = extractelement <4 x float> %A, i32 3 %8 = extractelement <4 x float> %B, i32 3 - %add2 = fadd float %7, %8 + %add2 = fadd nexc nrnd float %7, %8 %vecinsert1 = insertelement <4 x float> undef, float %add, i32 1 %vecinsert2 = insertelement <4 x float> %vecinsert1, float %add2, i32 3 %vecinsert3 = insertelement <4 x float> %vecinsert2, float %sub, i32 0 @@ -160,16 +160,16 @@ ; AVX-NEXT: retq %1 = extractelement <4 x double> %A, i32 0 %2 = extractelement <4 x double> %B, i32 0 - %sub = fsub double %1, %2 + %sub = fsub nexc nrnd double %1, %2 %3 = extractelement <4 x double> %A, i32 2 %4 = extractelement <4 x double> %B, i32 2 - %sub2 = fsub double %3, %4 + %sub2 = fsub nexc nrnd double %3, %4 %5 = extractelement <4 x double> %A, i32 1 %6 = extractelement <4 x double> %B, i32 1 - %add = fadd double %5, %6 + %add = fadd nexc nrnd double %5, %6 %7 = extractelement <4 x double> %A, i32 3 %8 = extractelement <4 x double> %B, i32 3 - %add2 = fadd double %7, %8 + %add2 = fadd nexc nrnd double %7, %8 %vecinsert1 = insertelement <4 x double> undef, double %add, i32 1 %vecinsert2 = insertelement <4 x double> %vecinsert1, double %add2, i32 3 %vecinsert3 = insertelement <4 x double> %vecinsert2, double %sub, i32 0 @@ -189,10 +189,10 @@ ; AVX-NEXT: retq %1 = extractelement <2 x double> %A, i32 0 %2 = extractelement <2 x double> %B, i32 0 - %sub = fsub double %1, %2 + %sub = fsub nexc nrnd double %1, %2 %3 = extractelement <2 x double> %A, i32 1 %4 = extractelement <2 x double> %B, i32 1 - %add = fadd double %3, %4 + %add = fadd nexc nrnd double %3, %4 %vecinsert1 = insertelement <2 x double> undef, double %sub, i32 0 %vecinsert2 = insertelement <2 x double> %vecinsert1, double %add, i32 1 ret <2 x double> %vecinsert2 @@ -211,28 +211,28 @@ ; AVX-NEXT: retq %1 = extractelement <8 x float> %A, i32 0 %2 = extractelement <8 x float> %B, i32 0 - %sub = fsub float %1, %2 + %sub = fsub nexc nrnd float %1, %2 %3 = extractelement <8 x float> %A, i32 2 %4 = extractelement <8 x float> %B, i32 2 - %sub2 = fsub float %3, %4 + %sub2 = fsub nexc nrnd float %3, %4 %5 = extractelement <8 x float> %A, i32 1 %6 = extractelement <8 x float> %B, i32 1 - %add = fadd float %5, %6 + %add = fadd nexc nrnd float %5, %6 %7 = extractelement <8 x float> %A, i32 3 %8 = extractelement <8 x float> %B, i32 3 - %add2 = fadd float %7, %8 + %add2 = fadd nexc nrnd float %7, %8 %9 = extractelement <8 x float> %A, i32 4 %10 = extractelement <8 x float> %B, i32 4 - %sub3 = fsub float %9, %10 + %sub3 = fsub nexc nrnd float %9, %10 %11 = extractelement <8 x float> %A, i32 6 %12 = extractelement <8 x float> %B, i32 6 - %sub4 = fsub float %11, %12 + %sub4 = fsub nexc nrnd float %11, %12 %13 = extractelement <8 x float> %A, i32 5 %14 = extractelement <8 x float> %B, i32 5 - %add3 = fadd float %13, %14 + %add3 = fadd nexc nrnd float %13, %14 %15 = extractelement <8 x float> %A, i32 7 %16 = extractelement <8 x float> %B, i32 7 - %add4 = fadd float %15, %16 + %add4 = fadd nexc nrnd float %15, %16 %vecinsert1 = insertelement <8 x float> undef, float %add, i32 1 %vecinsert2 = insertelement <8 x float> %vecinsert1, float %add2, i32 3 %vecinsert3 = insertelement <8 x float> %vecinsert2, float %sub, i32 0 @@ -259,7 +259,7 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 0 %2 = extractelement <4 x float> %B, i32 0 - %sub = fsub float %1, %2 + %sub = fsub nexc nrnd float %1, %2 %vecinsert1 = insertelement <4 x float> undef, float %sub, i32 0 ret <4 x float> %vecinsert1 } @@ -282,7 +282,7 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 2 %2 = extractelement <4 x float> %B, i32 2 - %sub = fsub float %1, %2 + %sub = fsub nexc nrnd float %1, %2 %vecinsert1 = insertelement <4 x float> undef, float %sub, i32 2 ret <4 x float> %vecinsert1 } @@ -305,7 +305,7 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 1 %2 = extractelement <4 x float> %B, i32 1 - %add = fadd float %1, %2 + %add = fadd nexc nrnd float %1, %2 %vecinsert1 = insertelement <4 x float> undef, float %add, i32 1 ret <4 x float> %vecinsert1 } @@ -329,7 +329,7 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 3 %2 = extractelement <4 x float> %B, i32 3 - %add = fadd float %1, %2 + %add = fadd nexc nrnd float %1, %2 %vecinsert1 = insertelement <4 x float> undef, float %add, i32 3 ret <4 x float> %vecinsert1 } @@ -357,10 +357,10 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 0 %2 = extractelement <4 x float> %B, i32 0 - %sub = fsub float %1, %2 + %sub = fsub nexc nrnd float %1, %2 %3 = extractelement <4 x float> %A, i32 2 %4 = extractelement <4 x float> %B, i32 2 - %sub2 = fsub float %3, %4 + %sub2 = fsub nexc nrnd float %3, %4 %vecinsert1 = insertelement <4 x float> undef, float %sub, i32 0 %vecinsert2 = insertelement <4 x float> %vecinsert1, float %sub2, i32 2 ret <4 x float> %vecinsert2 @@ -393,10 +393,10 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 1 %2 = extractelement <4 x float> %B, i32 1 - %add = fadd float %1, %2 + %add = fadd nexc nrnd float %1, %2 %3 = extractelement <4 x float> %A, i32 3 %4 = extractelement <4 x float> %B, i32 3 - %add2 = fadd float %3, %4 + %add2 = fadd nexc nrnd float %3, %4 %vecinsert1 = insertelement <4 x float> undef, float %add, i32 1 %vecinsert2 = insertelement <4 x float> %vecinsert1, float %add2, i32 3 ret <4 x float> %vecinsert2 @@ -440,16 +440,16 @@ ; AVX-NEXT: retq %1 = extractelement <4 x float> %A, i32 0 %2 = extractelement <4 x float> %B, i32 0 - %sub = fsub float %1, undef + %sub = fsub nexc nrnd float %1, undef %3 = extractelement <4 x float> %A, i32 2 %4 = extractelement <4 x float> %B, i32 2 - %sub2 = fsub float %3, %4 + %sub2 = fsub nexc nrnd float %3, %4 %5 = extractelement <4 x float> %A, i32 1 %6 = extractelement <4 x float> %B, i32 1 - %add = fadd float %5, undef + %add = fadd nexc nrnd float %5, undef %7 = extractelement <4 x float> %A, i32 3 %8 = extractelement <4 x float> %B, i32 3 - %add2 = fadd float %7, %8 + %add2 = fadd nexc nrnd float %7, %8 %vecinsert1 = insertelement <4 x float> undef, float %add, i32 1 %vecinsert2 = insertelement <4 x float> %vecinsert1, float %add2, i32 3 %vecinsert3 = insertelement <4 x float> %vecinsert2, float %sub, i32 0 @@ -471,8 +471,8 @@ %v3 = extractelement <2 x float> %v1, i32 0 %v4 = extractelement <2 x float> %v0, i32 1 %v5 = extractelement <2 x float> %v1, i32 1 - %sub = fsub float %v2, %v3 - %add = fadd float %v5, %v4 + %sub = fsub nexc nrnd float %v2, %v3 + %add = fadd nexc nrnd float %v5, %v4 %res0 = insertelement <2 x float> undef, float %sub, i32 0 %res1 = insertelement <2 x float> %res0, float %add, i32 1 ret <2 x float> %res1 Index: test/CodeGen/X86/sse3-avx-addsub.ll =================================================================== --- test/CodeGen/X86/sse3-avx-addsub.ll +++ test/CodeGen/X86/sse3-avx-addsub.ll @@ -45,8 +45,8 @@ ; AVX: # BB#0: ; AVX-NEXT: vaddsubps %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %sub = fsub <4 x float> %A, %B - %add = fadd <4 x float> %A, %B + %sub = fsub nexc nrnd <4 x float> %A, %B + %add = fadd nexc nrnd <4 x float> %A, %B %vecinit6 = shufflevector <4 x float> %sub, <4 x float> %add, <4 x i32> ret <4 x float> %vecinit6 } @@ -62,8 +62,8 @@ ; AVX: # BB#0: ; AVX-NEXT: vaddsubps %ymm1, %ymm0, %ymm0 ; AVX-NEXT: retq - %sub = fsub <8 x float> %A, %B - %add = fadd <8 x float> %A, %B + %sub = fsub nexc nrnd <8 x float> %A, %B + %add = fadd nexc nrnd <8 x float> %A, %B %vecinit14 = shufflevector <8 x float> %sub, <8 x float> %add, <8 x i32> ret <8 x float> %vecinit14 } @@ -79,8 +79,8 @@ ; AVX: # BB#0: ; AVX-NEXT: vaddsubpd %ymm1, %ymm0, %ymm0 ; AVX-NEXT: retq - %sub = fsub <4 x double> %A, %B - %add = fadd <4 x double> %A, %B + %sub = fsub nexc nrnd <4 x double> %A, %B + %add = fadd nexc nrnd <4 x double> %A, %B %vecinit6 = shufflevector <4 x double> %sub, <4 x double> %add, <4 x i32> ret <4 x double> %vecinit6 } @@ -95,8 +95,8 @@ ; AVX: # BB#0: ; AVX-NEXT: vaddsubpd %xmm1, %xmm0, %xmm0 ; AVX-NEXT: retq - %add = fadd <2 x double> %A, %B - %sub = fsub <2 x double> %A, %B + %add = fadd nexc nrnd <2 x double> %A, %B + %sub = fsub nexc nrnd <2 x double> %A, %B %vecinit2 = shufflevector <2 x double> %sub, <2 x double> %add, <2 x i32> ret <2 x double> %vecinit2 } @@ -112,8 +112,8 @@ ; AVX-NEXT: vaddsubps (%rdi), %xmm0, %xmm0 ; AVX-NEXT: retq %1 = load <4 x float>, <4 x float>* %B - %add = fadd <4 x float> %A, %1 - %sub = fsub <4 x float> %A, %1 + %add = fadd nexc nrnd <4 x float> %A, %1 + %sub = fsub nexc nrnd <4 x float> %A, %1 %vecinit6 = shufflevector <4 x float> %sub, <4 x float> %add, <4 x i32> ret <4 x float> %vecinit6 } @@ -130,8 +130,8 @@ ; AVX-NEXT: vaddsubps (%rdi), %ymm0, %ymm0 ; AVX-NEXT: retq %1 = load <8 x float>, <8 x float>* %B - %add = fadd <8 x float> %A, %1 - %sub = fsub <8 x float> %A, %1 + %add = fadd nexc nrnd <8 x float> %A, %1 + %sub = fsub nexc nrnd <8 x float> %A, %1 %vecinit14 = shufflevector <8 x float> %sub, <8 x float> %add, <8 x i32> ret <8 x float> %vecinit14 } @@ -148,8 +148,8 @@ ; AVX-NEXT: vaddsubpd (%rdi), %ymm0, %ymm0 ; AVX-NEXT: retq %1 = load <4 x double>, <4 x double>* %B - %add = fadd <4 x double> %A, %1 - %sub = fsub <4 x double> %A, %1 + %add = fadd nexc nrnd <4 x double> %A, %1 + %sub = fsub nexc nrnd <4 x double> %A, %1 %vecinit6 = shufflevector <4 x double> %sub, <4 x double> %add, <4 x i32> ret <4 x double> %vecinit6 } @@ -165,8 +165,8 @@ ; AVX-NEXT: vaddsubpd (%rdi), %xmm0, %xmm0 ; AVX-NEXT: retq %1 = load <2 x double>, <2 x double>* %B - %sub = fsub <2 x double> %A, %1 - %add = fadd <2 x double> %A, %1 + %sub = fsub nexc nrnd <2 x double> %A, %1 + %add = fadd nexc nrnd <2 x double> %A, %1 %vecinit2 = shufflevector <2 x double> %sub, <2 x double> %add, <2 x i32> ret <2 x double> %vecinit2 } @@ -182,8 +182,8 @@ ; AVX-NEXT: vaddsubps (%rdi), %xmm0, %xmm0 ; AVX-NEXT: retq %1 = load <4 x float>, <4 x float>* %B - %add = fadd <4 x float> %A, %1 - %sub = fsub <4 x float> %A, %1 + %add = fadd nexc nrnd <4 x float> %A, %1 + %sub = fsub nexc nrnd <4 x float> %A, %1 %vecinit6 = shufflevector <4 x float> %add, <4 x float> %sub, <4 x i32> ret <4 x float> %vecinit6 } @@ -200,8 +200,8 @@ ; AVX-NEXT: vaddsubps (%rdi), %ymm0, %ymm0 ; AVX-NEXT: retq %1 = load <8 x float>, <8 x float>* %B - %add = fadd <8 x float> %A, %1 - %sub = fsub <8 x float> %A, %1 + %add = fadd nexc nrnd <8 x float> %A, %1 + %sub = fsub nexc nrnd <8 x float> %A, %1 %vecinit14 = shufflevector <8 x float> %add, <8 x float> %sub, <8 x i32> ret <8 x float> %vecinit14 } @@ -218,8 +218,8 @@ ; AVX-NEXT: vaddsubpd (%rdi), %ymm0, %ymm0 ; AVX-NEXT: retq %1 = load <4 x double>, <4 x double>* %B - %add = fadd <4 x double> %A, %1 - %sub = fsub <4 x double> %A, %1 + %add = fadd nexc nrnd <4 x double> %A, %1 + %sub = fsub nexc nrnd <4 x double> %A, %1 %vecinit6 = shufflevector <4 x double> %add, <4 x double> %sub, <4 x i32> ret <4 x double> %vecinit6 } @@ -235,8 +235,8 @@ ; AVX-NEXT: vaddsubpd (%rdi), %xmm0, %xmm0 ; AVX-NEXT: retq %1 = load <2 x double>, <2 x double>* %B - %sub = fsub <2 x double> %A, %1 - %add = fadd <2 x double> %A, %1 + %sub = fsub nexc nrnd <2 x double> %A, %1 + %add = fadd nexc nrnd <2 x double> %A, %1 %vecinit2 = shufflevector <2 x double> %add, <2 x double> %sub, <2 x i32> ret <2 x double> %vecinit2 } Index: test/CodeGen/X86/sse41.ll =================================================================== --- test/CodeGen/X86/sse41.ll +++ test/CodeGen/X86/sse41.ll @@ -104,7 +104,7 @@ ; X64-NEXT: addss {{.*}}(%rip), %xmm0 ; X64-NEXT: retq %s = extractelement <4 x float> %v, i32 3 - %t = fadd float %s, 1.0 + %t = fadd nexc nrnd float %s, 1.0 ret float %t } define float @ext_2(<4 x float> %v) nounwind { @@ -289,8 +289,8 @@ %tmp5 = extractelement <2 x float> %A, i32 1 %tmp3 = extractelement <2 x float> %B, i32 0 %tmp1 = extractelement <2 x float> %B, i32 1 - %add.r = fadd float %tmp7, %tmp3 - %add.i = fadd float %tmp5, %tmp1 + %add.r = fadd nexc nrnd float %tmp7, %tmp3 + %add.i = fadd nexc nrnd float %tmp5, %tmp1 %tmp11 = insertelement <2 x float> undef, float %add.r, i32 0 %tmp9 = insertelement <2 x float> %tmp11, float %add.i, i32 1 ret <2 x float> %tmp9 @@ -935,9 +935,9 @@ %8 = tail call <4 x float> @llvm.x86.sse41.insertps(<4 x float> %b, <4 x float> %6, i32 48) %9 = tail call <4 x float> @llvm.x86.sse41.insertps(<4 x float> %c, <4 x float> %6, i32 48) %10 = tail call <4 x float> @llvm.x86.sse41.insertps(<4 x float> %d, <4 x float> %6, i32 48) - %11 = fadd <4 x float> %7, %8 - %12 = fadd <4 x float> %9, %10 - %13 = fadd <4 x float> %11, %12 + %11 = fadd nexc nrnd <4 x float> %7, %8 + %12 = fadd nexc nrnd <4 x float> %9, %10 + %13 = fadd nexc nrnd <4 x float> %11, %12 ret <4 x float> %13 } Index: test/CodeGen/X86/stack-folding-fp-avx1.ll =================================================================== --- test/CodeGen/X86/stack-folding-fp-avx1.ll +++ test/CodeGen/X86/stack-folding-fp-avx1.ll @@ -12,7 +12,7 @@ ;CHECK-LABEL: stack_fold_addpd ;CHECK: vaddpd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fadd <2 x double> %a0, %a1 + %2 = fadd nexc nrnd <2 x double> %a0, %a1 ret <2 x double> %2 } @@ -20,7 +20,7 @@ ;CHECK-LABEL: stack_fold_addpd_ymm ;CHECK: vaddpd {{-?[0-9]*}}(%rsp), {{%ymm[0-9][0-9]*}}, {{%ymm[0-9][0-9]*}} {{.*#+}} 32-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fadd <4 x double> %a0, %a1 + %2 = fadd nexc nrnd <4 x double> %a0, %a1 ret <4 x double> %2 } @@ -28,7 +28,7 @@ ;CHECK-LABEL: stack_fold_addps ;CHECK: vaddps {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fadd <4 x float> %a0, %a1 + %2 = fadd nexc nrnd <4 x float> %a0, %a1 ret <4 x float> %2 } @@ -36,7 +36,7 @@ ;CHECK-LABEL: stack_fold_addps_ymm ;CHECK: vaddps {{-?[0-9]*}}(%rsp), {{%ymm[0-9][0-9]*}}, {{%ymm[0-9][0-9]*}} {{.*#+}} 32-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fadd <8 x float> %a0, %a1 + %2 = fadd nexc nrnd <8 x float> %a0, %a1 ret <8 x float> %2 } @@ -44,7 +44,7 @@ ;CHECK-LABEL: stack_fold_addsd ;CHECK: vaddsd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 8-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fadd double %a0, %a1 + %2 = fadd nexc nrnd double %a0, %a1 ret double %2 } @@ -61,7 +61,7 @@ ;CHECK-LABEL: stack_fold_addss ;CHECK: vaddss {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fadd float %a0, %a1 + %2 = fadd nexc nrnd float %a0, %a1 ret float %2 } @@ -120,7 +120,7 @@ %5 = and <2 x i64> %4, %3 %6 = bitcast <2 x i64> %5 to <2 x double> ; fadd forces execution domain - %7 = fadd <2 x double> %6, + %7 = fadd nexc nrnd <2 x double> %6, ret <2 x double> %7 } @@ -134,7 +134,7 @@ %5 = and <4 x i64> %4, %3 %6 = bitcast <4 x i64> %5 to <4 x double> ; fadd forces execution domain - %7 = fadd <4 x double> %6, + %7 = fadd nexc nrnd <4 x double> %6, ret <4 x double> %7 } @@ -148,7 +148,7 @@ %5 = and <2 x i64> %4, %3 %6 = bitcast <2 x i64> %5 to <4 x float> ; fadd forces execution domain - %7 = fadd <4 x float> %6, + %7 = fadd nexc nrnd <4 x float> %6, ret <4 x float> %7 } @@ -162,7 +162,7 @@ %5 = and <4 x i64> %4, %3 %6 = bitcast <4 x i64> %5 to <8 x float> ; fadd forces execution domain - %7 = fadd <8 x float> %6, + %7 = fadd nexc nrnd <8 x float> %6, ret <8 x float> %7 } @@ -175,7 +175,7 @@ %4 = and <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <2 x double> ; fadd forces execution domain - %6 = fadd <2 x double> %5, + %6 = fadd nexc nrnd <2 x double> %5, ret <2 x double> %6 } @@ -188,7 +188,7 @@ %4 = and <4 x i64> %2, %3 %5 = bitcast <4 x i64> %4 to <4 x double> ; fadd forces execution domain - %6 = fadd <4 x double> %5, + %6 = fadd nexc nrnd <4 x double> %5, ret <4 x double> %6 } @@ -201,7 +201,7 @@ %4 = and <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <4 x float> ; fadd forces execution domain - %6 = fadd <4 x float> %5, + %6 = fadd nexc nrnd <4 x float> %5, ret <4 x float> %6 } @@ -214,7 +214,7 @@ %4 = and <4 x i64> %2, %3 %5 = bitcast <4 x i64> %4 to <8 x float> ; fadd forces execution domain - %6 = fadd <8 x float> %5, + %6 = fadd nexc nrnd <8 x float> %5, ret <8 x float> %6 } @@ -759,7 +759,7 @@ ;CHECK-LABEL: stack_fold_divpd ;CHECK: vdivpd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fdiv <2 x double> %a0, %a1 + %2 = fdiv nexc nrnd <2 x double> %a0, %a1 ret <2 x double> %2 } @@ -767,7 +767,7 @@ ;CHECK-LABEL: stack_fold_divpd_ymm ;CHECK: vdivpd {{-?[0-9]*}}(%rsp), {{%ymm[0-9][0-9]*}}, {{%ymm[0-9][0-9]*}} {{.*#+}} 32-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fdiv <4 x double> %a0, %a1 + %2 = fdiv nexc nrnd <4 x double> %a0, %a1 ret <4 x double> %2 } @@ -775,7 +775,7 @@ ;CHECK-LABEL: stack_fold_divps ;CHECK: vdivps {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fdiv <4 x float> %a0, %a1 + %2 = fdiv nexc nrnd <4 x float> %a0, %a1 ret <4 x float> %2 } @@ -783,7 +783,7 @@ ;CHECK-LABEL: stack_fold_divps_ymm ;CHECK: vdivps {{-?[0-9]*}}(%rsp), {{%ymm[0-9][0-9]*}}, {{%ymm[0-9][0-9]*}} {{.*#+}} 32-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fdiv <8 x float> %a0, %a1 + %2 = fdiv nexc nrnd <8 x float> %a0, %a1 ret <8 x float> %2 } @@ -791,7 +791,7 @@ ;CHECK-LABEL: stack_fold_divsd ;CHECK: vdivsd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 8-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fdiv double %a0, %a1 + %2 = fdiv nexc nrnd double %a0, %a1 ret double %2 } @@ -808,7 +808,7 @@ ;CHECK-LABEL: stack_fold_divss ;CHECK: vdivss {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fdiv float %a0, %a1 + %2 = fdiv nexc nrnd float %a0, %a1 ret float %2 } @@ -1158,7 +1158,7 @@ ;CHECK-LABEL: stack_fold_mulpd ;CHECK: vmulpd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fmul <2 x double> %a0, %a1 + %2 = fmul nexc nrnd <2 x double> %a0, %a1 ret <2 x double> %2 } @@ -1166,7 +1166,7 @@ ;CHECK-LABEL: stack_fold_mulpd_ymm ;CHECK: vmulpd {{-?[0-9]*}}(%rsp), {{%ymm[0-9][0-9]*}}, {{%ymm[0-9][0-9]*}} {{.*#+}} 32-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fmul <4 x double> %a0, %a1 + %2 = fmul nexc nrnd <4 x double> %a0, %a1 ret <4 x double> %2 } @@ -1174,7 +1174,7 @@ ;CHECK-LABEL: stack_fold_mulps ;CHECK: vmulps {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fmul <4 x float> %a0, %a1 + %2 = fmul nexc nrnd <4 x float> %a0, %a1 ret <4 x float> %2 } @@ -1182,7 +1182,7 @@ ;CHECK-LABEL: stack_fold_mulps_ymm ;CHECK: vmulps {{-?[0-9]*}}(%rsp), {{%ymm[0-9][0-9]*}}, {{%ymm[0-9][0-9]*}} {{.*#+}} 32-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fmul <8 x float> %a0, %a1 + %2 = fmul nexc nrnd <8 x float> %a0, %a1 ret <8 x float> %2 } @@ -1190,7 +1190,7 @@ ;CHECK-LABEL: stack_fold_mulsd ;CHECK: vmulsd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 8-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fmul double %a0, %a1 + %2 = fmul nexc nrnd double %a0, %a1 ret double %2 } @@ -1207,7 +1207,7 @@ ;CHECK-LABEL: stack_fold_mulss ;CHECK: vmulss {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fmul float %a0, %a1 + %2 = fmul nexc nrnd float %a0, %a1 ret float %2 } @@ -1229,7 +1229,7 @@ %4 = or <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <2 x double> ; fadd forces execution domain - %6 = fadd <2 x double> %5, + %6 = fadd nexc nrnd <2 x double> %5, ret <2 x double> %6 } @@ -1242,7 +1242,7 @@ %4 = or <4 x i64> %2, %3 %5 = bitcast <4 x i64> %4 to <4 x double> ; fadd forces execution domain - %6 = fadd <4 x double> %5, + %6 = fadd nexc nrnd <4 x double> %5, ret <4 x double> %6 } @@ -1255,7 +1255,7 @@ %4 = or <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <4 x float> ; fadd forces execution domain - %6 = fadd <4 x float> %5, + %6 = fadd nexc nrnd <4 x float> %5, ret <4 x float> %6 } @@ -1268,7 +1268,7 @@ %4 = or <4 x i64> %2, %3 %5 = bitcast <4 x i64> %4 to <8 x float> ; fadd forces execution domain - %6 = fadd <8 x float> %5, + %6 = fadd nexc nrnd <8 x float> %5, ret <8 x float> %6 } @@ -1582,7 +1582,7 @@ ;CHECK-LABEL: stack_fold_subpd ;CHECK: vsubpd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fsub <2 x double> %a0, %a1 + %2 = fsub nexc nrnd <2 x double> %a0, %a1 ret <2 x double> %2 } @@ -1590,7 +1590,7 @@ ;CHECK-LABEL: stack_fold_subpd_ymm ;CHECK: vsubpd {{-?[0-9]*}}(%rsp), {{%ymm[0-9][0-9]*}}, {{%ymm[0-9][0-9]*}} {{.*#+}} 32-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fsub <4 x double> %a0, %a1 + %2 = fsub nexc nrnd <4 x double> %a0, %a1 ret <4 x double> %2 } @@ -1598,7 +1598,7 @@ ;CHECK-LABEL: stack_fold_subps ;CHECK: vsubps {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fsub <4 x float> %a0, %a1 + %2 = fsub nexc nrnd <4 x float> %a0, %a1 ret <4 x float> %2 } @@ -1606,7 +1606,7 @@ ;CHECK-LABEL: stack_fold_subps_ymm ;CHECK: vsubps {{-?[0-9]*}}(%rsp), {{%ymm[0-9][0-9]*}}, {{%ymm[0-9][0-9]*}} {{.*#+}} 32-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fsub <8 x float> %a0, %a1 + %2 = fsub nexc nrnd <8 x float> %a0, %a1 ret <8 x float> %2 } @@ -1614,7 +1614,7 @@ ;CHECK-LABEL: stack_fold_subsd ;CHECK: vsubsd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 8-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fsub double %a0, %a1 + %2 = fsub nexc nrnd double %a0, %a1 ret double %2 } @@ -1631,7 +1631,7 @@ ;CHECK-LABEL: stack_fold_subss ;CHECK: vsubss {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fsub float %a0, %a1 + %2 = fsub nexc nrnd float %a0, %a1 ret float %2 } @@ -1722,7 +1722,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <2 x double> %a0, <2 x double> %a1, <2 x i32> ; fadd forces execution domain - %3 = fadd <2 x double> %2, + %3 = fadd nexc nrnd <2 x double> %2, ret <2 x double> %3 } @@ -1732,7 +1732,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <4 x double> %a0, <4 x double> %a1, <4 x i32> ; fadd forces execution domain - %3 = fadd <4 x double> %2, + %3 = fadd nexc nrnd <4 x double> %2, ret <4 x double> %3 } @@ -1742,7 +1742,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> ; fadd forces execution domain - %3 = fadd <4 x float> %2, + %3 = fadd nexc nrnd <4 x float> %2, ret <4 x float> %3 } @@ -1752,7 +1752,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <8 x float> %a0, <8 x float> %a1, <8 x i32> ; fadd forces execution domain - %3 = fadd <8 x float> %2, + %3 = fadd nexc nrnd <8 x float> %2, ret <8 x float> %3 } @@ -1762,7 +1762,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <2 x double> %a0, <2 x double> %a1, <2 x i32> ; fadd forces execution domain - %3 = fadd <2 x double> %2, + %3 = fadd nexc nrnd <2 x double> %2, ret <2 x double> %3 } @@ -1772,7 +1772,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <4 x double> %a0, <4 x double> %a1, <4 x i32> ; fadd forces execution domain - %3 = fadd <4 x double> %2, + %3 = fadd nexc nrnd <4 x double> %2, ret <4 x double> %3 } @@ -1782,7 +1782,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> ; fadd forces execution domain - %3 = fadd <4 x float> %2, + %3 = fadd nexc nrnd <4 x float> %2, ret <4 x float> %3 } @@ -1792,7 +1792,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <8 x float> %a0, <8 x float> %a1, <8 x i32> ; fadd forces execution domain - %3 = fadd <8 x float> %2, + %3 = fadd nexc nrnd <8 x float> %2, ret <8 x float> %3 } @@ -1805,7 +1805,7 @@ %4 = xor <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <2 x double> ; fadd forces execution domain - %6 = fadd <2 x double> %5, + %6 = fadd nexc nrnd <2 x double> %5, ret <2 x double> %6 } @@ -1818,7 +1818,7 @@ %4 = xor <4 x i64> %2, %3 %5 = bitcast <4 x i64> %4 to <4 x double> ; fadd forces execution domain - %6 = fadd <4 x double> %5, + %6 = fadd nexc nrnd <4 x double> %5, ret <4 x double> %6 } @@ -1831,7 +1831,7 @@ %4 = xor <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <4 x float> ; fadd forces execution domain - %6 = fadd <4 x float> %5, + %6 = fadd nexc nrnd <4 x float> %5, ret <4 x float> %6 } @@ -1844,6 +1844,6 @@ %4 = xor <4 x i64> %2, %3 %5 = bitcast <4 x i64> %4 to <8 x float> ; fadd forces execution domain - %6 = fadd <8 x float> %5, + %6 = fadd nexc nrnd <8 x float> %5, ret <8 x float> %6 } Index: test/CodeGen/X86/stack-folding-fp-sse42.ll =================================================================== --- test/CodeGen/X86/stack-folding-fp-sse42.ll +++ test/CodeGen/X86/stack-folding-fp-sse42.ll @@ -12,7 +12,7 @@ ;CHECK-LABEL: stack_fold_addpd ;CHECK: addpd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fadd <2 x double> %a0, %a1 + %2 = fadd nexc nrnd <2 x double> %a0, %a1 ret <2 x double> %2 } @@ -20,7 +20,7 @@ ;CHECK-LABEL: stack_fold_addps ;CHECK: addps {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fadd <4 x float> %a0, %a1 + %2 = fadd nexc nrnd <4 x float> %a0, %a1 ret <4 x float> %2 } @@ -28,7 +28,7 @@ ;CHECK-LABEL: stack_fold_addsd ;CHECK: addsd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 8-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fadd double %a0, %a1 + %2 = fadd nexc nrnd double %a0, %a1 ret double %2 } @@ -45,7 +45,7 @@ ;CHECK-LABEL: stack_fold_addss ;CHECK: addss {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fadd float %a0, %a1 + %2 = fadd nexc nrnd float %a0, %a1 ret float %2 } @@ -86,7 +86,7 @@ %5 = and <2 x i64> %4, %3 %6 = bitcast <2 x i64> %5 to <2 x double> ; fadd forces execution domain - %7 = fadd <2 x double> %6, + %7 = fadd nexc nrnd <2 x double> %6, ret <2 x double> %7 } @@ -100,7 +100,7 @@ %5 = and <2 x i64> %4, %3 %6 = bitcast <2 x i64> %5 to <4 x float> ; fadd forces execution domain - %7 = fadd <4 x float> %6, + %7 = fadd nexc nrnd <4 x float> %6, ret <4 x float> %7 } @@ -113,7 +113,7 @@ %4 = and <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <2 x double> ; fadd forces execution domain - %6 = fadd <2 x double> %5, + %6 = fadd nexc nrnd <2 x double> %5, ret <2 x double> %6 } @@ -126,7 +126,7 @@ %4 = and <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <4 x float> ; fadd forces execution domain - %6 = fadd <4 x float> %5, + %6 = fadd nexc nrnd <4 x float> %5, ret <4 x float> %6 } @@ -527,7 +527,7 @@ ;CHECK-LABEL: stack_fold_divpd ;CHECK: divpd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fdiv <2 x double> %a0, %a1 + %2 = fdiv nexc nrnd <2 x double> %a0, %a1 ret <2 x double> %2 } @@ -535,7 +535,7 @@ ;CHECK-LABEL: stack_fold_divps ;CHECK: divps {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fdiv <4 x float> %a0, %a1 + %2 = fdiv nexc nrnd <4 x float> %a0, %a1 ret <4 x float> %2 } @@ -543,7 +543,7 @@ ;CHECK-LABEL: stack_fold_divsd ;CHECK: divsd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 8-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fdiv double %a0, %a1 + %2 = fdiv nexc nrnd double %a0, %a1 ret double %2 } @@ -560,7 +560,7 @@ ;CHECK-LABEL: stack_fold_divss ;CHECK: divss {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fdiv float %a0, %a1 + %2 = fdiv nexc nrnd float %a0, %a1 ret float %2 } @@ -788,7 +788,7 @@ ;CHECK-LABEL: stack_fold_mulpd ;CHECK: mulpd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fmul <2 x double> %a0, %a1 + %2 = fmul nexc nrnd <2 x double> %a0, %a1 ret <2 x double> %2 } @@ -796,7 +796,7 @@ ;CHECK-LABEL: stack_fold_mulps ;CHECK: mulps {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fmul <4 x float> %a0, %a1 + %2 = fmul nexc nrnd <4 x float> %a0, %a1 ret <4 x float> %2 } @@ -804,7 +804,7 @@ ;CHECK-LABEL: stack_fold_mulsd ;CHECK: mulsd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 8-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fmul double %a0, %a1 + %2 = fmul nexc nrnd double %a0, %a1 ret double %2 } @@ -821,7 +821,7 @@ ;CHECK-LABEL: stack_fold_mulss ;CHECK: mulss {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fmul float %a0, %a1 + %2 = fmul nexc nrnd float %a0, %a1 ret float %2 } @@ -843,7 +843,7 @@ %4 = or <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <2 x double> ; fadd forces execution domain - %6 = fadd <2 x double> %5, + %6 = fadd nexc nrnd <2 x double> %5, ret <2 x double> %6 } @@ -856,7 +856,7 @@ %4 = or <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <4 x float> ; fadd forces execution domain - %6 = fadd <4 x float> %5, + %6 = fadd nexc nrnd <4 x float> %5, ret <4 x float> %6 } @@ -992,7 +992,7 @@ ;CHECK-LABEL: stack_fold_subpd ;CHECK: subpd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fsub <2 x double> %a0, %a1 + %2 = fsub nexc nrnd <2 x double> %a0, %a1 ret <2 x double> %2 } @@ -1000,7 +1000,7 @@ ;CHECK-LABEL: stack_fold_subps ;CHECK: subps {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 16-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fsub <4 x float> %a0, %a1 + %2 = fsub nexc nrnd <4 x float> %a0, %a1 ret <4 x float> %2 } @@ -1008,7 +1008,7 @@ ;CHECK-LABEL: stack_fold_subsd ;CHECK: subsd {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 8-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fsub double %a0, %a1 + %2 = fsub nexc nrnd double %a0, %a1 ret double %2 } @@ -1025,7 +1025,7 @@ ;CHECK-LABEL: stack_fold_subss ;CHECK: subss {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() - %2 = fsub float %a0, %a1 + %2 = fsub nexc nrnd float %a0, %a1 ret float %2 } @@ -1080,7 +1080,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <2 x double> %a0, <2 x double> %a1, <2 x i32> ; fadd forces execution domain - %3 = fadd <2 x double> %2, + %3 = fadd nexc nrnd <2 x double> %2, ret <2 x double> %3 } @@ -1090,7 +1090,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> ; fadd forces execution domain - %3 = fadd <4 x float> %2, + %3 = fadd nexc nrnd <4 x float> %2, ret <4 x float> %3 } @@ -1100,7 +1100,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <2 x double> %a0, <2 x double> %a1, <2 x i32> ; fadd forces execution domain - %3 = fadd <2 x double> %2, + %3 = fadd nexc nrnd <2 x double> %2, ret <2 x double> %3 } @@ -1110,7 +1110,7 @@ %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{flags}"() %2 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> ; fadd forces execution domain - %3 = fadd <4 x float> %2, + %3 = fadd nexc nrnd <4 x float> %2, ret <4 x float> %3 } @@ -1123,7 +1123,7 @@ %4 = xor <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <2 x double> ; fadd forces execution domain - %6 = fadd <2 x double> %5, + %6 = fadd nexc nrnd <2 x double> %5, ret <2 x double> %6 } @@ -1136,6 +1136,6 @@ %4 = xor <2 x i64> %2, %3 %5 = bitcast <2 x i64> %4 to <4 x float> ; fadd forces execution domain - %6 = fadd <4 x float> %5, + %6 = fadd nexc nrnd <4 x float> %5, ret <4 x float> %6 } Index: test/CodeGen/X86/vec_ss_load_fold.ll =================================================================== --- test/CodeGen/X86/vec_ss_load_fold.ll +++ test/CodeGen/X86/vec_ss_load_fold.ll @@ -22,8 +22,8 @@ } define i16 @test2(float %f) nounwind { - %tmp28 = fsub float %f, 1.000000e+00 ; [#uses=1] - %tmp37 = fmul float %tmp28, 5.000000e-01 ; [#uses=1] + %tmp28 = fsub nexc nrnd float %f, 1.000000e+00 ; [#uses=1] + %tmp37 = fmul nexc nrnd float %tmp28, 5.000000e-01 ; [#uses=1] %tmp375 = insertelement <4 x float> undef, float %tmp37, i32 0 ; <<4 x float>> [#uses=1] %tmp48 = tail call <4 x float> @llvm.x86.sse.min.ss( <4 x float> %tmp375, <4 x float> < float 6.553500e+04, float undef, float undef, float undef > ) ; <<4 x float>> [#uses=1] %tmp59 = tail call <4 x float> @llvm.x86.sse.max.ss( <4 x float> %tmp48, <4 x float> < float 0.000000e+00, float undef, float undef, float undef > ) ; <<4 x float>> [#uses=1] Index: test/CodeGen/X86/vec_unsafe-fp-math.ll =================================================================== --- test/CodeGen/X86/vec_unsafe-fp-math.ll +++ test/CodeGen/X86/vec_unsafe-fp-math.ll @@ -8,7 +8,7 @@ ; CHECK-NOT: subps ; CHECK-NOT: xorps ; CHECK: retq - %sub = fsub <4 x float> %x, zeroinitializer + %sub = fsub nexc nrnd <4 x float> %x, zeroinitializer ret <4 x float> %sub } @@ -18,6 +18,6 @@ ; CHECK: xorps {{.*}}LCP{{.*}}, %xmm0 ; CHECK-NOT: subps ; CHECK-NEXT: retq - %sub = fsub <4 x float> zeroinitializer, %x + %sub = fsub nexc nrnd <4 x float> zeroinitializer, %x ret <4 x float> %sub } Index: test/Transforms/CodeGenPrepare/X86/select.ll =================================================================== --- test/Transforms/CodeGenPrepare/X86/select.ll +++ test/Transforms/CodeGenPrepare/X86/select.ll @@ -28,7 +28,7 @@ define float @fdiv_true_sink(float %a, float %b) { entry: - %div = fdiv float %a, %b + %div = fdiv nexc nrnd float %a, %b %cmp = fcmp ogt float %a, 1.0 %sel = select i1 %cmp, float %div, float 2.0 ret float %sel @@ -37,7 +37,7 @@ ; CHECK: %cmp = fcmp ogt float %a, 1.0 ; CHECK: br i1 %cmp, label %select.true.sink, label %select.end ; CHECK: select.true.sink: -; CHECK: %div = fdiv float %a, %b +; CHECK: %div = fdiv nexc nrnd float %a, %b ; CHECK: br label %select.end ; CHECK: select.end: ; CHECK: %sel = phi float [ %div, %select.true.sink ], [ 2.000000e+00, %entry ] @@ -46,7 +46,7 @@ define float @fdiv_false_sink(float %a, float %b) { entry: - %div = fdiv float %a, %b + %div = fdiv nexc nrnd float %a, %b %cmp = fcmp ogt float %a, 3.0 %sel = select i1 %cmp, float 4.0, float %div ret float %sel @@ -55,7 +55,7 @@ ; CHECK: %cmp = fcmp ogt float %a, 3.0 ; CHECK: br i1 %cmp, label %select.end, label %select.false.sink ; CHECK: select.false.sink: -; CHECK: %div = fdiv float %a, %b +; CHECK: %div = fdiv nexc nrnd float %a, %b ; CHECK: br label %select.end ; CHECK: select.end: ; CHECK: %sel = phi float [ 4.000000e+00, %entry ], [ %div, %select.false.sink ] @@ -64,8 +64,8 @@ define float @fdiv_both_sink(float %a, float %b) { entry: - %div1 = fdiv float %a, %b - %div2 = fdiv float %b, %a + %div1 = fdiv nexc nrnd float %a, %b + %div2 = fdiv nexc nrnd float %b, %a %cmp = fcmp ogt float %a, 5.0 %sel = select i1 %cmp, float %div1, float %div2 ret float %sel @@ -74,10 +74,10 @@ ; CHECK: %cmp = fcmp ogt float %a, 5.0 ; CHECK: br i1 %cmp, label %select.true.sink, label %select.false.sink ; CHECK: select.true.sink: -; CHECK: %div1 = fdiv float %a, %b +; CHECK: %div1 = fdiv nexc nrnd float %a, %b ; CHECK: br label %select.end ; CHECK: select.false.sink: -; CHECK: %div2 = fdiv float %b, %a +; CHECK: %div2 = fdiv nexc nrnd float %b, %a ; CHECK: br label %select.end ; CHECK: select.end: ; CHECK: %sel = phi float [ %div1, %select.true.sink ], [ %div2, %select.false.sink ] @@ -87,7 +87,7 @@ ; An 'fadd' is not too expensive, so it's ok to speculate. define float @fadd_no_sink(float %a, float %b) { - %add = fadd float %a, %b + %add = fadd nexc nrnd float %a, %b %cmp = fcmp ogt float 6.0, %a %sel = select i1 %cmp, float %add, float 7.0 ret float %sel @@ -97,13 +97,13 @@ } ; Possible enhancement: sinkability is only calculated with the direct -; operand of the select, so we don't try to sink this. The fdiv cost is not +; operand of the select, so we don't try to sink this. The fdiv nexc nrnd cost is not ; taken into account. define float @fdiv_no_sink(float %a, float %b) { entry: - %div = fdiv float %a, %b - %add = fadd float %div, %b + %div = fdiv nexc nrnd float %a, %b + %add = fadd nexc nrnd float %div, %b %cmp = fcmp ogt float %a, 1.0 %sel = select i1 %cmp, float %add, float 8.0 ret float %sel Index: test/Transforms/InstCombine/2009-01-19-fmod-constant-float-specials.ll =================================================================== --- test/Transforms/InstCombine/2009-01-19-fmod-constant-float-specials.ll +++ test/Transforms/InstCombine/2009-01-19-fmod-constant-float-specials.ll @@ -19,7 +19,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -40,7 +40,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -59,7 +59,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -78,7 +78,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -97,7 +97,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -116,7 +116,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -135,7 +135,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -154,7 +154,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -173,7 +173,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -192,7 +192,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -211,7 +211,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -230,7 +230,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -249,7 +249,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -268,7 +268,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -287,7 +287,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return @@ -306,7 +306,7 @@ %1 = fpext float %0 to double ; [#uses=1] %2 = load float, float* %x, align 4 ; [#uses=1] %3 = fpext float %2 to double ; [#uses=1] - %4 = frem double %3, %1 ; [#uses=1] + %4 = frem nexc nrnd double %3, %1 ; [#uses=1] %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind ; [#uses=0] br label %return Index: test/Transforms/InstCombine/fold-fops-into-selects.ll =================================================================== --- test/Transforms/InstCombine/fold-fops-into-selects.ll +++ test/Transforms/InstCombine/fold-fops-into-selects.ll @@ -3,7 +3,7 @@ define float @test1(i1 %A) { EntryBlock: %cf = select i1 %A, float 1.000000e+00, float 0.000000e+00 - %op = fsub float 1.000000e+00, %cf + %op = fsub nexc nrnd float 1.000000e+00, %cf ret float %op ; CHECK-LABEL: @test1( ; CHECK: select i1 %A, float 0.000000e+00, float 1.000000e+00 @@ -12,60 +12,60 @@ define float @test2(i1 %A, float %B) { EntryBlock: %cf = select i1 %A, float 1.000000e+00, float %B - %op = fadd float 2.000000e+00, %cf + %op = fadd nexc nrnd float 2.000000e+00, %cf ret float %op ; CHECK-LABEL: @test2( -; CHECK: [[OP:%.*]] = fadd float %B, 2.000000e+00 +; CHECK: [[OP:%.*]] = fadd nexc nrnd float %B, 2.000000e+00 ; CHECK: select i1 %A, float 3.000000e+00, float [[OP]] } define float @test3(i1 %A, float %B) { EntryBlock: %cf = select i1 %A, float 1.000000e+00, float %B - %op = fsub float 2.000000e+00, %cf + %op = fsub nexc nrnd float 2.000000e+00, %cf ret float %op ; CHECK-LABEL: @test3( -; CHECK: [[OP:%.*]] = fsub float 2.000000e+00, %B +; CHECK: [[OP:%.*]] = fsub nexc nrnd float 2.000000e+00, %B ; CHECK: select i1 %A, float 1.000000e+00, float [[OP]] } define float @test4(i1 %A, float %B) { EntryBlock: %cf = select i1 %A, float 1.000000e+00, float %B - %op = fmul float 2.000000e+00, %cf + %op = fmul nexc nrnd float 2.000000e+00, %cf ret float %op ; CHECK-LABEL: @test4( -; CHECK: [[OP:%.*]] = fmul float %B, 2.000000e+00 +; CHECK: [[OP:%.*]] = fmul nexc nrnd float %B, 2.000000e+00 ; CHECK: select i1 %A, float 2.000000e+00, float [[OP]] } define float @test5(i1 %A, float %B) { EntryBlock: %cf = select i1 %A, float 1.000000e+00, float %B - %op = fdiv float 2.000000e+00, %cf + %op = fdiv nexc nrnd float 2.000000e+00, %cf ret float %op ; CHECK-LABEL: @test5( -; CHECK: [[OP:%.*]] = fdiv float 2.000000e+00, %B +; CHECK: [[OP:%.*]] = fdiv nexc nrnd float 2.000000e+00, %B ; CHECK: select i1 %A, float 2.000000e+00, float [[OP]] } define float @test6(i1 %A, float %B) { EntryBlock: %cf = select i1 %A, float 1.000000e+00, float %B - %op = fdiv float %cf, 2.000000e+00 + %op = fdiv nexc nrnd float %cf, 2.000000e+00 ret float %op ; CHECK-LABEL: @test6( -; CHECK: [[OP:%.*]] = fmul float %B, 5.000000e-01 +; CHECK: [[OP:%.*]] = fmul nexc nrnd float %B, 5.000000e-01 ; CHECK: select i1 %A, float 5.000000e-01, float [[OP]] } define float @test7(i1 %A, float %B) { EntryBlock: %cf = select i1 %A, float 1.000000e+00, float %B - %op = fdiv float %cf, 3.000000e+00 + %op = fdiv nexc nrnd float %cf, 3.000000e+00 ret float %op ; CHECK-LABEL: @test7( -; CHECK: [[OP:%.*]] = fdiv float %B, 3.000000e+00 +; CHECK: [[OP:%.*]] = fdiv nexc nrnd float %B, 3.000000e+00 ; CHECK: select i1 %A, float 0x3FD5555560000000, float [[OP]] } Index: test/Transforms/LoopReroll/basic.ll =================================================================== --- test/Transforms/LoopReroll/basic.ll +++ test/Transforms/LoopReroll/basic.ll @@ -159,42 +159,42 @@ %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] %arrayidx = getelementptr inbounds float, float* %b, i64 %indvars.iv %0 = load float, float* %arrayidx, align 4 - %mul = fmul float %0, %alpha + %mul = fmul nexc nrnd float %0, %alpha %arrayidx2 = getelementptr inbounds float, float* %a, i64 %indvars.iv %1 = load float, float* %arrayidx2, align 4 - %add = fadd float %1, %mul + %add = fadd nexc nrnd float %1, %mul store float %add, float* %arrayidx2, align 4 %2 = add nsw i64 %indvars.iv, 1 %arrayidx5 = getelementptr inbounds float, float* %b, i64 %2 %3 = load float, float* %arrayidx5, align 4 - %mul6 = fmul float %3, %alpha + %mul6 = fmul nexc nrnd float %3, %alpha %arrayidx9 = getelementptr inbounds float, float* %a, i64 %2 %4 = load float, float* %arrayidx9, align 4 - %add10 = fadd float %4, %mul6 + %add10 = fadd nexc nrnd float %4, %mul6 store float %add10, float* %arrayidx9, align 4 %5 = add nsw i64 %indvars.iv, 2 %arrayidx13 = getelementptr inbounds float, float* %b, i64 %5 %6 = load float, float* %arrayidx13, align 4 - %mul14 = fmul float %6, %alpha + %mul14 = fmul nexc nrnd float %6, %alpha %arrayidx17 = getelementptr inbounds float, float* %a, i64 %5 %7 = load float, float* %arrayidx17, align 4 - %add18 = fadd float %7, %mul14 + %add18 = fadd nexc nrnd float %7, %mul14 store float %add18, float* %arrayidx17, align 4 %8 = add nsw i64 %indvars.iv, 3 %arrayidx21 = getelementptr inbounds float, float* %b, i64 %8 %9 = load float, float* %arrayidx21, align 4 - %mul22 = fmul float %9, %alpha + %mul22 = fmul nexc nrnd float %9, %alpha %arrayidx25 = getelementptr inbounds float, float* %a, i64 %8 %10 = load float, float* %arrayidx25, align 4 - %add26 = fadd float %10, %mul22 + %add26 = fadd nexc nrnd float %10, %mul22 store float %add26, float* %arrayidx25, align 4 %11 = add nsw i64 %indvars.iv, 4 %arrayidx29 = getelementptr inbounds float, float* %b, i64 %11 %12 = load float, float* %arrayidx29, align 4 - %mul30 = fmul float %12, %alpha + %mul30 = fmul nexc nrnd float %12, %alpha %arrayidx33 = getelementptr inbounds float, float* %a, i64 %11 %13 = load float, float* %arrayidx33, align 4 - %add34 = fadd float %13, %mul30 + %add34 = fadd nexc nrnd float %13, %mul30 store float %add34, float* %arrayidx33, align 4 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 5 %14 = trunc i64 %indvars.iv.next to i32 @@ -207,10 +207,10 @@ ; CHECK: %indvar = phi i64 [ %indvar.next, %for.body ], [ 0, %entry ] ; CHECK: %arrayidx = getelementptr inbounds float, float* %b, i64 %indvar ; CHECK: %0 = load float, float* %arrayidx, align 4 -; CHECK: %mul = fmul float %0, %alpha +; CHECK: %mul = fmul nexc nrnd float %0, %alpha ; CHECK: %arrayidx2 = getelementptr inbounds float, float* %a, i64 %indvar ; CHECK: %1 = load float, float* %arrayidx2, align 4 -; CHECK: %add = fadd float %1, %mul +; CHECK: %add = fadd nexc nrnd float %1, %mul ; CHECK: store float %add, float* %arrayidx2, align 4 ; CHECK: %indvar.next = add i64 %indvar, 1 ; CHECK: %exitcond = icmp eq i64 %indvar, 3199 @@ -244,10 +244,10 @@ %idxprom1 = sext i32 %0 to i64 %arrayidx2 = getelementptr inbounds float, float* %b, i64 %idxprom1 %1 = load float, float* %arrayidx2, align 4 - %mul = fmul float %1, %alpha + %mul = fmul nexc nrnd float %1, %alpha %arrayidx4 = getelementptr inbounds float, float* %a, i64 %indvars.iv %2 = load float, float* %arrayidx4, align 4 - %add = fadd float %2, %mul + %add = fadd nexc nrnd float %2, %mul store float %add, float* %arrayidx4, align 4 %3 = add nsw i64 %indvars.iv, 1 %arrayidx7 = getelementptr inbounds i32, i32* %ip, i64 %3 @@ -255,10 +255,10 @@ %idxprom8 = sext i32 %4 to i64 %arrayidx9 = getelementptr inbounds float, float* %b, i64 %idxprom8 %5 = load float, float* %arrayidx9, align 4 - %mul10 = fmul float %5, %alpha + %mul10 = fmul nexc nrnd float %5, %alpha %arrayidx13 = getelementptr inbounds float, float* %a, i64 %3 %6 = load float, float* %arrayidx13, align 4 - %add14 = fadd float %6, %mul10 + %add14 = fadd nexc nrnd float %6, %mul10 store float %add14, float* %arrayidx13, align 4 %7 = add nsw i64 %indvars.iv, 2 %arrayidx17 = getelementptr inbounds i32, i32* %ip, i64 %7 @@ -266,10 +266,10 @@ %idxprom18 = sext i32 %8 to i64 %arrayidx19 = getelementptr inbounds float, float* %b, i64 %idxprom18 %9 = load float, float* %arrayidx19, align 4 - %mul20 = fmul float %9, %alpha + %mul20 = fmul nexc nrnd float %9, %alpha %arrayidx23 = getelementptr inbounds float, float* %a, i64 %7 %10 = load float, float* %arrayidx23, align 4 - %add24 = fadd float %10, %mul20 + %add24 = fadd nexc nrnd float %10, %mul20 store float %add24, float* %arrayidx23, align 4 %11 = add nsw i64 %indvars.iv, 3 %arrayidx27 = getelementptr inbounds i32, i32* %ip, i64 %11 @@ -277,10 +277,10 @@ %idxprom28 = sext i32 %12 to i64 %arrayidx29 = getelementptr inbounds float, float* %b, i64 %idxprom28 %13 = load float, float* %arrayidx29, align 4 - %mul30 = fmul float %13, %alpha + %mul30 = fmul nexc nrnd float %13, %alpha %arrayidx33 = getelementptr inbounds float, float* %a, i64 %11 %14 = load float, float* %arrayidx33, align 4 - %add34 = fadd float %14, %mul30 + %add34 = fadd nexc nrnd float %14, %mul30 store float %add34, float* %arrayidx33, align 4 %15 = add nsw i64 %indvars.iv, 4 %arrayidx37 = getelementptr inbounds i32, i32* %ip, i64 %15 @@ -288,10 +288,10 @@ %idxprom38 = sext i32 %16 to i64 %arrayidx39 = getelementptr inbounds float, float* %b, i64 %idxprom38 %17 = load float, float* %arrayidx39, align 4 - %mul40 = fmul float %17, %alpha + %mul40 = fmul nexc nrnd float %17, %alpha %arrayidx43 = getelementptr inbounds float, float* %a, i64 %15 %18 = load float, float* %arrayidx43, align 4 - %add44 = fadd float %18, %mul40 + %add44 = fadd nexc nrnd float %18, %mul40 store float %add44, float* %arrayidx43, align 4 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 5 %19 = trunc i64 %indvars.iv.next to i32 @@ -307,10 +307,10 @@ ; CHECK: %idxprom1 = sext i32 %0 to i64 ; CHECK: %arrayidx2 = getelementptr inbounds float, float* %b, i64 %idxprom1 ; CHECK: %1 = load float, float* %arrayidx2, align 4 -; CHECK: %mul = fmul float %1, %alpha +; CHECK: %mul = fmul nexc nrnd float %1, %alpha ; CHECK: %arrayidx4 = getelementptr inbounds float, float* %a, i64 %indvar ; CHECK: %2 = load float, float* %arrayidx4, align 4 -; CHECK: %add = fadd float %2, %mul +; CHECK: %add = fadd nexc nrnd float %2, %mul ; CHECK: store float %add, float* %arrayidx4, align 4 ; CHECK: %indvar.next = add i64 %indvar, 1 ; CHECK: %exitcond = icmp eq i64 %indvar, 3199 Index: test/Transforms/LoopReroll/nonconst_lb.ll =================================================================== --- test/Transforms/LoopReroll/nonconst_lb.ll +++ test/Transforms/LoopReroll/nonconst_lb.ll @@ -92,32 +92,32 @@ %0 = load float, float* %arrayidx, align 4 %arrayidx1 = getelementptr inbounds float, float* %dx, i32 %i.056 %1 = load float, float* %arrayidx1, align 4 - %mul = fmul float %1, %da - %add = fadd float %0, %mul + %mul = fmul nexc nrnd float %1, %da + %add = fadd nexc nrnd float %0, %mul store float %add, float* %arrayidx, align 4 %add3 = add nsw i32 %i.056, 1 %arrayidx4 = getelementptr inbounds float, float* %dy, i32 %add3 %2 = load float, float* %arrayidx4, align 4 %arrayidx6 = getelementptr inbounds float, float* %dx, i32 %add3 %3 = load float, float* %arrayidx6, align 4 - %mul7 = fmul float %3, %da - %add8 = fadd float %2, %mul7 + %mul7 = fmul nexc nrnd float %3, %da + %add8 = fadd nexc nrnd float %2, %mul7 store float %add8, float* %arrayidx4, align 4 %add11 = add nsw i32 %i.056, 2 %arrayidx12 = getelementptr inbounds float, float* %dy, i32 %add11 %4 = load float, float* %arrayidx12, align 4 %arrayidx14 = getelementptr inbounds float, float* %dx, i32 %add11 %5 = load float, float* %arrayidx14, align 4 - %mul15 = fmul float %5, %da - %add16 = fadd float %4, %mul15 + %mul15 = fmul nexc nrnd float %5, %da + %add16 = fadd nexc nrnd float %4, %mul15 store float %add16, float* %arrayidx12, align 4 %add19 = add nsw i32 %i.056, 3 %arrayidx20 = getelementptr inbounds float, float* %dy, i32 %add19 %6 = load float, float* %arrayidx20, align 4 %arrayidx22 = getelementptr inbounds float, float* %dx, i32 %add19 %7 = load float, float* %arrayidx22, align 4 - %mul23 = fmul float %7, %da - %add24 = fadd float %6, %mul23 + %mul23 = fmul nexc nrnd float %7, %da + %add24 = fadd nexc nrnd float %6, %mul23 store float %add24, float* %arrayidx20, align 4 %add27 = add nsw i32 %i.056, 4 %cmp = icmp slt i32 %add27, %n @@ -144,8 +144,8 @@ ; CHECK: %7 = load float, float* %arrayidx, align 4 ; CHECK: %arrayidx1 = getelementptr inbounds float, float* %dx, i32 %6 ; CHECK: %8 = load float, float* %arrayidx1, align 4 -; CHECK: %mul = fmul float %8, %da -; CHECK: %add = fadd float %7, %mul +; CHECK: %mul = fmul nexc nrnd float %8, %da +; CHECK: %add = fadd nexc nrnd float %7, %mul ; CHECK: store float %add, float* %arrayidx, align 4 ; CHECK: %indvar.next = add i32 %indvar, 1 ; CHECK: %exitcond = icmp eq i32 %6, %5 Index: test/Transforms/Reassociate/mixed-fast-nonfast-fp.ll =================================================================== --- test/Transforms/Reassociate/mixed-fast-nonfast-fp.ll +++ test/Transforms/Reassociate/mixed-fast-nonfast-fp.ll @@ -1,7 +1,7 @@ ; RUN: opt -reassociate %s -S | FileCheck %s define float @foo(float %a,float %b, float %c) { -; CHECK: %mul3 = fmul float %a, %b +; CHECK: %mul3 = fmul nexc nrnd float %a, %b ; CHECK-NEXT: fmul fast float %c, 2.000000e+00 ; CHECK-NEXT: fadd fast float %factor, %b ; CHECK-NEXT: fmul fast float %tmp1, %a @@ -9,10 +9,10 @@ ; CHECK-NEXT: ret float %mul1 = fmul fast float %a, %c %mul2 = fmul fast float %a, %b - %mul3 = fmul float %a, %b + %mul3 = fmul nexc nrnd float %a, %b %mul4 = fmul fast float %a, %c %add1 = fadd fast float %mul1, %mul3 - %add2 = fadd fast float %mul4, %mul2 + %add2 = fadd fast float %mul4, %mul2 %add3 = fadd fast float %add1, %add2 ret float %add3 } Index: test/Transforms/SCCP/apint-load.ll =================================================================== --- test/Transforms/SCCP/apint-load.ll +++ test/Transforms/SCCP/apint-load.ll @@ -29,7 +29,7 @@ %B = call i212 @test3() %C = mul i212 %B, -1234567 %D = sitofp i212 %C to float - %E = fdiv float %A, %D + %E = fdiv nexc nrnd float %A, %D ret float %E } Index: test/Transforms/SLPVectorizer/X86/insert-element-build-vector.ll =================================================================== --- test/Transforms/SLPVectorizer/X86/insert-element-build-vector.ll +++ test/Transforms/SLPVectorizer/X86/insert-element-build-vector.ll @@ -70,9 +70,9 @@ %q1 = extractelement <4 x float> %rd, i32 1 %q2 = extractelement <4 x float> %rd, i32 2 %q3 = extractelement <4 x float> %rd, i32 3 - %q4 = fadd float %q0, %q1 - %q5 = fadd float %q2, %q3 - %q6 = fadd float %q4, %q5 + %q4 = fadd nexc nrnd float %q0, %q1 + %q5 = fadd nexc nrnd float %q2, %q3 + %q6 = fadd nexc nrnd float %q4, %q5 %qi = fcmp olt float %q6, %q5 call void @llvm.assume(i1 %qi) ret <4 x float> undef @@ -242,22 +242,22 @@ ; must be rescheduled. The case here is from compiling Julia. define <4 x float> @reschedule_extract(<4 x float> %a, <4 x float> %b) { ; CHECK-LABEL: @reschedule_extract( -; CHECK: %1 = fadd <4 x float> %a, %b +; CHECK: %1 = fadd nexc nrnd <4 x float> %a, %b %a0 = extractelement <4 x float> %a, i32 0 %b0 = extractelement <4 x float> %b, i32 0 - %c0 = fadd float %a0, %b0 + %c0 = fadd nexc nrnd float %a0, %b0 %v0 = insertelement <4 x float> undef, float %c0, i32 0 %a1 = extractelement <4 x float> %a, i32 1 %b1 = extractelement <4 x float> %b, i32 1 - %c1 = fadd float %a1, %b1 + %c1 = fadd nexc nrnd float %a1, %b1 %v1 = insertelement <4 x float> %v0, float %c1, i32 1 %a2 = extractelement <4 x float> %a, i32 2 %b2 = extractelement <4 x float> %b, i32 2 - %c2 = fadd float %a2, %b2 + %c2 = fadd nexc nrnd float %a2, %b2 %v2 = insertelement <4 x float> %v1, float %c2, i32 2 %a3 = extractelement <4 x float> %a, i32 3 %b3 = extractelement <4 x float> %b, i32 3 - %c3 = fadd float %a3, %b3 + %c3 = fadd nexc nrnd float %a3, %b3 %v3 = insertelement <4 x float> %v2, float %c3, i32 3 ret <4 x float> %v3 } @@ -266,19 +266,19 @@ ; instructions that are erased. define <4 x float> @take_credit(<4 x float> %a, <4 x float> %b) { ; ZEROTHRESH-LABEL: @take_credit( -; ZEROTHRESH: %1 = fadd <4 x float> %a, %b +; ZEROTHRESH: %1 = fadd nexc nrnd <4 x float> %a, %b %a0 = extractelement <4 x float> %a, i32 0 %b0 = extractelement <4 x float> %b, i32 0 - %c0 = fadd float %a0, %b0 + %c0 = fadd nexc nrnd float %a0, %b0 %a1 = extractelement <4 x float> %a, i32 1 %b1 = extractelement <4 x float> %b, i32 1 - %c1 = fadd float %a1, %b1 + %c1 = fadd nexc nrnd float %a1, %b1 %a2 = extractelement <4 x float> %a, i32 2 %b2 = extractelement <4 x float> %b, i32 2 - %c2 = fadd float %a2, %b2 + %c2 = fadd nexc nrnd float %a2, %b2 %a3 = extractelement <4 x float> %a, i32 3 %b3 = extractelement <4 x float> %b, i32 3 - %c3 = fadd float %a3, %b3 + %c3 = fadd nexc nrnd float %a3, %b3 %v0 = insertelement <4 x float> undef, float %c0, i32 0 %v1 = insertelement <4 x float> %v0, float %c1, i32 1 %v2 = insertelement <4 x float> %v1, float %c2, i32 2 @@ -289,33 +289,33 @@ ; Make sure we handle multiple trees that feed one build vector correctly. define <4 x double> @multi_tree(double %w, double %x, double %y, double %z) { entry: - %t0 = fadd double %w , 0.000000e+00 - %t1 = fadd double %x , 1.000000e+00 - %t2 = fadd double %y , 2.000000e+00 - %t3 = fadd double %z , 3.000000e+00 - %t4 = fmul double %t0, 1.000000e+00 + %t0 = fadd nexc nrnd double %w , 0.000000e+00 + %t1 = fadd nexc nrnd double %x , 1.000000e+00 + %t2 = fadd nexc nrnd double %y , 2.000000e+00 + %t3 = fadd nexc nrnd double %z , 3.000000e+00 + %t4 = fmul nexc nrnd double %t0, 1.000000e+00 %i1 = insertelement <4 x double> undef, double %t4, i32 3 - %t5 = fmul double %t1, 1.000000e+00 + %t5 = fmul nexc nrnd double %t1, 1.000000e+00 %i2 = insertelement <4 x double> %i1, double %t5, i32 2 - %t6 = fmul double %t2, 1.000000e+00 + %t6 = fmul nexc nrnd double %t2, 1.000000e+00 %i3 = insertelement <4 x double> %i2, double %t6, i32 1 - %t7 = fmul double %t3, 1.000000e+00 + %t7 = fmul nexc nrnd double %t3, 1.000000e+00 %i4 = insertelement <4 x double> %i3, double %t7, i32 0 ret <4 x double> %i4 } ; CHECK-LABEL: @multi_tree ; CHECK-DAG: %[[V0:.+]] = insertelement <2 x double> undef, double %w, i32 0 ; CHECK-DAG: %[[V1:.+]] = insertelement <2 x double> %[[V0]], double %x, i32 1 -; CHECK-DAG: %[[V2:.+]] = fadd <2 x double> %[[V1]], +; CHECK-DAG: %[[V2:.+]] = fadd nexc nrnd <2 x double> %[[V1]], ; CHECK-DAG: %[[V3:.+]] = insertelement <2 x double> undef, double %y, i32 0 ; CHECK-DAG: %[[V4:.+]] = insertelement <2 x double> %[[V3]], double %z, i32 1 -; CHECK-DAG: %[[V5:.+]] = fadd <2 x double> %[[V4]], -; CHECK-DAG: %[[V6:.+]] = fmul <2 x double> , %[[V2]] +; CHECK-DAG: %[[V5:.+]] = fadd nexc nrnd <2 x double> %[[V4]], +; CHECK-DAG: %[[V6:.+]] = fmul nexc nrnd <2 x double> , %[[V2]] ; CHECK-DAG: %[[V7:.+]] = extractelement <2 x double> %[[V6]], i32 0 ; CHECK-DAG: %[[I1:.+]] = insertelement <4 x double> undef, double %[[V7]], i32 3 ; CHECK-DAG: %[[V8:.+]] = extractelement <2 x double> %[[V6]], i32 1 ; CHECK-DAG: %[[I2:.+]] = insertelement <4 x double> %[[I1]], double %[[V8]], i32 2 -; CHECK-DAG: %[[V9:.+]] = fmul <2 x double> , %[[V5]] +; CHECK-DAG: %[[V9:.+]] = fmul nexc nrnd <2 x double> , %[[V5]] ; CHECK-DAG: %[[V10:.+]] = extractelement <2 x double> %[[V9]], i32 0 ; CHECK-DAG: %[[I3:.+]] = insertelement <4 x double> %i2, double %[[V10]], i32 1 ; CHECK-DAG: %[[V11:.+]] = extractelement <2 x double> %[[V9]], i32 1