Skip to content

Commit a353295

Browse files
committed
Address code review feedback.
1 parent 9b8b43d commit a353295

File tree

7 files changed

+83
-147
lines changed

7 files changed

+83
-147
lines changed

llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp

Lines changed: 48 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -572,64 +572,32 @@ void SPIRVAsmPrinter::outputExecutionMode(const Module &M) {
572572
// When SPV_KHR_float_controls2 is enabled, ContractionOff is
573573
// deprecated. We need to use FPFastMathDefault with the appropriate
574574
// flags instead. Since FPFastMathDefault takes a target type, we need
575-
// to emit it for each floating-point type to match the effect of
576-
// ContractionOff. As of now, there are 4 FP types: fp16, fp32, fp64 and
577-
// fp128.
578-
constexpr size_t NumFPTypes = 4;
579-
for (size_t i = 0; i < NumFPTypes; ++i) {
575+
// to emit it for each floating-point type that exists in the module
576+
// to match the effect of ContractionOff. As of now, there are 4 FP
577+
// types: fp16, fp32 and fp64.
578+
for (const MachineInstr *MI :
579+
MAI->getMSInstrs(SPIRV::MB_TypeConstVars)) {
580+
// Skip if the instruction is not OpTypeFloat.
581+
if (MI->getOpcode() != SPIRV::OpTypeFloat)
582+
continue;
583+
584+
// Skip if the target type is not fp16, fp32, fp64.
585+
const unsigned OpTypeFloatSize = MI->getOperand(1).getImm();
586+
if (OpTypeFloatSize != 16 && OpTypeFloatSize != 32 &&
587+
OpTypeFloatSize != 64) {
588+
continue;
589+
}
590+
580591
MCInst Inst;
581592
Inst.setOpcode(SPIRV::OpExecutionMode);
582593
Inst.addOperand(MCOperand::createReg(FReg));
583594
unsigned EM =
584595
static_cast<unsigned>(SPIRV::ExecutionMode::FPFastMathDefault);
585596
Inst.addOperand(MCOperand::createImm(EM));
586-
587-
Type *TargetType = nullptr;
588-
switch (i) {
589-
case 0:
590-
TargetType = Type::getHalfTy(M.getContext());
591-
break;
592-
case 1:
593-
TargetType = Type::getFloatTy(M.getContext());
594-
break;
595-
case 2:
596-
TargetType = Type::getDoubleTy(M.getContext());
597-
break;
598-
case 3:
599-
TargetType = Type::getFP128Ty(M.getContext());
600-
break;
601-
}
602-
assert(TargetType && "Invalid target type for FPFastMathDefault");
603-
604-
// Find the SPIRV type matching the target type. We'll go over all the
605-
// TypeConstVars instructions in the SPIRV module and find the one
606-
// that matches the target type. We know the target type is a
607-
// floating-point type, so we can skip anything different than
608-
// OpTypeFloat. Then, we need to check the bitwidth.
609-
bool SPIRVTypeFound = false;
610-
for (const MachineInstr *MI :
611-
MAI->getMSInstrs(SPIRV::MB_TypeConstVars)) {
612-
// Skip if the instruction is not OpTypeFloat.
613-
if (MI->getOpcode() != SPIRV::OpTypeFloat)
614-
continue;
615-
616-
// Skip if TargetTy bitwidth doesn't match MI->getOperand(1), which
617-
// is the SPIRV type bit width.
618-
if (TargetType->getScalarSizeInBits() != MI->getOperand(1).getImm())
619-
continue;
620-
621-
SPIRVTypeFound = true;
622-
const MachineFunction *MF = MI->getMF();
623-
MCRegister TypeReg =
624-
MAI->getRegisterAlias(MF, MI->getOperand(0).getReg());
625-
Inst.addOperand(MCOperand::createReg(TypeReg));
626-
}
627-
628-
if (!SPIRVTypeFound) {
629-
// The module does not contain this FP type, so we don't need to
630-
// emit FPFastMathDefault for it.
631-
continue;
632-
}
597+
const MachineFunction *MF = MI->getMF();
598+
MCRegister TypeReg =
599+
MAI->getRegisterAlias(MF, MI->getOperand(0).getReg());
600+
Inst.addOperand(MCOperand::createReg(TypeReg));
633601
// We only end up here because there is no "spirv.ExecutionMode"
634602
// metadata, so that means no FPFastMathDefault. Therefore, we only
635603
// need to make sure AllowContract is set to 0, as the rest of flags.
@@ -694,47 +662,43 @@ void SPIRVAsmPrinter::outputAnnotations(const Module &M) {
694662
}
695663

696664
void SPIRVAsmPrinter::outputFPFastMathDefaultInfo() {
665+
// Collect the SPIRVTypes that are OpTypeFloat.
666+
std::vector<const MachineInstr *> SPIRVFloatTypes;
667+
for (const MachineInstr *MI : MAI->getMSInstrs(SPIRV::MB_TypeConstVars)) {
668+
// Skip if the instruction is not OpTypeFloat.
669+
if (MI->getOpcode() != SPIRV::OpTypeFloat)
670+
continue;
671+
672+
// Collect the SPIRV type.
673+
SPIRVFloatTypes.push_back(MI);
674+
}
675+
697676
for (const auto &[Func, FPFastMathDefaultInfoVec] :
698677
MAI->FPFastMathDefaultInfoMap) {
699-
for (const auto &FPFastMathDefaultInfo : FPFastMathDefaultInfoVec) {
678+
if (FPFastMathDefaultInfoVec.empty())
679+
continue;
680+
681+
for (const MachineInstr *MI : SPIRVFloatTypes) {
682+
unsigned OpTypeFloatSize = MI->getOperand(1).getImm();
683+
unsigned Index = computeFPFastMathDefaultInfoVecIndex(OpTypeFloatSize);
684+
assert(Index < FPFastMathDefaultInfoVec.size() &&
685+
"Index out of bounds for FPFastMathDefaultInfoVec");
686+
const auto &FPFastMathDefaultInfo = FPFastMathDefaultInfoVec[Index];
687+
assert(FPFastMathDefaultInfo.Ty &&
688+
"Expected target type for FPFastMathDefaultInfo");
689+
assert(FPFastMathDefaultInfo.Ty->getScalarSizeInBits() ==
690+
OpTypeFloatSize &&
691+
"Mismatched float type size");
700692
MCInst Inst;
701693
Inst.setOpcode(SPIRV::OpExecutionMode);
702694
MCRegister FuncReg = MAI->getFuncReg(Func);
703695
assert(FuncReg.isValid());
704696
Inst.addOperand(MCOperand::createReg(FuncReg));
705697
Inst.addOperand(
706698
MCOperand::createImm(SPIRV::ExecutionMode::FPFastMathDefault));
707-
708-
// Find the SPIRV type matching the target type. We'll go over all the
709-
// TypeConstVars instructions in the SPIRV module and find the one that
710-
// matches the target type. We know the target type is a floating-point
711-
// type, so we can skip anything different than OpTypeFloat. Then, we
712-
// need to check the bitwidth.
713-
const Type *TargetTy = FPFastMathDefaultInfo.Ty;
714-
assert(TargetTy && "Expected target type");
715-
bool SPIRVTypeFound = false;
716-
for (const MachineInstr *MI : MAI->getMSInstrs(SPIRV::MB_TypeConstVars)) {
717-
// Skip if the instruction is not OpTypeFloat.
718-
if (MI->getOpcode() != SPIRV::OpTypeFloat)
719-
continue;
720-
721-
// Skip if TargetTy bitwidth doesn't match MI->getOperand(1), which is
722-
// the SPIRV type bit width.
723-
if (TargetTy->getScalarSizeInBits() != MI->getOperand(1).getImm())
724-
continue;
725-
726-
SPIRVTypeFound = true;
727-
const MachineFunction *MF = MI->getMF();
728-
MCRegister TypeReg =
729-
MAI->getRegisterAlias(MF, MI->getOperand(0).getReg());
730-
Inst.addOperand(MCOperand::createReg(TypeReg));
731-
}
732-
if (!SPIRVTypeFound) {
733-
// The module does not contain this FP type, so we don't need to emit
734-
// FPFastMathDefault for it.
735-
continue;
736-
}
737-
699+
MCRegister TypeReg =
700+
MAI->getRegisterAlias(MI->getMF(), MI->getOperand(0).getReg());
701+
Inst.addOperand(MCOperand::createReg(TypeReg));
738702
unsigned Flags = FPFastMathDefaultInfo.FastMathFlags;
739703
if (FPFastMathDefaultInfo.ContractionOff &&
740704
(Flags & SPIRV::FPFastMathMode::AllowContract) &&

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2094,25 +2094,24 @@ static unsigned getFastMathFlags(const MachineInstr &I,
20942094

20952095
if (CanUseKHRFloatControls2) {
20962096
// Error out if SPIRV::FPFastMathMode::Fast is enabled.
2097-
if (Flags & SPIRV::FPFastMathMode::Fast)
2098-
report_fatal_error(
2099-
"FPFastMathMode::Fast flag is deprecated and it is not "
2100-
"valid to use anymore.");
2097+
assert(!(Flags & SPIRV::FPFastMathMode::Fast) &&
2098+
"SPIRV::FPFastMathMode::Fast is deprecated and should not be used "
2099+
"anymore.");
21012100

21022101
// Error out if AllowTransform is enabled without AllowReassoc and
21032102
// AllowContract.
2104-
if ((Flags & SPIRV::FPFastMathMode::AllowTransform) &&
2105-
(!(Flags & SPIRV::FPFastMathMode::AllowReassoc) ||
2106-
!(Flags & SPIRV::FPFastMathMode::AllowContract)))
2107-
report_fatal_error(
2108-
"FPFastMathMode::AllowTransform flag requires AllowReassoc and "
2109-
"AllowContract flags to be enabled as well.");
2103+
assert(
2104+
!(Flags & SPIRV::FPFastMathMode::AllowTransform) ||
2105+
((Flags & SPIRV::FPFastMathMode::AllowReassoc &&
2106+
Flags & SPIRV::FPFastMathMode::AllowContract)) &&
2107+
"SPIRV::FPFastMathMode::AllowTransform requires AllowReassoc and "
2108+
"AllowContract flags to be enabled as well.");
21102109
}
21112110

21122111
return Flags;
21132112
}
21142113

2115-
static bool isFastMathMathModeAvailable(const SPIRVSubtarget &ST) {
2114+
static bool isFastMathModeAvailable(const SPIRVSubtarget &ST) {
21162115
if (ST.isKernel())
21172116
return true;
21182117
if (ST.getSPIRVVersion() < VersionTuple(1, 2))
@@ -2123,7 +2122,7 @@ static bool isFastMathMathModeAvailable(const SPIRVSubtarget &ST) {
21232122
static void handleMIFlagDecoration(
21242123
MachineInstr &I, const SPIRVSubtarget &ST, const SPIRVInstrInfo &TII,
21252124
SPIRV::RequirementHandler &Reqs, const SPIRVGlobalRegistry *GR,
2126-
SmallVector<SPIRV::FPFastMathDefaultInfo, 4> &FPFastMathDefaultInfoVec) {
2125+
SmallVector<SPIRV::FPFastMathDefaultInfo, 3> &FPFastMathDefaultInfoVec) {
21272126
if (I.getFlag(MachineInstr::MIFlag::NoSWrap) && TII.canUseNSW(I) &&
21282127
getSymbolicOperandRequirements(SPIRV::OperandCategory::DecorationOperand,
21292128
SPIRV::Decoration::NoSignedWrap, ST, Reqs)
@@ -2184,7 +2183,7 @@ static void handleMIFlagDecoration(
21842183
if (FMFlags == SPIRV::FPFastMathMode::None && !Emit)
21852184
return;
21862185
}
2187-
if (isFastMathMathModeAvailable(ST)) {
2186+
if (isFastMathModeAvailable(ST)) {
21882187
Register DstReg = I.getOperand(0).getReg();
21892188
buildOpDecorate(DstReg, I, TII, SPIRV::Decoration::FPFastMathMode,
21902189
{FMFlags});
@@ -2250,7 +2249,7 @@ static void patchPhis(const Module &M, SPIRVGlobalRegistry *GR,
22502249
}
22512250
}
22522251

2253-
static SmallVector<SPIRV::FPFastMathDefaultInfo, 4> &
2252+
static SmallVector<SPIRV::FPFastMathDefaultInfo, 3> &
22542253
getOrCreateFPFastMathDefaultInfoVec(const Module &M,
22552254
SPIRV::ModuleAnalysisInfo &MAI,
22562255
const Function *F) {
@@ -2259,29 +2258,27 @@ getOrCreateFPFastMathDefaultInfoVec(const Module &M,
22592258
return it->second;
22602259

22612260
// If the map does not contain the entry, create a new one. Initialize it to
2262-
// contain all 4 elements sorted by bit width of target type: {half, float,
2263-
// double, fp128}.
2264-
SmallVector<SPIRV::FPFastMathDefaultInfo, 4> FPFastMathDefaultInfoVec;
2261+
// contain all 3 elements sorted by bit width of target type: {half, float,
2262+
// double}.
2263+
SmallVector<SPIRV::FPFastMathDefaultInfo, 3> FPFastMathDefaultInfoVec;
22652264
FPFastMathDefaultInfoVec.emplace_back(Type::getHalfTy(M.getContext()),
22662265
SPIRV::FPFastMathMode::None);
22672266
FPFastMathDefaultInfoVec.emplace_back(Type::getFloatTy(M.getContext()),
22682267
SPIRV::FPFastMathMode::None);
22692268
FPFastMathDefaultInfoVec.emplace_back(Type::getDoubleTy(M.getContext()),
22702269
SPIRV::FPFastMathMode::None);
2271-
FPFastMathDefaultInfoVec.emplace_back(Type::getFP128Ty(M.getContext()),
2272-
SPIRV::FPFastMathMode::None);
22732270
return MAI.FPFastMathDefaultInfoMap[F] = std::move(FPFastMathDefaultInfoVec);
22742271
}
22752272

22762273
static SPIRV::FPFastMathDefaultInfo &getFPFastMathDefaultInfo(
2277-
SmallVector<SPIRV::FPFastMathDefaultInfo, 4> &FPFastMathDefaultInfoVec,
2274+
SmallVector<SPIRV::FPFastMathDefaultInfo, 3> &FPFastMathDefaultInfoVec,
22782275
const Type *Ty) {
22792276
size_t BitWidth = Ty->getScalarSizeInBits();
22802277
int Index = computeFPFastMathDefaultInfoVecIndex(BitWidth);
2281-
assert(Index >= 0 && Index < 4 &&
2282-
"Expected FPFastMathDefaultInfo for half, float, double, or fp128");
2283-
assert(FPFastMathDefaultInfoVec.size() == 4 &&
2284-
"Expected FPFastMathDefaultInfoVec to have exactly 4 elements");
2278+
assert(Index >= 0 && Index < 3 &&
2279+
"Expected FPFastMathDefaultInfo for half, float, or double");
2280+
assert(FPFastMathDefaultInfoVec.size() == 3 &&
2281+
"Expected FPFastMathDefaultInfoVec to have exactly 3 elements");
22852282
return FPFastMathDefaultInfoVec[Index];
22862283
}
22872284

@@ -2317,7 +2314,7 @@ static void collectFPFastMathDefaults(const Module &M,
23172314
cast<ConstantInt>(
23182315
cast<ConstantAsMetadata>(MDN->getOperand(3))->getValue())
23192316
->getZExtValue();
2320-
SmallVector<SPIRV::FPFastMathDefaultInfo, 4> &FPFastMathDefaultInfoVec =
2317+
SmallVector<SPIRV::FPFastMathDefaultInfo, 3> &FPFastMathDefaultInfoVec =
23212318
getOrCreateFPFastMathDefaultInfoVec(M, MAI, F);
23222319
SPIRV::FPFastMathDefaultInfo &Info =
23232320
getFPFastMathDefaultInfo(FPFastMathDefaultInfoVec, T);
@@ -2329,7 +2326,7 @@ static void collectFPFastMathDefaults(const Module &M,
23292326

23302327
// We need to save this info for every possible FP type, i.e. {half,
23312328
// float, double, fp128}.
2332-
SmallVector<SPIRV::FPFastMathDefaultInfo, 4> &FPFastMathDefaultInfoVec =
2329+
SmallVector<SPIRV::FPFastMathDefaultInfo, 3> &FPFastMathDefaultInfoVec =
23332330
getOrCreateFPFastMathDefaultInfoVec(M, MAI, F);
23342331
for (SPIRV::FPFastMathDefaultInfo &Info : FPFastMathDefaultInfoVec) {
23352332
Info.ContractionOff = true;
@@ -2342,14 +2339,13 @@ static void collectFPFastMathDefaults(const Module &M,
23422339
cast<ConstantAsMetadata>(MDN->getOperand(2))->getValue())
23432340
->getZExtValue();
23442341
// We need to save this info only for the FP type with TargetWidth.
2345-
SmallVector<SPIRV::FPFastMathDefaultInfo, 4> &FPFastMathDefaultInfoVec =
2342+
SmallVector<SPIRV::FPFastMathDefaultInfo, 3> &FPFastMathDefaultInfoVec =
23462343
getOrCreateFPFastMathDefaultInfoVec(M, MAI, F);
23472344
int Index = computeFPFastMathDefaultInfoVecIndex(TargetWidth);
2348-
assert(Index >= 0 && Index < 4 &&
2349-
"Expected FPFastMathDefaultInfo for half, float, double, or "
2350-
"fp128");
2351-
assert(FPFastMathDefaultInfoVec.size() == 4 &&
2352-
"Expected FPFastMathDefaultInfoVec to have exactly 4 elements");
2345+
assert(Index >= 0 && Index < 3 &&
2346+
"Expected FPFastMathDefaultInfo for half, float, or double");
2347+
assert(FPFastMathDefaultInfoVec.size() == 3 &&
2348+
"Expected FPFastMathDefaultInfoVec to have exactly 3 elements");
23532349
FPFastMathDefaultInfoVec[Index].SignedZeroInfNanPreserve = true;
23542350
}
23552351
}

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,9 @@ struct ModuleAnalysisInfo {
189189
// The table maps function pointers to their default FP fast math info. It can
190190
// be assumed that the SmallVector is sorted by the bit width of the type. The
191191
// first element is the smallest bit width, and the last element is the
192-
// largest bit width, therefore, we will have {half, float, double, fp128} in
192+
// largest bit width, therefore, we will have {half, float, double} in
193193
// the order of their bit widths.
194-
DenseMap<const Function *, SmallVector<FPFastMathDefaultInfo, 4>>
194+
DenseMap<const Function *, SmallVector<FPFastMathDefaultInfo, 3>>
195195
FPFastMathDefaultInfoMap;
196196

197197
MCRegister getFuncReg(const Function *F) {

llvm/lib/Target/SPIRV/SPIRVUtils.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -568,8 +568,6 @@ Type *parseBasicTypeName(StringRef &TypeName, LLVMContext &Ctx) {
568568
return Type::getFloatTy(Ctx);
569569
else if (TypeName.consume_front("double"))
570570
return Type::getDoubleTy(Ctx);
571-
else if (TypeName.consume_front("fp128"))
572-
return Type::getFP128Ty(Ctx);
573571

574572
// Unable to recognize SPIRV type name
575573
return nullptr;
@@ -1041,10 +1039,8 @@ size_t computeFPFastMathDefaultInfoVecIndex(size_t BitWidth) {
10411039
return 1;
10421040
case 64: // double
10431041
return 2;
1044-
case 128: // fp128
1045-
return 3;
10461042
default:
1047-
report_fatal_error("Expected BitWidth to be 16, 32, 64, or 128", false);
1043+
report_fatal_error("Expected BitWidth to be 16, 32, 64", false);
10481044
}
10491045
assert(false && "Unreachable code");
10501046
// This return is just to avoid compiler warnings.

llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_float_controls2/decoration.ll

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,6 @@
5050
; CHECK: OpDecorate %[[#maxRes]] FPFastMathMode NotNaN|NotInf|NSZ|AllowRecip|AllowContract|AllowReassoc|AllowTransform
5151
; CHECK: OpDecorate %[[#maxCommonRes:]] FPFastMathMode NotNaN|NotInf
5252

53-
target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
54-
target triple = "spir"
55-
5653
; Function Attrs: convergent mustprogress nofree nounwind willreturn memory(none)
5754
declare spir_func float @_Z4fmodff(float, float)
5855
declare dso_local spir_func noundef nofpclass(nan inf) float @_Z16__spirv_ocl_fmaxff(float noundef nofpclass(nan inf), float noundef nofpclass(nan inf)) local_unnamed_addr #1

llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_float_controls2/exec_mode.ll

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,12 @@ entry:
2424
ret void
2525
}
2626

27-
define dso_local dllexport spir_kernel void @k_float_controls_fp128(fp128 %fp) {
27+
define dso_local dllexport spir_kernel void @k_float_controls_all(half %h, bfloat %b, float %f, double %d) {
2828
entry:
2929
ret void
3030
}
3131

32-
define dso_local dllexport spir_kernel void @k_float_controls_all(half %h, bfloat %b, float %f, double %d, fp128 %fp) {
33-
entry:
34-
ret void
35-
}
36-
37-
!spirv.ExecutionMode = !{!17, !18, !19, !20, !21, !22, !23, !24, !25, !26}
32+
!spirv.ExecutionMode = !{!17, !18, !19, !20, !22, !23, !24, !25}
3833

3934
; CHECK: OpEntryPoint Kernel %[[#KERNEL_HALF:]] "k_float_controls_half"
4035
!0 = !{ptr @k_float_controls_half, !"k_float_controls_half", !6, i32 0, !6, !7, !8, i32 0, i32 0}
@@ -48,9 +43,6 @@ entry:
4843
; CHECK: OpEntryPoint Kernel %[[#KERNEL_DOUBLE:]] "k_float_controls_double"
4944
!3 = !{ptr @k_float_controls_double, !"k_float_controls_double", !6, i32 0, !6, !7, !8, i32 0, i32 0}
5045

51-
; CHECK: OpEntryPoint Kernel %[[#KERNEL_FP128:]] "k_float_controls_fp128"
52-
!4 = !{ptr @k_float_controls_fp128, !"k_float_controls_fp128", !6, i32 0, !6, !7, !8, i32 0, i32 0}
53-
5446
; CHECK: OpEntryPoint Kernel %[[#KERNEL_ALL:]] "k_float_controls_all"
5547
!5 = !{ptr @k_float_controls_all, !"k_float_controls_all", !6, i32 0, !6, !7, !8, i32 0, i32 0}
5648
!6 = !{i32 2, i32 2}
@@ -69,20 +61,14 @@ entry:
6961
; CHECK-DAG: OpExecutionMode %[[#KERNEL_DOUBLE]] FPFastMathDefault %[[#DOUBLE_TYPE:]] 7
7062
!20 = !{ptr @k_float_controls_double, i32 6028, double poison, i32 7}
7163

72-
; CHECK-DAG: OpExecutionMode %[[#KERNEL_FP128]] FPFastMathDefault %[[#FP128_TYPE:]] 65536
73-
!21 = !{ptr @k_float_controls_fp128, i32 6028, fp128 poison, i32 65536}
74-
7564
; CHECK-DAG: OpExecutionMode %[[#KERNEL_ALL]] FPFastMathDefault %[[#HALF_TYPE]] 131072
7665
; CHECK-DAG: OpExecutionMode %[[#KERNEL_ALL]] FPFastMathDefault %[[#FLOAT_TYPE]] 262144
7766
; CHECK-DAG: OpExecutionMode %[[#KERNEL_ALL]] FPFastMathDefault %[[#DOUBLE_TYPE]] 458752
78-
; CHECK-DAG: OpExecutionMode %[[#KERNEL_ALL]] FPFastMathDefault %[[#FP128_TYPE]] 65543
7967
!22 = !{ptr @k_float_controls_all, i32 6028, half poison, i32 131072}
8068
!23 = !{ptr @k_float_controls_all, i32 6028, bfloat poison, i32 131072}
8169
!24 = !{ptr @k_float_controls_all, i32 6028, float poison, i32 262144}
8270
!25 = !{ptr @k_float_controls_all, i32 6028, double poison, i32 458752}
83-
!26 = !{ptr @k_float_controls_all, i32 6028, fp128 poison, i32 65543}
8471

8572
; CHECK: %[[#HALF_TYPE]] = OpTypeFloat 16
8673
; CHECK: %[[#FLOAT_TYPE]] = OpTypeFloat 32
8774
; CHECK: %[[#DOUBLE_TYPE]] = OpTypeFloat 64
88-
; CHECK: %[[#FP128_TYPE]] = OpTypeFloat 128

0 commit comments

Comments
 (0)