]> granicus.if.org Git - clang/commitdiff
Express the number of ULPs in fpaccuracy metadata as a real rather than a
authorDuncan Sands <baldrick@free.fr>
Tue, 10 Apr 2012 08:23:07 +0000 (08:23 +0000)
committerDuncan Sands <baldrick@free.fr>
Tue, 10 Apr 2012 08:23:07 +0000 (08:23 +0000)
rational number, eg as 2.5 rather than 5, 2.  OK'd by Peter Collingbourne.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154388 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExpr.cpp
lib/CodeGen/CGExprScalar.cpp
lib/CodeGen/CodeGenFunction.h
test/CodeGenOpenCL/fpaccuracy.cl

index 0efb50884ccaacb19f97151d27ca19a1a7e5d7fe..dbf41f38b8f8293f7b51194cbcc5f7e32566606a 100644 (file)
@@ -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);
index 5723541c62df27a0ea4f7f10237d3196779eddf4..18891f7492a28ea588064c9a2b8436cee42f4d03 100644 (file)
@@ -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;
   }
index bcc2c7bc155a197689f5718f79fc8c5002ad3180..3e0cd146256f7486db5eb3c78721491ca8723558 100644 (file)
@@ -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);
index 47fca696f9af726a6b83bccc4dfa0033b5c94378..d27316a799f3e553ee7f45e9fa488d1b9404aede 100644 (file)
@@ -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}