[llvm] r228432 - [InstSimplify] Add SimplifyFPBinOp function.

Michael Zolotukhin mzolotukhin at apple.com
Fri Feb 6 12:23:30 PST 2015


> On Feb 6, 2015, at 12:10 PM, Chad Rosier <mcrosier at codeaurora.org> wrote:
> 
> testcase?
I’ll follow up shortly with that.

Thanks,
Michael

> 
>> Author: mzolotukhin
>> Date: Fri Feb  6 14:02:51 2015
>> New Revision: 228432
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=228432&view=rev
>> Log:
>> [InstSimplify] Add SimplifyFPBinOp function.
>> 
>> It is a variation of SimplifyBinOp, but it takes into account
>> FastMathFlags.
>> 
>> It is needed in inliner and loop-unroller to accurately predict the
>> transformation's outcome (previously we dropped the flags and were too
>> conservative in some cases).
>> 
>> Example:
>> float foo(float *a, float b) {
>> float r;
>> if (a[1] * b)
>>   r = /* a lot of expensive computations */;
>> else
>>   r = 1;
>> return r;
>> }
>> float boo(float *a) {
>> return foo(a, 0.0);
>> }
>> 
>> Without this patch, we don't inline 'foo' into 'boo'.
>> 
>> Modified:
>>    llvm/trunk/include/llvm/Analysis/InstructionSimplify.h
>>    llvm/trunk/lib/Analysis/IPA/InlineCost.cpp
>>    llvm/trunk/lib/Analysis/InstructionSimplify.cpp
>>    llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp
>> 
>> Modified: llvm/trunk/include/llvm/Analysis/InstructionSimplify.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/InstructionSimplify.h?rev=228432&r1=228431&r2=228432&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/InstructionSimplify.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/InstructionSimplify.h Fri Feb  6
>> 14:02:51 2015
>> @@ -277,6 +277,17 @@ namespace llvm {
>>                        const DominatorTree *DT = nullptr,
>>                        AssumptionCache *AC = nullptr,
>>                        const Instruction *CxtI = nullptr);
>> +  /// SimplifyFPBinOp - Given operands for a BinaryOperator, see if we
>> can
>> +  /// fold the result.  If not, this returns null.
>> +  /// In contrast to SimplifyBinOp, try to use FastMathFlag when folding
>> the
>> +  /// result. In case we don't need FastMathFlags, simply fall to
>> SimplifyBinOp.
>> +  Value *SimplifyFPBinOp(unsigned Opcode, Value *LHS, Value *RHS,
>> +                         const FastMathFlags &FMF,
>> +                         const DataLayout *TD = nullptr,
>> +                         const TargetLibraryInfo *TLI = nullptr,
>> +                         const DominatorTree *DT = nullptr,
>> +                         AssumptionCache *AC = nullptr,
>> +                         const Instruction *CxtI = nullptr);
>> 
>>   /// \brief Given a function and iterators over arguments, see if we can
>> fold
>>   /// the result.
>> 
>> Modified: llvm/trunk/lib/Analysis/IPA/InlineCost.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/InlineCost.cpp?rev=228432&r1=228431&r2=228432&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/IPA/InlineCost.cpp (original)
>> +++ llvm/trunk/lib/Analysis/IPA/InlineCost.cpp Fri Feb  6 14:02:51 2015
>> @@ -601,7 +601,13 @@ bool CallAnalyzer::visitBinaryOperator(B
>>   if (!isa<Constant>(RHS))
>>     if (Constant *SimpleRHS = SimplifiedValues.lookup(RHS))
>>       RHS = SimpleRHS;
>> -  Value *SimpleV = SimplifyBinOp(I.getOpcode(), LHS, RHS, DL);
>> +  Value *SimpleV = nullptr;
>> +  if (auto FI = dyn_cast<FPMathOperator>(&I))
>> +    SimpleV =
>> +        SimplifyFPBinOp(I.getOpcode(), LHS, RHS, FI->getFastMathFlags(),
>> DL);
>> +  else
>> +    SimpleV = SimplifyBinOp(I.getOpcode(), LHS, RHS, DL);
>> +
>>   if (Constant *C = dyn_cast_or_null<Constant>(SimpleV)) {
>>     SimplifiedValues[&I] = C;
>>     return true;
>> 
>> Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=228432&r1=228431&r2=228432&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
>> +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Fri Feb  6 14:02:51
>> 2015
>> @@ -61,6 +61,8 @@ struct Query {
>> static Value *SimplifyAndInst(Value *, Value *, const Query &, unsigned);
>> static Value *SimplifyBinOp(unsigned, Value *, Value *, const Query &,
>>                             unsigned);
>> +static Value *SimplifyFPBinOp(unsigned, Value *, Value *, const
>> FastMathFlags &,
>> +                              const Query &, unsigned);
>> static Value *SimplifyCmpInst(unsigned, Value *, Value *, const Query &,
>>                               unsigned);
>> static Value *SimplifyOrInst(Value *, Value *, const Query &, unsigned);
>> @@ -3465,6 +3467,25 @@ static Value *SimplifyBinOp(unsigned Opc
>>   }
>> }
>> 
>> +/// SimplifyFPBinOp - Given operands for a BinaryOperator, see if we can
>> +/// fold the result.  If not, this returns null.
>> +/// In contrast to SimplifyBinOp, try to use FastMathFlag when folding
>> the
>> +/// result. In case we don't need FastMathFlags, simply fall to
>> SimplifyBinOp.
>> +static Value *SimplifyFPBinOp(unsigned Opcode, Value *LHS, Value *RHS,
>> +                              const FastMathFlags &FMF, const Query &Q,
>> +                              unsigned MaxRecurse) {
>> +  switch (Opcode) {
>> +  case Instruction::FAdd:
>> +    return SimplifyFAddInst(LHS, RHS, FMF, Q, MaxRecurse);
>> +  case Instruction::FSub:
>> +    return SimplifyFSubInst(LHS, RHS, FMF, Q, MaxRecurse);
>> +  case Instruction::FMul:
>> +    return SimplifyFMulInst(LHS, RHS, FMF, Q, MaxRecurse);
>> +  default:
>> +    return SimplifyBinOp(Opcode, LHS, RHS, Q, MaxRecurse);
>> +  }
>> +}
>> +
>> Value *llvm::SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
>>                            const DataLayout *DL, const TargetLibraryInfo
>> *TLI,
>>                            const DominatorTree *DT, AssumptionCache *AC,
>> @@ -3473,6 +3494,15 @@ Value *llvm::SimplifyBinOp(unsigned Opco
>>                          RecursionLimit);
>> }
>> 
>> +Value *llvm::SimplifyFPBinOp(unsigned Opcode, Value *LHS, Value *RHS,
>> +                             const FastMathFlags &FMF, const DataLayout
>> *DL,
>> +                             const TargetLibraryInfo *TLI,
>> +                             const DominatorTree *DT, AssumptionCache
>> *AC,
>> +                             const Instruction *CxtI) {
>> +  return ::SimplifyFPBinOp(Opcode, LHS, RHS, FMF, Query(DL, TLI, DT, AC,
>> CxtI),
>> +                           RecursionLimit);
>> +}
>> +
>> /// SimplifyCmpInst - Given operands for a CmpInst, see if we can
>> /// fold the result.
>> static Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
>> 
>> Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=228432&r1=228431&r2=228432&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp Fri Feb  6
>> 14:02:51 2015
>> @@ -311,7 +311,12 @@ class UnrollAnalyzer : public InstVisito
>>     if (!isa<Constant>(RHS))
>>       if (Constant *SimpleRHS = SimplifiedValues.lookup(RHS))
>>         RHS = SimpleRHS;
>> -    Value *SimpleV = SimplifyBinOp(I.getOpcode(), LHS, RHS);
>> +    Value *SimpleV = nullptr;
>> +    if (auto FI = dyn_cast<FPMathOperator>(&I))
>> +      SimpleV =
>> +          SimplifyFPBinOp(I.getOpcode(), LHS, RHS,
>> FI->getFastMathFlags());
>> +    else
>> +      SimpleV = SimplifyBinOp(I.getOpcode(), LHS, RHS);
>> 
>>     if (SimpleV && CountedInsns.insert(&I).second)
>>       NumberOfOptimizedInstructions += TTI.getUserCost(&I);
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
> 
> 





More information about the llvm-commits mailing list