From be913530f9068259fe1c4576a5016219cc315e9b Mon Sep 17 00:00:00 2001 From: Cameron McInally Date: Fri, 7 Jun 2019 18:59:51 +0000 Subject: [PATCH] [IR] Add UnaryOperator::CreateFNegFMF(...) Differential Revision: https://reviews.llvm.org/D62705 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362828 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/InstrTypes.h | 16 +++++++++++++++- unittests/IR/InstructionsTest.cpp | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/include/llvm/IR/InstrTypes.h b/include/llvm/IR/InstrTypes.h index 237929f5e60..ca419b50da6 100644 --- a/include/llvm/IR/InstrTypes.h +++ b/include/llvm/IR/InstrTypes.h @@ -154,6 +154,20 @@ public: } #include "llvm/IR/Instruction.def" + static UnaryOperator *CreateWithCopiedFlags(UnaryOps Opc, + Value *V, + Instruction *CopyO, + const Twine &Name = "") { + UnaryOperator *UO = Create(Opc, V, Name); + UO->copyIRFlags(CopyO); + return UO; + } + + static UnaryOperator *CreateFNegFMF(Value *Op, Instruction *FMFSource, + const Twine &Name = "") { + return CreateWithCopiedFlags(Instruction::FNeg, Op, FMFSource, Name); + } + UnaryOps getOpcode() const { return static_cast(Instruction::getOpcode()); } @@ -269,7 +283,7 @@ public: static BinaryOperator *CreateFNegFMF(Value *Op, Instruction *FMFSource, const Twine &Name = "") { Value *Zero = ConstantFP::getNegativeZero(Op->getType()); - return CreateWithCopiedFlags(Instruction::FSub, Zero, Op, FMFSource); + return CreateWithCopiedFlags(Instruction::FSub, Zero, Op, FMFSource, Name); } static BinaryOperator *CreateNSW(BinaryOps Opc, Value *V1, Value *V2, diff --git a/unittests/IR/InstructionsTest.cpp b/unittests/IR/InstructionsTest.cpp index 70d51e5fc6d..7edd3a98bfb 100644 --- a/unittests/IR/InstructionsTest.cpp +++ b/unittests/IR/InstructionsTest.cpp @@ -1081,5 +1081,23 @@ TEST(InstructionsTest, PhiIsNotFPMathOperator) { I->deleteValue(); } +TEST(InstructionsTest, FNegInstruction) { + LLVMContext Context; + Type *FltTy = Type::getFloatTy(Context); + Constant *One = ConstantFP::get(FltTy, 1.0); + BinaryOperator *FAdd = BinaryOperator::CreateFAdd(One, One); + FAdd->setHasNoNaNs(true); + UnaryOperator *FNeg = UnaryOperator::CreateFNegFMF(One, FAdd); + EXPECT_TRUE(FNeg->hasNoNaNs()); + EXPECT_FALSE(FNeg->hasNoInfs()); + EXPECT_FALSE(FNeg->hasNoSignedZeros()); + EXPECT_FALSE(FNeg->hasAllowReciprocal()); + EXPECT_FALSE(FNeg->hasAllowContract()); + EXPECT_FALSE(FNeg->hasAllowReassoc()); + EXPECT_FALSE(FNeg->hasApproxFunc()); + FAdd->deleteValue(); + FNeg->deleteValue(); +} + } // end anonymous namespace } // end namespace llvm