summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2012-04-10 08:23:07 +0000
committerDuncan Sands <baldrick@free.fr>2012-04-10 08:23:07 +0000
commite81111ca7127ad1a326f299caa03ce1eee458f07 (patch)
treeded67742485e74a003d733211b56e0ef1a855e6f /clang
parentaf06b26c8ebc81de6b3e8337f8e5d501b89276d3 (diff)
downloadbcm5719-llvm-e81111ca7127ad1a326f299caa03ce1eee458f07.tar.gz
bcm5719-llvm-e81111ca7127ad1a326f299caa03ce1eee458f07.zip
Express the number of ULPs in fpaccuracy metadata as a real rather than a
rational number, eg as 2.5 rather than 5, 2. OK'd by Peter Collingbourne. llvm-svn: 154388
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CGExpr.cpp11
-rw-r--r--clang/lib/CodeGen/CGExprScalar.cpp2
-rw-r--r--clang/lib/CodeGen/CodeGenFunction.h3
-rw-r--r--clang/test/CodeGenOpenCL/fpaccuracy.cl2
4 files changed, 7 insertions, 11 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index 0efb50884cc..dbf41f38b8f 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -3001,16 +3001,13 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) {
return ConvertTempToRValue(*this, E->getType(), OrigDest);
}
-void CodeGenFunction::SetFPAccuracy(llvm::Value *Val, unsigned AccuracyN,
- unsigned AccuracyD) {
+void CodeGenFunction::SetFPAccuracy(llvm::Value *Val, float Accuracy) {
assert(Val->getType()->isFPOrFPVectorTy());
- if (!AccuracyN || !isa<llvm::Instruction>(Val))
+ if (Accuracy == 0.0 || !isa<llvm::Instruction>(Val))
return;
- llvm::Value *Vals[2];
- Vals[0] = llvm::ConstantInt::get(Int32Ty, AccuracyN);
- Vals[1] = llvm::ConstantInt::get(Int32Ty, AccuracyD);
- llvm::MDNode *Node = llvm::MDNode::get(getLLVMContext(), Vals);
+ llvm::Value *ULPs = llvm::ConstantFP::get(Builder.getFloatTy(), Accuracy);
+ llvm::MDNode *Node = llvm::MDNode::get(getLLVMContext(), ULPs);
cast<llvm::Instruction>(Val)->setMetadata(llvm::LLVMContext::MD_fpaccuracy,
Node);
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp
index 5723541c62d..18891f7492a 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -1807,7 +1807,7 @@ Value *ScalarExprEmitter::EmitDiv(const BinOpInfo &Ops) {
if (ValTy->isFloatTy() ||
(isa<llvm::VectorType>(ValTy) &&
cast<llvm::VectorType>(ValTy)->getElementType()->isFloatTy()))
- CGF.SetFPAccuracy(Val, 5, 2);
+ CGF.SetFPAccuracy(Val, 2.5);
}
return Val;
}
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h
index bcc2c7bc155..3e0cd146256 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -2518,8 +2518,7 @@ public:
/// SetFPAccuracy - Set the minimum required accuracy of the given floating
/// point operation, expressed as the maximum relative error in ulp.
- void SetFPAccuracy(llvm::Value *Val, unsigned AccuracyN,
- unsigned AccuracyD = 1);
+ void SetFPAccuracy(llvm::Value *Val, float Accuracy);
private:
llvm::MDNode *getRangeForLoadFromType(QualType Ty);
diff --git a/clang/test/CodeGenOpenCL/fpaccuracy.cl b/clang/test/CodeGenOpenCL/fpaccuracy.cl
index 47fca696f9a..d27316a799f 100644
--- a/clang/test/CodeGenOpenCL/fpaccuracy.cl
+++ b/clang/test/CodeGenOpenCL/fpaccuracy.cl
@@ -22,4 +22,4 @@ double dpscalardiv(double a, double b) {
return a / b;
}
-// CHECK: ![[MD]] = metadata !{i{{[0-9]+}} 5, i{{[0-9]+}} 2}
+// CHECK: ![[MD]] = metadata !{float 2.500000e+00}
OpenPOWER on IntegriCloud