
This change is part of this proposal: https://discourse.llvm.org/t/rfc-all-the-math-intrinsics/78294 Based on example PR #96222 and fix PR #101268, with some differences due to 2-arg intrinsic and intermediate refactor (RuntimeLibCalls.cpp). - Add llvm.experimental.constrained.atan2 - Intrinsics.td, ConstrainedOps.def, LangRef.rst - Add to ISDOpcodes.h and TargetSelectionDAG.td, connect to intrinsic in BasicTTIImpl.h, and LibFunc_ in SelectionDAGBuilder.cpp - Update LegalizeDAG.cpp, LegalizeFloatTypes.cpp, LegalizeVectorOps.cpp, and LegalizeVectorTypes.cpp - Update isKnownNeverNaN in SelectionDAG.cpp - Update SelectionDAGDumper.cpp - Update libcalls - RuntimeLibcalls.def, RuntimeLibcalls.cpp - TargetLoweringBase.cpp - Expand for vectors, promote f16 - X86ISelLowering.cpp - Expand f80, promote f32 to f64 for MSVC Part 4 for Implement the atan2 HLSL Function #70096.
383 lines
20 KiB
LLVM
383 lines
20 KiB
LLVM
; 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")
|
|
|
|
%atan2 = call double @llvm.experimental.constrained.atan2.f64(
|
|
double %a, double %b,
|
|
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.atan2.f64(double, double, metadata, metadata)
|
|
; CHECK: @llvm.experimental.constrained.atan2.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 {{.*}} }
|
|
|