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:
Matt Arsenault 2016-06-27 19:43:15 +00:00
parent bd288e1778
commit 1d88d3b08d
3 changed files with 7 additions and 2 deletions

View File

@ -4510,8 +4510,8 @@ it. ULP is defined as follows:
distance between the two non-equal finite floating-point numbers
nearest ``x``. Moreover, ``ulp(NaN)`` is ``NaN``.
The metadata node shall consist of a single positive floating point
number representing the maximum relative error, for example:
The metadata node shall consist of a single positive float type number
representing the maximum relative error, for example:
.. code-block:: llvm

View File

@ -3668,6 +3668,8 @@ void Verifier::visitInstruction(Instruction &I) {
if (ConstantFP *CFP0 =
mdconst::dyn_extract_or_null<ConstantFP>(MD->getOperand(0))) {
const APFloat &Accuracy = CFP0->getValueAPF();
Assert(&Accuracy.getSemantics() == &APFloat::IEEEsingle,
"fpmath accuracy must have float type", &I);
Assert(Accuracy.isFiniteNonZero() && !Accuracy.isNegative(),
"fpmath accuracy not a positive number!", &I);
} else {

View File

@ -19,6 +19,8 @@ define void @fpmath1(i32 %i, float %f, <2 x float> %g) {
; CHECK: fpmath accuracy not a positive number!
%z = fadd float %f, %f, !fpmath !6
; CHECK: fpmath accuracy not a positive number!
%double.fpmath = fadd float %f, %f, !fpmath !7
; CHECK: fpmath accuracy must have float type
ret void
}
@ -29,3 +31,4 @@ define void @fpmath1(i32 %i, float %f, <2 x float> %g) {
!4 = !{ float -1.0 }
!5 = !{ float 0.0 }
!6 = !{ float 0x7FFFFFFF00000000 }
!7 = !{ double 1.0 }