Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Sep 2015 18:21:48 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r288222 - projects/clang370-import/contrib/llvm/patches
Message-ID:  <201509251821.t8PILm3c075437@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Fri Sep 25 18:21:48 2015
New Revision: 288222
URL: https://svnweb.freebsd.org/changeset/base/288222

Log:
  Add llvm patch corresponding to r288195.

Added:
  projects/clang370-import/contrib/llvm/patches/patch-06-llvm-r248439-fdiv-hoisting.diff

Added: projects/clang370-import/contrib/llvm/patches/patch-06-llvm-r248439-fdiv-hoisting.diff
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/clang370-import/contrib/llvm/patches/patch-06-llvm-r248439-fdiv-hoisting.diff	Fri Sep 25 18:21:48 2015	(r288222)
@@ -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 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201509251821.t8PILm3c075437>