mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-04 17:47:58 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154387 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d9fc1ce809
commit
1fd63df693
@ -3021,13 +3021,13 @@ call void @llvm.dbg.value(metadata !24, i64 0, metadata !25)
|
|||||||
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
<p>The maximum relative error may be any rational number. The metadata node
|
<p>The metadata node shall consist of a single non-negative floating
|
||||||
shall consist of a pair of unsigned integers respectively representing
|
point number representing the maximum relative error. For example,
|
||||||
the numerator and denominator. For example, 2.5 ULP:</p>
|
2.5 ULP:</p>
|
||||||
|
|
||||||
<div class="doc_code">
|
<div class="doc_code">
|
||||||
<pre>
|
<pre>
|
||||||
!0 = metadata !{ i32 5, i32 2 }
|
!0 = metadata !{ float 2.5 }
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -320,6 +320,7 @@ namespace llvm {
|
|||||||
const fltSemantics &getSemantics() const { return *semantics; }
|
const fltSemantics &getSemantics() const { return *semantics; }
|
||||||
bool isZero() const { return category == fcZero; }
|
bool isZero() const { return category == fcZero; }
|
||||||
bool isNonZero() const { return category != fcZero; }
|
bool isNonZero() const { return category != fcZero; }
|
||||||
|
bool isNormal() const { return category == fcNormal; }
|
||||||
bool isNaN() const { return category == fcNaN; }
|
bool isNaN() const { return category == fcNaN; }
|
||||||
bool isInfinity() const { return category == fcInfinity; }
|
bool isInfinity() const { return category == fcInfinity; }
|
||||||
bool isNegative() const { return sign; }
|
bool isNegative() const { return sign; }
|
||||||
|
@ -1653,6 +1653,18 @@ void Verifier::visitInstruction(Instruction &I) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
MDNode *MD = I.getMetadata(LLVMContext::MD_range);
|
||||||
Assert1(!MD || isa<LoadInst>(I), "Ranges are only for loads!", &I);
|
Assert1(!MD || isa<LoadInst>(I), "Ranges are only for loads!", &I);
|
||||||
|
|
||||||
|
31
test/Verifier/fpaccuracy.ll
Normal file
31
test/Verifier/fpaccuracy.ll
Normal file
@ -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 }
|
Loading…
x
Reference in New Issue
Block a user