From: Matt Arsenault Date: Mon, 27 Jun 2016 19:43:15 +0000 (+0000) Subject: Verifier: Reject non-float !fpmath X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1d88d3b08d331bc09e61697fa4d8c80402cd15e6;p=llvm 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 --- diff --git a/docs/LangRef.rst b/docs/LangRef.rst index 25bf9cccb09..201fbec9710 100644 --- a/docs/LangRef.rst +++ b/docs/LangRef.rst @@ -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 diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp index cd8e3093ea7..47ded3cbd42 100644 --- a/lib/IR/Verifier.cpp +++ b/lib/IR/Verifier.cpp @@ -3668,6 +3668,8 @@ void Verifier::visitInstruction(Instruction &I) { if (ConstantFP *CFP0 = mdconst::dyn_extract_or_null(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 { diff --git a/test/Verifier/fpmath.ll b/test/Verifier/fpmath.ll index 2689b69d1d0..4a2e6eea6f1 100644 --- a/test/Verifier/fpmath.ll +++ b/test/Verifier/fpmath.ll @@ -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 }