mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-01 21:04:04 -04:00
Verifier: Reject non-float !fpmath
Code already assumes this is float. getFPAccuracy() crashes on any other type. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273912 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
+2
-2
@@ -4510,8 +4510,8 @@ it. ULP is defined as follows:
|
|||||||
distance between the two non-equal finite floating-point numbers
|
distance between the two non-equal finite floating-point numbers
|
||||||
nearest ``x``. Moreover, ``ulp(NaN)`` is ``NaN``.
|
nearest ``x``. Moreover, ``ulp(NaN)`` is ``NaN``.
|
||||||
|
|
||||||
The metadata node shall consist of a single positive floating point
|
The metadata node shall consist of a single positive float type number
|
||||||
number representing the maximum relative error, for example:
|
representing the maximum relative error, for example:
|
||||||
|
|
||||||
.. code-block:: llvm
|
.. code-block:: llvm
|
||||||
|
|
||||||
|
|||||||
@@ -3668,6 +3668,8 @@ void Verifier::visitInstruction(Instruction &I) {
|
|||||||
if (ConstantFP *CFP0 =
|
if (ConstantFP *CFP0 =
|
||||||
mdconst::dyn_extract_or_null<ConstantFP>(MD->getOperand(0))) {
|
mdconst::dyn_extract_or_null<ConstantFP>(MD->getOperand(0))) {
|
||||||
const APFloat &Accuracy = CFP0->getValueAPF();
|
const APFloat &Accuracy = CFP0->getValueAPF();
|
||||||
|
Assert(&Accuracy.getSemantics() == &APFloat::IEEEsingle,
|
||||||
|
"fpmath accuracy must have float type", &I);
|
||||||
Assert(Accuracy.isFiniteNonZero() && !Accuracy.isNegative(),
|
Assert(Accuracy.isFiniteNonZero() && !Accuracy.isNegative(),
|
||||||
"fpmath accuracy not a positive number!", &I);
|
"fpmath accuracy not a positive number!", &I);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ define void @fpmath1(i32 %i, float %f, <2 x float> %g) {
|
|||||||
; CHECK: fpmath accuracy not a positive number!
|
; CHECK: fpmath accuracy not a positive number!
|
||||||
%z = fadd float %f, %f, !fpmath !6
|
%z = fadd float %f, %f, !fpmath !6
|
||||||
; CHECK: fpmath accuracy not a positive number!
|
; CHECK: fpmath accuracy not a positive number!
|
||||||
|
%double.fpmath = fadd float %f, %f, !fpmath !7
|
||||||
|
; CHECK: fpmath accuracy must have float type
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,3 +31,4 @@ define void @fpmath1(i32 %i, float %f, <2 x float> %g) {
|
|||||||
!4 = !{ float -1.0 }
|
!4 = !{ float -1.0 }
|
||||||
!5 = !{ float 0.0 }
|
!5 = !{ float 0.0 }
|
||||||
!6 = !{ float 0x7FFFFFFF00000000 }
|
!6 = !{ float 0x7FFFFFFF00000000 }
|
||||||
|
!7 = !{ double 1.0 }
|
||||||
|
|||||||
Reference in New Issue
Block a user