mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
a24a01e0c1
A set of function attributes is required in any function that uses constrained floating point intrinsics. None of our tests use these attributes. This patch fixes this. These tests have been tested against the IR verifier changes in D68233. Reviewed by: andrew.w.kaylor, cameron.mcinally, uweigand Approved by: andrew.w.kaylor Differential Revision: https://reviews.llvm.org/D67925 llvm-svn: 373761
81 lines
3.8 KiB
LLVM
81 lines
3.8 KiB
LLVM
; RUN: opt -verify -S < %s 2>&1 | FileCheck --check-prefix=CHECK1 %s
|
|
; RUN: sed -e s/.T2:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK2 %s
|
|
; RUN: sed -e s/.T3:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK3 %s
|
|
; RUN: sed -e s/.T4:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK4 %s
|
|
; RUN: sed -e s/.T5:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK5 %s
|
|
|
|
; Common declarations used for all runs.
|
|
declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)
|
|
declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata)
|
|
|
|
; Test that the verifier accepts legal code, and that the correct attributes are
|
|
; attached to the FP intrinsic.
|
|
; CHECK1: declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata) #[[ATTR:[0-9]+]]
|
|
; CHECK1: declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata) #[[ATTR]]
|
|
; CHECK1: attributes #[[ATTR]] = { inaccessiblememonly nounwind willreturn }
|
|
; Note: FP exceptions aren't usually caught through normal unwind mechanisms,
|
|
; but we may want to revisit this for asynchronous exception handling.
|
|
define double @f1(double %a, double %b) #0 {
|
|
entry:
|
|
%fadd = call double @llvm.experimental.constrained.fadd.f64(
|
|
double %a, double %b,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #0
|
|
ret double %fadd
|
|
}
|
|
|
|
define double @f1u(double %a) #0 {
|
|
entry:
|
|
%fsqrt = call double @llvm.experimental.constrained.sqrt.f64(
|
|
double %a,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #0
|
|
ret double %fsqrt
|
|
}
|
|
|
|
; Test an illegal value for the rounding mode argument.
|
|
; CHECK2: invalid rounding mode argument
|
|
;T2: define double @f2(double %a, double %b) #0 {
|
|
;T2: entry:
|
|
;T2: %fadd = call double @llvm.experimental.constrained.fadd.f64(
|
|
;T2: double %a, double %b,
|
|
;T2: metadata !"round.dynomite",
|
|
;T2: metadata !"fpexcept.strict") #0
|
|
;T2: ret double %fadd
|
|
;T2: }
|
|
|
|
; Test an illegal value for the exception behavior argument.
|
|
; CHECK3: invalid exception behavior argument
|
|
;T3: define double @f3(double %a, double %b) #0 {
|
|
;T3: entry:
|
|
;T3: %fadd = call double @llvm.experimental.constrained.fadd.f64(
|
|
;T3: double %a, double %b,
|
|
;T3: metadata !"round.dynamic",
|
|
;T3: metadata !"fpexcept.restrict") #0
|
|
;T3: ret double %fadd
|
|
;T3: }
|
|
|
|
; Test an illegal value for the rounding mode argument.
|
|
; CHECK4: invalid rounding mode argument
|
|
;T4: define double @f4(double %a) #0 {
|
|
;T4: entry:
|
|
;T4: %fadd = call double @llvm.experimental.constrained.sqrt.f64(
|
|
;T4: double %a,
|
|
;T4: metadata !"round.dynomite",
|
|
;T4: metadata !"fpexcept.strict") #0
|
|
;T4: ret double %fadd
|
|
;T4: }
|
|
|
|
; Test an illegal value for the exception behavior argument.
|
|
; CHECK5: invalid exception behavior argument
|
|
;T5: define double @f5(double %a) #0 {
|
|
;T5: entry:
|
|
;T5: %fadd = call double @llvm.experimental.constrained.sqrt.f64(
|
|
;T5: double %a,
|
|
;T5: metadata !"round.dynamic",
|
|
;T5: metadata !"fpexcept.restrict") #0
|
|
;T5: ret double %fadd
|
|
;T5: }
|
|
|
|
attributes #0 = { strictfp }
|