; RUN: llvm-as < %s | llvm-dis | FileCheck %s
; Test to verify that constrained intrinsics all have the strictfp attribute.
; Ordering is from Intrinsics.td.
define void @func(double %a, double %b, double %c, i32 %i) strictfp {
; CHECK-LABEL: define void @func
; CHECK-SAME: (double [[A:%.*]], double [[B:%.*]], double [[C:%.*]], i32 [[I:%.*]]) #[[ATTR0:[0-9]+]] {
%add = call double @llvm.experimental.constrained.fadd.f64(
double %a, double %b,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%sub = call double @llvm.experimental.constrained.fsub.f64(
double %a, double %b,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%mul = call double @llvm.experimental.constrained.fmul.f64(
double %a, double %b,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%div = call double @llvm.experimental.constrained.fdiv.f64(
double %a, double %b,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%rem = call double @llvm.experimental.constrained.frem.f64(
double %a, double %b,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%fma = call double @llvm.experimental.constrained.fma.f64(
double %a, double %b, double %c,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%fmuladd = call double @llvm.experimental.constrained.fmuladd.f64(
double %a, double %b, double %c,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%si = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a,
metadata !"fpexcept.strict")
%ui = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a,
metadata !"fpexcept.strict")
%sfp = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %i,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%ufp = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %i,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%fptrunc = call float @llvm.experimental.constrained.fptrunc.f32.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%ext = call double @llvm.experimental.constrained.fpext.f64.f32(
float %fptrunc,
metadata !"fpexcept.strict")
%sqrt = call double @llvm.experimental.constrained.sqrt.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%powi = call double @llvm.experimental.constrained.powi.f64(
double %a, i32 %i,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%sin = call double @llvm.experimental.constrained.sin.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%cos = call double @llvm.experimental.constrained.cos.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%tan = call double @llvm.experimental.constrained.tan.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%acos = call double @llvm.experimental.constrained.acos.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%asin = call double @llvm.experimental.constrained.asin.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%atan = call double @llvm.experimental.constrained.atan.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%cosh = call double @llvm.experimental.constrained.cosh.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%sinh = call double @llvm.experimental.constrained.sinh.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%tanh = call double @llvm.experimental.constrained.tanh.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%pow = call double @llvm.experimental.constrained.pow.f64(
double %a, double %b,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%log = call double @llvm.experimental.constrained.log.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%log10 = call double @llvm.experimental.constrained.log10.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%log2 = call double @llvm.experimental.constrained.log2.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%exp = call double @llvm.experimental.constrained.exp.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%exp2 = call double @llvm.experimental.constrained.exp2.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%rint = call double @llvm.experimental.constrained.rint.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%neari = call double @llvm.experimental.constrained.nearbyint.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%x32 = call i32 @llvm.experimental.constrained.lrint.i32.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%x64 = call i64 @llvm.experimental.constrained.llrint.i64.f64(
double %a,
metadata !"round.dynamic",
metadata !"fpexcept.strict")
%maxnum = call double @llvm.experimental.constrained.maxnum.f64(
double %a, double %b,
metadata !"fpexcept.strict")
%minnum = call double @llvm.experimental.constrained.minnum.f64(
double %a, double %b,
metadata !"fpexcept.strict")
%maxmum = call double @llvm.experimental.constrained.maximum.f64(
double %a, double %b,
metadata !"fpexcept.strict")
%minmum = call double @llvm.experimental.constrained.minimum.f64(
double %a, double %b,
metadata !"fpexcept.strict")
%ceil = call double @llvm.experimental.constrained.ceil.f64(
double %a,
metadata !"fpexcept.strict")
%floor = call double @llvm.experimental.constrained.floor.f64(
double %a,
metadata !"fpexcept.strict")
%y32 = call i32 @llvm.experimental.constrained.lround.i32.f64(
double %a,
metadata !"fpexcept.strict")
%y64 = call i64 @llvm.experimental.constrained.llround.i64.f64(
double %a,
metadata !"fpexcept.strict")
%round = call double @llvm.experimental.constrained.round.f64(
double %a,
metadata !"fpexcept.strict")
%roundev = call double @llvm.experimental.constrained.roundeven.f64(
double %a,
metadata !"fpexcept.strict")
%trunc = call double @llvm.experimental.constrained.trunc.f64(
double %a,
metadata !"fpexcept.strict")
%q1 = call i1 @llvm.experimental.constrained.fcmp.f64(
double %a, double %b,
metadata !"oeq",
metadata !"fpexcept.strict")
%s1 = call i1 @llvm.experimental.constrained.fcmps.f64(
double %a, double %b,
metadata !"oeq",
metadata !"fpexcept.strict")
; CHECK: ret void
ret void
}
declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.fadd.f64({{.*}}) #[[ATTR1:[0-9]+]]
declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.fsub.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.fmul.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.fdiv.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.frem.f64(double, double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.frem.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.fma.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.fmuladd.f64(double, double, double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.fmuladd.f64({{.*}}) #[[ATTR1]]
declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata)
; CHECK: @llvm.experimental.constrained.fptosi.i32.f64({{.*}}) #[[ATTR1]]
declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata)
; CHECK: @llvm.experimental.constrained.fptoui.i32.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata)
; CHECK: @llvm.experimental.constrained.sitofp.f64.i32({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata)
; CHECK: @llvm.experimental.constrained.uitofp.f64.i32({{.*}}) #[[ATTR1]]
declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.fptrunc.f32.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata)
; CHECK: @llvm.experimental.constrained.fpext.f64.f32({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.sqrt.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.powi.f64(double, i32, metadata, metadata)
; CHECK: @llvm.experimental.constrained.powi.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.sin.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.sin.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.cos.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.tan.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.tan.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.asin.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.asin.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.acos.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.acos.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.atan.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.atan.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.sinh.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.sinh.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.cosh.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.cosh.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.tanh.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.tanh.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.pow.f64(double, double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.pow.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.log.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.log.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.log10.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.log10.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.log2.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.log2.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.exp.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.exp.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.exp2.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.exp2.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.rint.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.rint.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.nearbyint.f64({{.*}}) #[[ATTR1]]
declare i32 @llvm.experimental.constrained.lrint.i32.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.lrint.i32.f64({{.*}}) #[[ATTR1]]
declare i64 @llvm.experimental.constrained.llrint.i64.f64(double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.llrint.i64.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.maxnum.f64(double, double, metadata)
; CHECK: @llvm.experimental.constrained.maxnum.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.minnum.f64(double, double, metadata)
; CHECK: @llvm.experimental.constrained.minnum.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.maximum.f64(double, double, metadata)
; CHECK: @llvm.experimental.constrained.maximum.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.minimum.f64(double, double, metadata)
; CHECK: @llvm.experimental.constrained.minimum.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.ceil.f64(double, metadata)
; CHECK: @llvm.experimental.constrained.ceil.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.floor.f64(double, metadata)
; CHECK: @llvm.experimental.constrained.floor.f64({{.*}}) #[[ATTR1]]
declare i32 @llvm.experimental.constrained.lround.i32.f64(double, metadata)
; CHECK: @llvm.experimental.constrained.lround.i32.f64({{.*}}) #[[ATTR1]]
declare i64 @llvm.experimental.constrained.llround.i64.f64(double, metadata)
; CHECK: @llvm.experimental.constrained.llround.i64.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.round.f64(double, metadata)
; CHECK: @llvm.experimental.constrained.round.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.roundeven.f64(double, metadata)
; CHECK: @llvm.experimental.constrained.roundeven.f64({{.*}}) #[[ATTR1]]
declare double @llvm.experimental.constrained.trunc.f64(double, metadata)
; CHECK: @llvm.experimental.constrained.trunc.f64({{.*}}) #[[ATTR1]]
declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.fcmp.f64({{.*}}) #[[ATTR1]]
declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata)
; CHECK: @llvm.experimental.constrained.fcmps.f64({{.*}}) #[[ATTR1]]
; CHECK: attributes #[[ATTR0]] = {{{.*}} strictfp {{.*}}}
; CHECK: attributes #[[ATTR1]] = { {{.*}} strictfp {{.*}} }