diff options
| author | Michael Zolotukhin <mzolotukhin@apple.com> | 2015-02-06 20:02:51 +0000 |
|---|---|---|
| committer | Michael Zolotukhin <mzolotukhin@apple.com> | 2015-02-06 20:02:51 +0000 |
| commit | 4e8598eee3575db313966f24ffb116e06d38ea9c (patch) | |
| tree | 915b1d6c0de0f3bce968df873fe3930124b1b052 /llvm/lib/Transforms | |
| parent | 8c89a82c880112d12f5163926ae26b7c7f3f0b11 (diff) | |
| download | bcm5719-llvm-4e8598eee3575db313966f24ffb116e06d38ea9c.tar.gz bcm5719-llvm-4e8598eee3575db313966f24ffb116e06d38ea9c.zip | |
[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'.
llvm-svn: 228432
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp index bd9da14f669..87237c62299 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -311,7 +311,12 @@ class UnrollAnalyzer : public InstVisitor<UnrollAnalyzer, bool> { 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); |

