[IR] Add UnaryOperator::CreateFNegFMF(...)

Differential Revision: https://reviews.llvm.org/D62705

llvm-svn: 362828
This commit is contained in:
Cameron McInally 2019-06-07 18:59:51 +00:00
parent 9fa6538f3b
commit ef57e50bd2
2 changed files with 33 additions and 1 deletions

View File

@ -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<UnaryOps>(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,

View File

@ -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