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

Michael Zolotukhin mzolotukhin at apple.com
Thu Feb 12 12:02:16 PST 2015


Thanks, Chad! I committed the testcase in r228432, since there is no other feedback yet, and it’s better to have the test in place.

Thanks,
Michael

> On Feb 10, 2015, at 11:36 AM, Chad Rosier <mcrosier at codeaurora.org> wrote:
> 
> Chandler may have a few suggestions, but the test LGTM.
> 
> Chad
> 
> 
>> Hi Chandler, Chad,
>> 
>> Could you please take a look at the attached testcase?
>> 
>> 
>> 
>> Is it ok to commit it?
>> 
>> Thanks,
>> Michael
>> 
>>> On Feb 6, 2015, at 12:23 PM, Michael Zolotukhin <mzolotukhin at apple.com>
>>> wrote:
>>> 
>>>> On Feb 6, 2015, at 12:10 PM, Chad Rosier <mcrosier at codeaurora.org
>>>> <mailto:mcrosier at codeaurora.org <mailto: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 <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 <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 <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 <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 <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 <mailto:llvm-commits at cs.uiuc.edu>
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu> <mailto:llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>>
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>>> <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150212/26ab7606/attachment.html>


More information about the llvm-commits mailing list