[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