[llvm] r325808 - [IRBuilder] add creators for FP with FMF; NFCI
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 22 10:02:32 PST 2018
The motivation is -O0 compile-time:
https://reviews.llvm.org/rL86006
...but it still seems bizarre to do logic folds in the builder. Is it
possible that this isn't a problem anymore or that we can fix it somewhere
else?
On Thu, Feb 22, 2018 at 10:45 AM, Craig Topper <craig.topper at gmail.com>
wrote:
> Weirder still, the OR simplification works for vectors because it uses
> isNullValue on a Constant*. The AND simplification doesn't work for vectors
> because it checks for ConstantInt first. And both of them only work when
> the constant is on the RHS.
>
> ~Craig
>
> On Thu, Feb 22, 2018 at 9:33 AM, Sanjay Patel via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: spatel
>> Date: Thu Feb 22 09:33:20 2018
>> New Revision: 325808
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=325808&view=rev
>> Log:
>> [IRBuilder] add creators for FP with FMF; NFCI
>>
>> Also, add a helper for the constant folder to reduce duplication.
>>
>> It seems out-of-place for and/or to be doing simplifications here?
>> Otherwise, I could have used the helper on those opcodes too.
>>
>> Modified:
>> llvm/trunk/include/llvm/IR/IRBuilder.h
>>
>> Modified: llvm/trunk/include/llvm/IR/IRBuilder.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/
>> IR/IRBuilder.h?rev=325808&r1=325807&r2=325808&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/include/llvm/IR/IRBuilder.h (original)
>> +++ llvm/trunk/include/llvm/IR/IRBuilder.h Thu Feb 22 09:33:20 2018
>> @@ -917,17 +917,23 @@ private:
>> return BO;
>> }
>>
>> - Instruction *AddFPMathAttributes(Instruction *I,
>> - MDNode *FPMathTag,
>> - FastMathFlags FMF) const {
>> - if (!FPMathTag)
>> - FPMathTag = DefaultFPMathTag;
>> - if (FPMathTag)
>> - I->setMetadata(LLVMContext::MD_fpmath, FPMathTag);
>> + Instruction *setFPAttrs(Instruction *I, MDNode *FPMD,
>> + FastMathFlags FMF) const {
>> + if (!FPMD)
>> + FPMD = DefaultFPMathTag;
>> + if (FPMD)
>> + I->setMetadata(LLVMContext::MD_fpmath, FPMD);
>> I->setFastMathFlags(FMF);
>> return I;
>> }
>>
>> + Value *foldConstant(Instruction::BinaryOps Opc, Value *L,
>> + Value *R, const Twine &Name = nullptr) const {
>> + auto *LC = dyn_cast<Constant>(L);
>> + auto *RC = dyn_cast<Constant>(R);
>> + return (LC && RC) ? Insert(Folder.CreateBinOp(Opc, LC, RC), Name) :
>> nullptr;
>> + }
>> +
>> public:
>> Value *CreateAdd(Value *LHS, Value *RHS, const Twine &Name = "",
>> bool HasNUW = false, bool HasNSW = false) {
>> @@ -943,14 +949,6 @@ public:
>> Value *CreateNUWAdd(Value *LHS, Value *RHS, const Twine &Name = "") {
>> return CreateAdd(LHS, RHS, Name, true, false);
>> }
>> - Value *CreateFAdd(Value *LHS, Value *RHS, const Twine &Name = "",
>> - MDNode *FPMathTag = nullptr) {
>> - if (Constant *LC = dyn_cast<Constant>(LHS))
>> - if (Constant *RC = dyn_cast<Constant>(RHS))
>> - return Insert(Folder.CreateFAdd(LC, RC), Name);
>> - return Insert(AddFPMathAttributes(BinaryOperator::CreateFAdd(LHS,
>> RHS),
>> - FPMathTag, FMF), Name);
>> - }
>> Value *CreateSub(Value *LHS, Value *RHS, const Twine &Name = "",
>> bool HasNUW = false, bool HasNSW = false) {
>> if (Constant *LC = dyn_cast<Constant>(LHS))
>> @@ -965,14 +963,6 @@ public:
>> Value *CreateNUWSub(Value *LHS, Value *RHS, const Twine &Name = "") {
>> return CreateSub(LHS, RHS, Name, true, false);
>> }
>> - Value *CreateFSub(Value *LHS, Value *RHS, const Twine &Name = "",
>> - MDNode *FPMathTag = nullptr) {
>> - if (Constant *LC = dyn_cast<Constant>(LHS))
>> - if (Constant *RC = dyn_cast<Constant>(RHS))
>> - return Insert(Folder.CreateFSub(LC, RC), Name);
>> - return Insert(AddFPMathAttributes(BinaryOperator::CreateFSub(LHS,
>> RHS),
>> - FPMathTag, FMF), Name);
>> - }
>> Value *CreateMul(Value *LHS, Value *RHS, const Twine &Name = "",
>> bool HasNUW = false, bool HasNSW = false) {
>> if (Constant *LC = dyn_cast<Constant>(LHS))
>> @@ -987,14 +977,6 @@ public:
>> Value *CreateNUWMul(Value *LHS, Value *RHS, const Twine &Name = "") {
>> return CreateMul(LHS, RHS, Name, true, false);
>> }
>> - Value *CreateFMul(Value *LHS, Value *RHS, const Twine &Name = "",
>> - MDNode *FPMathTag = nullptr) {
>> - if (Constant *LC = dyn_cast<Constant>(LHS))
>> - if (Constant *RC = dyn_cast<Constant>(RHS))
>> - return Insert(Folder.CreateFMul(LC, RC), Name);
>> - return Insert(AddFPMathAttributes(BinaryOperator::CreateFMul(LHS,
>> RHS),
>> - FPMathTag, FMF), Name);
>> - }
>> Value *CreateUDiv(Value *LHS, Value *RHS, const Twine &Name = "",
>> bool isExact = false) {
>> if (Constant *LC = dyn_cast<Constant>(LHS))
>> @@ -1019,35 +1001,14 @@ public:
>> Value *CreateExactSDiv(Value *LHS, Value *RHS, const Twine &Name = "")
>> {
>> return CreateSDiv(LHS, RHS, Name, true);
>> }
>> - Value *CreateFDiv(Value *LHS, Value *RHS, const Twine &Name = "",
>> - MDNode *FPMathTag = nullptr) {
>> - if (Constant *LC = dyn_cast<Constant>(LHS))
>> - if (Constant *RC = dyn_cast<Constant>(RHS))
>> - return Insert(Folder.CreateFDiv(LC, RC), Name);
>> - return Insert(AddFPMathAttributes(BinaryOperator::CreateFDiv(LHS,
>> RHS),
>> - FPMathTag, FMF), Name);
>> - }
>> Value *CreateURem(Value *LHS, Value *RHS, const Twine &Name = "") {
>> - if (Constant *LC = dyn_cast<Constant>(LHS))
>> - if (Constant *RC = dyn_cast<Constant>(RHS))
>> - return Insert(Folder.CreateURem(LC, RC), Name);
>> + if (Value *V = foldConstant(Instruction::URem, LHS, RHS, Name))
>> return V;
>> return Insert(BinaryOperator::CreateURem(LHS, RHS), Name);
>> }
>> Value *CreateSRem(Value *LHS, Value *RHS, const Twine &Name = "") {
>> - if (Constant *LC = dyn_cast<Constant>(LHS))
>> - if (Constant *RC = dyn_cast<Constant>(RHS))
>> - return Insert(Folder.CreateSRem(LC, RC), Name);
>> + if (Value *V = foldConstant(Instruction::SRem, LHS, RHS, Name))
>> return V;
>> return Insert(BinaryOperator::CreateSRem(LHS, RHS), Name);
>> }
>> - Value *CreateFRem(Value *LHS, Value *RHS, const Twine &Name = "",
>> - MDNode *FPMathTag = nullptr) {
>> - if (Constant *LC = dyn_cast<Constant>(LHS))
>> - if (Constant *RC = dyn_cast<Constant>(RHS))
>> - return Insert(Folder.CreateFRem(LC, RC), Name);
>> - return Insert(AddFPMathAttributes(BinaryOperator::CreateFRem(LHS,
>> RHS),
>> - FPMathTag, FMF), Name);
>> - }
>> -
>> Value *CreateShl(Value *LHS, Value *RHS, const Twine &Name = "",
>> bool HasNUW = false, bool HasNSW = false) {
>> if (Constant *LC = dyn_cast<Constant>(LHS))
>> @@ -1136,9 +1097,7 @@ public:
>> }
>>
>> Value *CreateXor(Value *LHS, Value *RHS, const Twine &Name = "") {
>> - if (Constant *LC = dyn_cast<Constant>(LHS))
>> - if (Constant *RC = dyn_cast<Constant>(RHS))
>> - return Insert(Folder.CreateXor(LC, RC), Name);
>> + if (Value *V = foldConstant(Instruction::Xor, LHS, RHS, Name))
>> return V;
>> return Insert(BinaryOperator::CreateXor(LHS, RHS), Name);
>> }
>> Value *CreateXor(Value *LHS, const APInt &RHS, const Twine &Name = "")
>> {
>> @@ -1147,16 +1106,89 @@ public:
>> Value *CreateXor(Value *LHS, uint64_t RHS, const Twine &Name = "") {
>> return CreateXor(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
>> }
>> + Value *CreateFAdd(Value *L, Value *R, const Twine &Name = "",
>> + MDNode *FPMD = nullptr) {
>> + if (Value *V = foldConstant(Instruction::FAdd, L, R, Name)) return
>> V;
>> + Instruction *I = setFPAttrs(BinaryOperator::CreateFAdd(L, R), FPMD,
>> FMF);
>> + return Insert(I, Name);
>> + }
>> + /// Copy fast-math-flags from an instruction rather than using the
>> builder's
>> + /// default FMF.
>> + Value *CreateFAddFMF(Value *L, Value *R, Instruction *FMFSource,
>> + const Twine &Name = "") {
>> + if (Value *V = foldConstant(Instruction::FAdd, L, R, Name)) return
>> V;
>> + Instruction *I = setFPAttrs(BinaryOperator::CreateFAdd(L, R),
>> nullptr,
>> + FMFSource->getFastMathFlags());
>> + return Insert(I, Name);
>> + }
>> + Value *CreateFSub(Value *L, Value *R, const Twine &Name = "",
>> + MDNode *FPMD = nullptr) {
>> + if (Value *V = foldConstant(Instruction::FSub, L, R, Name)) return
>> V;
>> + Instruction *I = setFPAttrs(BinaryOperator::CreateFSub(L, R), FPMD,
>> FMF);
>> + return Insert(I, Name);
>> + }
>> + /// Copy fast-math-flags from an instruction rather than using the
>> builder's
>> + /// default FMF.
>> + Value *CreateFSubFMF(Value *L, Value *R, Instruction *FMFSource,
>> + const Twine &Name = "") {
>> + if (Value *V = foldConstant(Instruction::FSub, L, R, Name)) return
>> V;
>> + Instruction *I = setFPAttrs(BinaryOperator::CreateFSub(L, R),
>> nullptr,
>> + FMFSource->getFastMathFlags());
>> + return Insert(I, Name);
>> + }
>> + Value *CreateFMul(Value *L, Value *R, const Twine &Name = "",
>> + MDNode *FPMD = nullptr) {
>> + if (Value *V = foldConstant(Instruction::FMul, L, R, Name)) return
>> V;
>> + Instruction *I = setFPAttrs(BinaryOperator::CreateFMul(L, R), FPMD,
>> FMF);
>> + return Insert(I, Name);
>> + }
>> + /// Copy fast-math-flags from an instruction rather than using the
>> builder's
>> + /// default FMF.
>> + Value *CreateFMulFMF(Value *L, Value *R, Instruction *FMFSource,
>> + const Twine &Name = "") {
>> + if (Value *V = foldConstant(Instruction::FMul, L, R, Name)) return
>> V;
>> + Instruction *I = setFPAttrs(BinaryOperator::CreateFMul(L, R),
>> nullptr,
>> + FMFSource->getFastMathFlags());
>> + return Insert(I, Name);
>> + }
>> + Value *CreateFDiv(Value *L, Value *R, const Twine &Name = "",
>> + MDNode *FPMD = nullptr) {
>> + if (Value *V = foldConstant(Instruction::FDiv, L, R, Name)) return
>> V;
>> + Instruction *I = setFPAttrs(BinaryOperator::CreateFDiv(L, R), FPMD,
>> FMF);
>> + return Insert(I, Name);
>> + }
>> + /// Copy fast-math-flags from an instruction rather than using the
>> builder's
>> + /// default FMF.
>> + Value *CreateFDivFMF(Value *L, Value *R, Instruction *FMFSource,
>> + const Twine &Name = "") {
>> + if (Value *V = foldConstant(Instruction::FDiv, L, R, Name)) return
>> V;
>> + Instruction *I = setFPAttrs(BinaryOperator::CreateFDiv(L, R),
>> nullptr,
>> + FMFSource->getFastMathFlags());
>> + return Insert(I, Name);
>> + }
>> + Value *CreateFRem(Value *L, Value *R, const Twine &Name = "",
>> + MDNode *FPMD = nullptr) {
>> + if (Value *V = foldConstant(Instruction::FRem, L, R, Name)) return
>> V;
>> + Instruction *I = setFPAttrs(BinaryOperator::CreateFRem(L, R), FPMD,
>> FMF);
>> + return Insert(I, Name);
>> + }
>> + /// Copy fast-math-flags from an instruction rather than using the
>> builder's
>> + /// default FMF.
>> + Value *CreateFRemFMF(Value *L, Value *R, Instruction *FMFSource,
>> + const Twine &Name = "") {
>> + if (Value *V = foldConstant(Instruction::FRem, L, R, Name)) return
>> V;
>> + Instruction *I = setFPAttrs(BinaryOperator::CreateFRem(L, R),
>> nullptr,
>> + FMFSource->getFastMathFlags());
>> + return Insert(I, Name);
>> + }
>>
>> Value *CreateBinOp(Instruction::BinaryOps Opc,
>> Value *LHS, Value *RHS, const Twine &Name = "",
>> MDNode *FPMathTag = nullptr) {
>> - if (Constant *LC = dyn_cast<Constant>(LHS))
>> - if (Constant *RC = dyn_cast<Constant>(RHS))
>> - return Insert(Folder.CreateBinOp(Opc, LC, RC), Name);
>> + if (Value *V = foldConstant(Opc, LHS, RHS, Name)) return V;
>> Instruction *BinOp = BinaryOperator::Create(Opc, LHS, RHS);
>> if (isa<FPMathOperator>(BinOp))
>> - BinOp = AddFPMathAttributes(BinOp, FPMathTag, FMF);
>> + BinOp = setFPAttrs(BinOp, FPMathTag, FMF);
>> return Insert(BinOp, Name);
>> }
>>
>> @@ -1179,8 +1211,8 @@ public:
>> MDNode *FPMathTag = nullptr) {
>> if (Constant *VC = dyn_cast<Constant>(V))
>> return Insert(Folder.CreateFNeg(VC), Name);
>> - return Insert(AddFPMathAttributes(BinaryOperator::CreateFNeg(V),
>> - FPMathTag, FMF), Name);
>> + return Insert(setFPAttrs(BinaryOperator::CreateFNeg(V), FPMathTag,
>> FMF),
>> + Name);
>> }
>> Value *CreateNot(Value *V, const Twine &Name = "") {
>> if (Constant *VC = dyn_cast<Constant>(V))
>> @@ -1686,8 +1718,7 @@ public:
>> if (Constant *LC = dyn_cast<Constant>(LHS))
>> if (Constant *RC = dyn_cast<Constant>(RHS))
>> return Insert(Folder.CreateFCmp(P, LC, RC), Name);
>> - return Insert(AddFPMathAttributes(new FCmpInst(P, LHS, RHS),
>> - FPMathTag, FMF), Name);
>> + return Insert(setFPAttrs(new FCmpInst(P, LHS, RHS), FPMathTag, FMF),
>> Name);
>> }
>>
>> //===------------------------------------------------------
>> --------------===//
>> @@ -1711,7 +1742,7 @@ public:
>> MDNode *FPMathTag = nullptr) {
>> CallInst *CI = CallInst::Create(FTy, Callee, Args,
>> DefaultOperandBundles);
>> if (isa<FPMathOperator>(CI))
>> - CI = cast<CallInst>(AddFPMathAttributes(CI, FPMathTag, FMF));
>> + CI = cast<CallInst>(setFPAttrs(CI, FPMathTag, FMF));
>> return Insert(CI, Name);
>> }
>>
>> @@ -1720,7 +1751,7 @@ public:
>> const Twine &Name = "", MDNode *FPMathTag =
>> nullptr) {
>> CallInst *CI = CallInst::Create(Callee, Args, OpBundles);
>> if (isa<FPMathOperator>(CI))
>> - CI = cast<CallInst>(AddFPMathAttributes(CI, FPMathTag, FMF));
>> + CI = cast<CallInst>(setFPAttrs(CI, FPMathTag, FMF));
>> return Insert(CI, Name);
>> }
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180222/2a322ce9/attachment.html>
More information about the llvm-commits
mailing list