[llvm-commits] [llvm] r154387 - in /llvm/trunk: docs/LangRef.html include/llvm/ADT/APFloat.h lib/VMCore/Verifier.cpp test/Verifier/fpaccuracy.ll
Duncan Sands
baldrick at free.fr
Tue Apr 10 01:22:44 PDT 2012
Author: baldrick
Date: Tue Apr 10 03:22:43 2012
New Revision: 154387
URL: http://llvm.org/viewvc/llvm-project?rev=154387&view=rev
Log:
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.
Added:
llvm/trunk/test/Verifier/fpaccuracy.ll
Modified:
llvm/trunk/docs/LangRef.html
llvm/trunk/include/llvm/ADT/APFloat.h
llvm/trunk/lib/VMCore/Verifier.cpp
Modified: llvm/trunk/docs/LangRef.html
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=154387&r1=154386&r2=154387&view=diff
==============================================================================
--- llvm/trunk/docs/LangRef.html (original)
+++ llvm/trunk/docs/LangRef.html Tue Apr 10 03:22:43 2012
@@ -3021,13 +3021,13 @@
</blockquote>
-<p>The maximum relative error may be any rational number. The metadata node
- shall consist of a pair of unsigned integers respectively representing
- the numerator and denominator. For example, 2.5 ULP:</p>
+<p>The metadata node shall consist of a single non-negative floating
+ point number representing the maximum relative error. For example,
+ 2.5 ULP:</p>
<div class="doc_code">
<pre>
-!0 = metadata !{ i32 5, i32 2 }
+!0 = metadata !{ float 2.5 }
</pre>
</div>
Modified: llvm/trunk/include/llvm/ADT/APFloat.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/APFloat.h?rev=154387&r1=154386&r2=154387&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/APFloat.h (original)
+++ llvm/trunk/include/llvm/ADT/APFloat.h Tue Apr 10 03:22:43 2012
@@ -320,6 +320,7 @@
const fltSemantics &getSemantics() const { return *semantics; }
bool isZero() const { return category == fcZero; }
bool isNonZero() const { return category != fcZero; }
+ bool isNormal() const { return category == fcNormal; }
bool isNaN() const { return category == fcNaN; }
bool isInfinity() const { return category == fcInfinity; }
bool isNegative() const { return sign; }
Modified: llvm/trunk/lib/VMCore/Verifier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Verifier.cpp?rev=154387&r1=154386&r2=154387&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/Verifier.cpp (original)
+++ llvm/trunk/lib/VMCore/Verifier.cpp Tue Apr 10 03:22:43 2012
@@ -1653,6 +1653,18 @@
}
}
+ if (MDNode *MD = I.getMetadata(LLVMContext::MD_fpaccuracy)) {
+ Assert1(I.getType()->isFPOrFPVectorTy(),
+ "fpaccuracy requires a floating point result!", &I);
+ Assert1(MD->getNumOperands() == 1, "fpaccuracy takes one operand!", &I);
+ ConstantFP *Op = dyn_cast_or_null<ConstantFP>(MD->getOperand(0));
+ Assert1(Op, "fpaccuracy ULPs not a floating point number!", &I);
+ APFloat ULPs = Op->getValueAPF();
+ Assert1(ULPs.isNormal() || ULPs.isZero(),
+ "fpaccuracy ULPs not a normal number!", &I);
+ Assert1(!ULPs.isNegative(), "fpaccuracy ULPs is negative!", &I);
+ }
+
MDNode *MD = I.getMetadata(LLVMContext::MD_range);
Assert1(!MD || isa<LoadInst>(I), "Ranges are only for loads!", &I);
Added: llvm/trunk/test/Verifier/fpaccuracy.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/fpaccuracy.ll?rev=154387&view=auto
==============================================================================
--- llvm/trunk/test/Verifier/fpaccuracy.ll (added)
+++ llvm/trunk/test/Verifier/fpaccuracy.ll Tue Apr 10 03:22:43 2012
@@ -0,0 +1,31 @@
+; RUN: not llvm-as < %s |& FileCheck %s
+
+define void @foo(i32 %i, float %f, <2 x float> %g) {
+ %s = add i32 %i, %i, !fpaccuracy !0
+; CHECK: fpaccuracy requires a floating point result!
+ %t = fadd float %f, %f, !fpaccuracy !1
+; CHECK: fpaccuracy takes one operand!
+ %u = fadd float %f, %f, !fpaccuracy !2
+; CHECK: fpaccuracy takes one operand!
+ %v = fadd float %f, %f, !fpaccuracy !3
+; CHECK: fpaccuracy ULPs not a floating point number!
+ %w = fadd float %f, %f, !fpaccuracy !0
+; Above line is correct.
+ %w2 = fadd <2 x float> %g, %g, !fpaccuracy !0
+; Above line is correct.
+ %x = fadd float %f, %f, !fpaccuracy !4
+; CHECK: fpaccuracy ULPs is negative!
+ %y = fadd float %f, %f, !fpaccuracy !5
+; CHECK: fpaccuracy ULPs is negative!
+ %z = fadd float %f, %f, !fpaccuracy !6
+; CHECK: fpaccuracy ULPs not a normal number!
+ ret void
+}
+
+!0 = metadata !{ float 1.0 }
+!1 = metadata !{ }
+!2 = metadata !{ float 1.0, float 1.0 }
+!3 = metadata !{ i32 1 }
+!4 = metadata !{ float -1.0 }
+!5 = metadata !{ float -0.0 }
+!6 = metadata !{ float 0x7FFFFFFF00000000 }
More information about the llvm-commits
mailing list