diff options
author | dim <dim@FreeBSD.org> | 2015-09-25 18:21:48 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2015-09-25 18:21:48 +0000 |
commit | d3edc9664e05776279ed8ad8a20ad14cdd579030 (patch) | |
tree | e598d38e9e4ea7879001e2bdb8363991ae0b9d36 /contrib/llvm/patches | |
parent | 5c80b187639f9d0f9013ea4068039582c115f9f8 (diff) | |
download | FreeBSD-src-d3edc9664e05776279ed8ad8a20ad14cdd579030.zip FreeBSD-src-d3edc9664e05776279ed8ad8a20ad14cdd579030.tar.gz |
Add llvm patch corresponding to r288195.
Diffstat (limited to 'contrib/llvm/patches')
-rw-r--r-- | contrib/llvm/patches/patch-06-llvm-r248439-fdiv-hoisting.diff | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/contrib/llvm/patches/patch-06-llvm-r248439-fdiv-hoisting.diff b/contrib/llvm/patches/patch-06-llvm-r248439-fdiv-hoisting.diff new file mode 100644 index 0000000..d066b25 --- /dev/null +++ b/contrib/llvm/patches/patch-06-llvm-r248439-fdiv-hoisting.diff @@ -0,0 +1,83 @@ +Pull in r248439 from upstream llvm trunk (by Sanjay Patel): + + set div/rem default values to 'expensive' in TargetTransformInfo's + cost model + + ...because that's what the cost model was intended to do. + + As discussed in D12882, this fix has a temporary unintended + consequence for SimplifyCFG: it causes us to not speculate an fdiv. + However, two wrongs make PR24818 right, and two wrongs make PR24343 + act right even though it's really still wrong. + + I intend to correct SimplifyCFG and add to CodeGenPrepare to account + for this cost model change and preserve the righteousness for the bug + report cases. + + https://llvm.org/bugs/show_bug.cgi?id=24818 + https://llvm.org/bugs/show_bug.cgi?id=24343 + + Differential Revision: http://reviews.llvm.org/D12882 + +This fixes the too-eager fdiv hoisting in pow(), which could lead to +unexpected floating point exceptions. + +Introduced here: http://svnweb.freebsd.org/changeset/base/288195 + +Index: include/llvm/Analysis/TargetTransformInfoImpl.h +=================================================================== +--- include/llvm/Analysis/TargetTransformInfoImpl.h ++++ include/llvm/Analysis/TargetTransformInfoImpl.h +@@ -60,6 +60,14 @@ class TargetTransformInfoImplBase { + // Otherwise, the default basic cost is used. + return TTI::TCC_Basic; + ++ case Instruction::FDiv: ++ case Instruction::FRem: ++ case Instruction::SDiv: ++ case Instruction::SRem: ++ case Instruction::UDiv: ++ case Instruction::URem: ++ return TTI::TCC_Expensive; ++ + case Instruction::IntToPtr: { + // An inttoptr cast is free so long as the input is a legal integer type + // which doesn't contain values outside the range of a pointer. +Index: test/Transforms/SimplifyCFG/speculate-math.ll +=================================================================== +--- test/Transforms/SimplifyCFG/speculate-math.ll ++++ test/Transforms/SimplifyCFG/speculate-math.ll +@@ -7,6 +7,33 @@ declare float @llvm.fabs.f32(float) nounwind reado + declare float @llvm.minnum.f32(float, float) nounwind readonly + declare float @llvm.maxnum.f32(float, float) nounwind readonly + ++; FIXME: This is intended to be a temporary test. As discussed in ++; D12882, we actually do want to speculate even expensive operations ++; in SimplifyCFG because it can expose more optimizations for other ++; passes. Therefore, we either need to adjust SimplifyCFG's ++; calculations that use the TTI cost model or use a different cost ++; model for deciding which ops should be speculated in SimplifyCFG. ++; We should also be using the TTI cost model later - for example in ++; CodeGenPrepare - to potentially undo this speculation. ++ ++; Do not speculate fdiv by default because it is generally expensive. ++ ++; CHECK-LABEL: @fdiv_test( ++; CHECK-NOT: select ++define double @fdiv_test(double %a, double %b) { ++entry: ++ %cmp = fcmp ogt double %a, 0.0 ++ br i1 %cmp, label %cond.true, label %cond.end ++ ++cond.true: ++ %div = fdiv double %b, %a ++ br label %cond.end ++ ++cond.end: ++ %cond = phi double [ %div, %cond.true ], [ 0.0, %entry ] ++ ret double %cond ++} ++ + ; CHECK-LABEL: @sqrt_test( + ; CHECK: select + define void @sqrt_test(float addrspace(1)* noalias nocapture %out, float %a) nounwind { |