mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
Rename "fpaccuracy" metadata to the more generic "fpmath". That's because I'm
thinking of generalizing it to be able to specify other freedoms beyond accuracy (such as that NaN's don't have to be respected). I'd like the 3.1 release (the first one with this metadata) to have the more generic name already rather than having to auto-upgrade it in 3.2. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154744 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -103,7 +103,7 @@
|
|||||||
<li><a href="#metadata">Metadata Nodes and Metadata Strings</a>
|
<li><a href="#metadata">Metadata Nodes and Metadata Strings</a>
|
||||||
<ol>
|
<ol>
|
||||||
<li><a href="#tbaa">'<tt>tbaa</tt>' Metadata</a></li>
|
<li><a href="#tbaa">'<tt>tbaa</tt>' Metadata</a></li>
|
||||||
<li><a href="#fpaccuracy">'<tt>fpaccuracy</tt>' Metadata</a></li>
|
<li><a href="#fpmath">'<tt>fpmath</tt>' Metadata</a></li>
|
||||||
<li><a href="#range">'<tt>range</tt>' Metadata</a></li>
|
<li><a href="#range">'<tt>range</tt>' Metadata</a></li>
|
||||||
</ol>
|
</ol>
|
||||||
</li>
|
</li>
|
||||||
@@ -3000,15 +3000,15 @@ call void @llvm.dbg.value(metadata !24, i64 0, metadata !25)
|
|||||||
|
|
||||||
<!-- _______________________________________________________________________ -->
|
<!-- _______________________________________________________________________ -->
|
||||||
<h4>
|
<h4>
|
||||||
<a name="fpaccuracy">'<tt>fpaccuracy</tt>' Metadata</a>
|
<a name="fpmath">'<tt>fpmath</tt>' Metadata</a>
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
|
||||||
<p><tt>fpaccuracy</tt> metadata may be attached to any instruction of floating
|
<p><tt>fpmath</tt> metadata may be attached to any instruction of floating point
|
||||||
point type. It expresses the maximum relative error allowed in the result
|
type. It can be used to express the maximum acceptable relative error in the
|
||||||
of that instruction, in ULPs, thus potentially allowing the compiler to use
|
result of that instruction, in ULPs, thus potentially allowing the compiler
|
||||||
a more efficient but less accurate method of computing it.
|
to use a more efficient but less accurate method of computing it.
|
||||||
ULP is defined as follows:</p>
|
ULP is defined as follows:</p>
|
||||||
|
|
||||||
<blockquote>
|
<blockquote>
|
||||||
|
@@ -42,7 +42,7 @@ public:
|
|||||||
MD_dbg = 0, // "dbg"
|
MD_dbg = 0, // "dbg"
|
||||||
MD_tbaa = 1, // "tbaa"
|
MD_tbaa = 1, // "tbaa"
|
||||||
MD_prof = 2, // "prof"
|
MD_prof = 2, // "prof"
|
||||||
MD_fpaccuracy = 3, // "fpaccuracy"
|
MD_fpmath = 3, // "fpmath"
|
||||||
MD_range = 4 // "range"
|
MD_range = 4 // "range"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -44,9 +44,9 @@ LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl(*this)) {
|
|||||||
unsigned ProfID = getMDKindID("prof");
|
unsigned ProfID = getMDKindID("prof");
|
||||||
assert(ProfID == MD_prof && "prof kind id drifted"); (void)ProfID;
|
assert(ProfID == MD_prof && "prof kind id drifted"); (void)ProfID;
|
||||||
|
|
||||||
// Create the 'fpaccuracy' metadata kind.
|
// Create the 'fpmath' metadata kind.
|
||||||
unsigned FPAccuracyID = getMDKindID("fpaccuracy");
|
unsigned FPAccuracyID = getMDKindID("fpmath");
|
||||||
assert(FPAccuracyID == MD_fpaccuracy && "fpaccuracy kind id drifted");
|
assert(FPAccuracyID == MD_fpmath && "fpmath kind id drifted");
|
||||||
(void)FPAccuracyID;
|
(void)FPAccuracyID;
|
||||||
|
|
||||||
// Create the 'range' metadata kind.
|
// Create the 'range' metadata kind.
|
||||||
|
@@ -1653,16 +1653,16 @@ void Verifier::visitInstruction(Instruction &I) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MDNode *MD = I.getMetadata(LLVMContext::MD_fpaccuracy)) {
|
if (MDNode *MD = I.getMetadata(LLVMContext::MD_fpmath)) {
|
||||||
Assert1(I.getType()->isFPOrFPVectorTy(),
|
Assert1(I.getType()->isFPOrFPVectorTy(),
|
||||||
"fpaccuracy requires a floating point result!", &I);
|
"fpmath requires a floating point result!", &I);
|
||||||
Assert1(MD->getNumOperands() == 1, "fpaccuracy takes one operand!", &I);
|
Assert1(MD->getNumOperands() == 1, "fpmath takes one operand!", &I);
|
||||||
ConstantFP *Op = dyn_cast_or_null<ConstantFP>(MD->getOperand(0));
|
ConstantFP *Op = dyn_cast_or_null<ConstantFP>(MD->getOperand(0));
|
||||||
Assert1(Op, "fpaccuracy ULPs not a floating point number!", &I);
|
Assert1(Op, "fpmath ULPs not a floating point number!", &I);
|
||||||
APFloat ULPs = Op->getValueAPF();
|
APFloat ULPs = Op->getValueAPF();
|
||||||
Assert1(ULPs.isNormal() || ULPs.isZero(),
|
Assert1(ULPs.isNormal() || ULPs.isZero(),
|
||||||
"fpaccuracy ULPs not a normal number!", &I);
|
"fpmath ULPs not a normal number!", &I);
|
||||||
Assert1(!ULPs.isNegative(), "fpaccuracy ULPs is negative!", &I);
|
Assert1(!ULPs.isNegative(), "fpmath ULPs is negative!", &I);
|
||||||
}
|
}
|
||||||
|
|
||||||
MDNode *MD = I.getMetadata(LLVMContext::MD_range);
|
MDNode *MD = I.getMetadata(LLVMContext::MD_range);
|
||||||
|
@@ -1,31 +0,0 @@
|
|||||||
; 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 }
|
|
31
test/Verifier/fpmath.ll
Normal file
31
test/Verifier/fpmath.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, !fpmath !0
|
||||||
|
; CHECK: fpmath requires a floating point result!
|
||||||
|
%t = fadd float %f, %f, !fpmath !1
|
||||||
|
; CHECK: fpmath takes one operand!
|
||||||
|
%u = fadd float %f, %f, !fpmath !2
|
||||||
|
; CHECK: fpmath takes one operand!
|
||||||
|
%v = fadd float %f, %f, !fpmath !3
|
||||||
|
; CHECK: fpmath ULPs not a floating point number!
|
||||||
|
%w = fadd float %f, %f, !fpmath !0
|
||||||
|
; Above line is correct.
|
||||||
|
%w2 = fadd <2 x float> %g, %g, !fpmath !0
|
||||||
|
; Above line is correct.
|
||||||
|
%x = fadd float %f, %f, !fpmath !4
|
||||||
|
; CHECK: fpmath ULPs is negative!
|
||||||
|
%y = fadd float %f, %f, !fpmath !5
|
||||||
|
; CHECK: fpmath ULPs is negative!
|
||||||
|
%z = fadd float %f, %f, !fpmath !6
|
||||||
|
; CHECK: fpmath 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 }
|
Reference in New Issue
Block a user