| ; 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 } |
| ; 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) { |
| entry: |
| %fadd = call double @llvm.experimental.constrained.fadd.f64( |
| double %a, double %b, |
| metadata !"round.dynamic", |
| metadata !"fpexcept.strict") |
| ret double %fadd |
| } |
| |
| define double @f1u(double %a) { |
| entry: |
| %fsqrt = call double @llvm.experimental.constrained.sqrt.f64( |
| double %a, |
| metadata !"round.dynamic", |
| metadata !"fpexcept.strict") |
| 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) { |
| ;T2: entry: |
| ;T2: %fadd = call double @llvm.experimental.constrained.fadd.f64( |
| ;T2: double %a, double %b, |
| ;T2: metadata !"round.dynomite", |
| ;T2: metadata !"fpexcept.strict") |
| ;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) { |
| ;T3: entry: |
| ;T3: %fadd = call double @llvm.experimental.constrained.fadd.f64( |
| ;T3: double %a, double %b, |
| ;T3: metadata !"round.dynamic", |
| ;T3: metadata !"fpexcept.restrict") |
| ;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) { |
| ;T4: entry: |
| ;T4: %fadd = call double @llvm.experimental.constrained.sqrt.f64( |
| ;T4: double %a, |
| ;T4: metadata !"round.dynomite", |
| ;T4: metadata !"fpexcept.strict") |
| ;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) { |
| ;T5: entry: |
| ;T5: %fadd = call double @llvm.experimental.constrained.sqrt.f64( |
| ;T5: double %a, |
| ;T5: metadata !"round.dynamic", |
| ;T5: metadata !"fpexcept.restrict") |
| ;T5: ret double %fadd |
| ;T5: } |