diff options
author | Duncan Sands <baldrick@free.fr> | 2012-04-10 08:23:07 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2012-04-10 08:23:07 +0000 |
commit | e81111ca7127ad1a326f299caa03ce1eee458f07 (patch) | |
tree | ded67742485e74a003d733211b56e0ef1a855e6f /clang | |
parent | af06b26c8ebc81de6b3e8337f8e5d501b89276d3 (diff) | |
download | bcm5719-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.cpp | 11 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprScalar.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 3 | ||||
-rw-r--r-- | clang/test/CodeGenOpenCL/fpaccuracy.cl | 2 |
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} |