[llvm] r228432 - [InstSimplify] Add SimplifyFPBinOp function.
Chad Rosier
mcrosier at codeaurora.org
Fri Feb 6 12:10:43 PST 2015
testcase?
> 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