From bbf7b42bd4fb20555915c089db013275171b78af Mon Sep 17 00:00:00 2001 From: "marcos.maronas" Date: Wed, 16 Apr 2025 16:56:23 +0200 Subject: [PATCH 01/19] Dissociate Logical/Physical from OpenCL/Vulkan env. --- llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp | 6 ++- llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp | 7 ++- llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp | 5 +- .../Target/SPIRV/SPIRVInstructionSelector.cpp | 40 ++++++++------- llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp | 51 ++++++++++++++++--- .../Target/SPIRV/SPIRVPrepareFunctions.cpp | 14 ++++- llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp | 18 +++++-- llvm/lib/Target/SPIRV/SPIRVSubtarget.h | 29 ++++++++--- llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp | 9 +++- 9 files changed, 138 insertions(+), 41 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp index f17c8a8fac14b..4780402f0a89c 100644 --- a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp @@ -532,7 +532,11 @@ void SPIRVAsmPrinter::outputExecutionMode(const Module &M) { Inst.addOperand(MCOperand::createImm(TypeCode)); outputMCInst(Inst); } - if (ST->isOpenCLEnv() && !M.getNamedMetadata("spirv.ExecutionMode") && + // FIXME: At the moment, `isOpenCLEnv()` is not precise enough. This is + // because the Triple is not always precise enough. For now, we'll rely + // instead on `isLogicalSPIRV()`, but this should be changed when + // `isOpenCLEnv()` is precise enough. + if (!ST->isLogicalSPIRV() && !M.getNamedMetadata("spirv.ExecutionMode") && !M.getNamedMetadata("opencl.enable.FP_CONTRACT")) { MCInst Inst; Inst.setOpcode(SPIRV::OpExecutionMode); diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp index 5ec8c22dbf473..52fc54a9d392a 100644 --- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp @@ -267,7 +267,12 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx, static SPIRV::ExecutionModel::ExecutionModel getExecutionModel(const SPIRVSubtarget &STI, const Function &F) { - if (STI.isOpenCLEnv()) + // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and + // `isVulkanEnv()` return true. This is because the Triple is not always + // precise enough. For now, we'll rely instead on `isLogicalSPIRV()`, but this + // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true + // at the same time. + if (!STI.isLogicalSPIRV()) return SPIRV::ExecutionModel::Kernel; auto attribute = F.getFnAttribute("hlsl.shader"); diff --git a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp index 4ce316ea32e1c..71fbe61571e96 100644 --- a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp @@ -767,7 +767,10 @@ Register SPIRVGlobalRegistry::buildGlobalVariable( // TODO: maybe move to GenerateDecorations pass. const SPIRVSubtarget &ST = cast(MIRBuilder.getMF().getSubtarget()); - if (IsConst && ST.isOpenCLEnv()) + // FIXME: Constant requires Kernel Capabilities, so we only emit it if we are + // in OpenCL env. However, that is not good enough at the moment, so we use + // `!isLogicalSPIRV()` instead. + if (IsConst && !ST.isLogicalSPIRV()) buildOpDecorate(Reg, MIRBuilder, SPIRV::Decoration::Constant, {}); if (GVar && GVar->getAlign().valueOrOne().value() != 1) { diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp index 79f6b43f3aded..39cdf04b61345 100644 --- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp @@ -862,7 +862,7 @@ bool SPIRVInstructionSelector::spvSelect(Register ResVReg, .addUse(GV); return MIB.constrainAllUses(TII, TRI, RBI) && BuildMI(BB, I, I.getDebugLoc(), - TII.get(STI.isVulkanEnv() + TII.get(STI.isLogicalSPIRV() ? SPIRV::OpInBoundsAccessChain : SPIRV::OpInBoundsPtrAccessChain)) .addDef(ResVReg) @@ -1036,7 +1036,7 @@ bool SPIRVInstructionSelector::selectUnOp(Register ResVReg, const SPIRVType *ResType, MachineInstr &I, unsigned Opcode) const { - if (STI.isOpenCLEnv() && I.getOperand(1).isReg()) { + if (!STI.isLogicalSPIRV() && I.getOperand(1).isReg()) { Register SrcReg = I.getOperand(1).getReg(); bool IsGV = false; for (MachineRegisterInfo::def_instr_iterator DefIt = @@ -2069,7 +2069,7 @@ bool SPIRVInstructionSelector::selectDot4AddPackedExpansion( auto ExtractOp = Signed ? SPIRV::OpBitFieldSExtract : SPIRV::OpBitFieldUExtract; - bool ZeroAsNull = STI.isOpenCLEnv(); + bool ZeroAsNull = !STI.isLogicalSPIRV(); // Extract the i8 element, multiply and add it to the accumulator for (unsigned i = 0; i < 4; i++) { // A[i] @@ -2209,7 +2209,7 @@ bool SPIRVInstructionSelector::selectWaveOpInst(Register ResVReg, .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType)) .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, - IntTy, TII, STI.isOpenCLEnv())); + IntTy, TII, !STI.isLogicalSPIRV())); for (unsigned J = 2; J < I.getNumOperands(); J++) { BMI.addUse(I.getOperand(J).getReg()); @@ -2233,7 +2233,7 @@ bool SPIRVInstructionSelector::selectWaveActiveCountBits( .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType)) .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, - TII, STI.isOpenCLEnv())) + TII, !STI.isLogicalSPIRV())) .addImm(SPIRV::GroupOperation::Reduce) .addUse(BallotReg) .constrainAllUses(TII, TRI, RBI); @@ -2264,7 +2264,7 @@ bool SPIRVInstructionSelector::selectWaveReduceMax(Register ResVReg, .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType)) .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, TII, - STI.isOpenCLEnv())) + !STI.isLogicalSPIRV())) .addImm(SPIRV::GroupOperation::Reduce) .addUse(I.getOperand(2).getReg()) .constrainAllUses(TII, TRI, RBI); @@ -2291,7 +2291,7 @@ bool SPIRVInstructionSelector::selectWaveReduceSum(Register ResVReg, .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType)) .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, TII, - STI.isOpenCLEnv())) + !STI.isLogicalSPIRV())) .addImm(SPIRV::GroupOperation::Reduce) .addUse(I.getOperand(2).getReg()); } @@ -2513,7 +2513,7 @@ bool SPIRVInstructionSelector::selectFCmp(Register ResVReg, Register SPIRVInstructionSelector::buildZerosVal(const SPIRVType *ResType, MachineInstr &I) const { // OpenCL uses nulls for Zero. In HLSL we don't use null constants. - bool ZeroAsNull = STI.isOpenCLEnv(); + bool ZeroAsNull = !STI.isLogicalSPIRV(); if (ResType->getOpcode() == SPIRV::OpTypeVector) return GR.getOrCreateConstVector(0UL, I, ResType, TII, ZeroAsNull); return GR.getOrCreateConstInt(0, I, ResType, TII, ZeroAsNull); @@ -2522,7 +2522,7 @@ Register SPIRVInstructionSelector::buildZerosVal(const SPIRVType *ResType, Register SPIRVInstructionSelector::buildZerosValF(const SPIRVType *ResType, MachineInstr &I) const { // OpenCL uses nulls for Zero. In HLSL we don't use null constants. - bool ZeroAsNull = STI.isOpenCLEnv(); + bool ZeroAsNull = !STI.isLogicalSPIRV(); APFloat VZero = getZeroFP(GR.getTypeForSPIRVType(ResType)); if (ResType->getOpcode() == SPIRV::OpTypeVector) return GR.getOrCreateConstVector(VZero, I, ResType, TII, ZeroAsNull); @@ -2532,7 +2532,7 @@ Register SPIRVInstructionSelector::buildZerosValF(const SPIRVType *ResType, Register SPIRVInstructionSelector::buildOnesValF(const SPIRVType *ResType, MachineInstr &I) const { // OpenCL uses nulls for Zero. In HLSL we don't use null constants. - bool ZeroAsNull = STI.isOpenCLEnv(); + bool ZeroAsNull = !STI.isLogicalSPIRV(); APFloat VOne = getOneFP(GR.getTypeForSPIRVType(ResType)); if (ResType->getOpcode() == SPIRV::OpTypeVector) return GR.getOrCreateConstVector(VOne, I, ResType, TII, ZeroAsNull); @@ -2720,10 +2720,10 @@ bool SPIRVInstructionSelector::selectConst(Register ResVReg, Reg = GR.getOrCreateConstNullPtr(MIRBuilder, ResType); } else if (Opcode == TargetOpcode::G_FCONSTANT) { Reg = GR.getOrCreateConstFP(I.getOperand(1).getFPImm()->getValue(), I, - ResType, TII, STI.isOpenCLEnv()); + ResType, TII, !STI.isLogicalSPIRV()); } else { Reg = GR.getOrCreateConstInt(I.getOperand(1).getCImm()->getZExtValue(), I, - ResType, TII, STI.isOpenCLEnv()); + ResType, TII, !STI.isLogicalSPIRV()); } return Reg == ResVReg ? true : BuildCOPY(ResVReg, Reg, I); } @@ -2803,7 +2803,7 @@ bool SPIRVInstructionSelector::selectGEP(Register ResVReg, // OpAccessChain could be used for OpenCL, but the SPIRV-LLVM Translator only // relies on PtrAccessChain, so we'll try not to deviate. For Vulkan however, // we have to use Op[InBounds]AccessChain. - const unsigned Opcode = STI.isVulkanEnv() + const unsigned Opcode = STI.isLogicalSPIRV() ? (IsGEPInBounds ? SPIRV::OpInBoundsAccessChain : SPIRV::OpAccessChain) : (IsGEPInBounds ? SPIRV::OpInBoundsPtrAccessChain @@ -3483,7 +3483,7 @@ bool SPIRVInstructionSelector::selectFirstBitSet64Overflow( // On odd component counts we need to handle one more component if (CurrentComponent != ComponentCount) { - bool ZeroAsNull = STI.isOpenCLEnv(); + bool ZeroAsNull = !STI.isLogicalSPIRV(); Register FinalElemReg = MRI->createVirtualRegister(GR.getRegClass(I64Type)); Register ConstIntLastIdx = GR.getOrCreateConstInt( ComponentCount - 1, I, BaseType, TII, ZeroAsNull); @@ -3513,7 +3513,7 @@ bool SPIRVInstructionSelector::selectFirstBitSet64( Register SrcReg, unsigned BitSetOpcode, bool SwapPrimarySide) const { unsigned ComponentCount = GR.getScalarOrVectorComponentCount(ResType); SPIRVType *BaseType = GR.retrieveScalarOrVectorIntType(ResType); - bool ZeroAsNull = STI.isOpenCLEnv(); + bool ZeroAsNull = !STI.isLogicalSPIRV(); Register ConstIntZero = GR.getOrCreateConstInt(0, I, BaseType, TII, ZeroAsNull); Register ConstIntOne = @@ -3715,7 +3715,10 @@ bool SPIRVInstructionSelector::selectAllocaArray(Register ResVReg, .addUse(GR.getSPIRVTypeID(ResType)) .addUse(I.getOperand(2).getReg()) .constrainAllUses(TII, TRI, RBI); - if (!STI.isVulkanEnv()) { + // FIXME: Alignment requires Kernel Capabilities, so we only emit it if we are + // in OpenCL env. However, that is not good enough at the moment, so we use + // `!isLogicalSPIRV()` instead. + if (!STI.isLogicalSPIRV()) { unsigned Alignment = I.getOperand(3).getImm(); buildOpDecorate(ResVReg, I, TII, SPIRV::Decoration::Alignment, {Alignment}); } @@ -3734,7 +3737,10 @@ bool SPIRVInstructionSelector::selectFrameIndex(Register ResVReg, .addUse(GR.getSPIRVTypeID(ResType)) .addImm(static_cast(SPIRV::StorageClass::Function)) .constrainAllUses(TII, TRI, RBI); - if (!STI.isVulkanEnv()) { + // FIXME: Alignment requires Kernel Capabilities, so we only emit it if we are + // in OpenCL env. However, that is not good enough at the moment, so we use + // `!isLogicalSPIRV()` instead. + if (!STI.isLogicalSPIRV()) { unsigned Alignment = I.getOperand(2).getImm(); buildOpDecorate(ResVReg, *It, TII, SPIRV::Decoration::Alignment, {Alignment}); diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp index a6482d9df2ccb..2d59eab3626ce 100644 --- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp @@ -68,7 +68,12 @@ getSymbolicOperandRequirements(SPIRV::OperandCategory::OperandCategory Category, SPIRV::RequirementHandler &Reqs) { // A set of capabilities to avoid if there is another option. AvoidCapabilitiesSet AvoidCaps; - if (ST.isOpenCLEnv()) + // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and + // `isVulkanEnv()` return true. This is because the Triple is not always + // precise enough. For now, we'll rely instead on `isLogicalSPIRV()`, but this + // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true + // at the same time. + if (!ST.isLogicalSPIRV()) AvoidCaps.S.insert(SPIRV::Capability::Shader); VersionTuple ReqMinVer = getSymbolicOperandMinVersion(Category, i); @@ -144,7 +149,12 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) { static_cast(getMetadataUInt(MemMD, 1)); } else { // TODO: Add support for VulkanMemoryModel. - MAI.Mem = ST->isOpenCLEnv() ? SPIRV::MemoryModel::OpenCL + // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and + // `isVulkanEnv()` return true. This is because the Triple is not always + // precise enough. For now, we'll rely instead on `isLogicalSPIRV()`, but this + // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true + // at the same time. + MAI.Mem = !ST->isLogicalSPIRV() ? SPIRV::MemoryModel::OpenCL : SPIRV::MemoryModel::GLSL450; if (MAI.Mem == SPIRV::MemoryModel::OpenCL) { unsigned PtrSize = ST->getPointerSize(); @@ -203,7 +213,12 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) { MAI.Reqs.getAndAddRequirements(SPIRV::OperandCategory::AddressingModelOperand, MAI.Addr, *ST); - if (ST->isOpenCLEnv()) { + // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and + // `isVulkanEnv()` return true. This is because the Triple is not always + // precise enough. For now, we'll rely instead on `isLogicalSPIRV()`, but this + // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true + // at the same time. + if (!ST->isLogicalSPIRV()) { // TODO: check if it's required by default. MAI.ExtInstSetMap[static_cast( SPIRV::InstructionSet::OpenCL_std)] = MAI.getNextIDRegister(); @@ -804,12 +819,17 @@ void RequirementHandler::initAvailableCapabilities(const SPIRVSubtarget &ST) { addAvailableCaps(EnabledCapabilities); } - if (ST.isOpenCLEnv()) { + // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and + // `isVulkanEnv()` return true. This is because the Triple is not always + // precise enough. For now, we'll rely instead on `isLogicalSPIRV`, but this + // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true + // at the same time. + if (!ST.isLogicalSPIRV()) { initAvailableCapabilitiesForOpenCL(ST); return; } - if (ST.isVulkanEnv()) { + if (ST.isLogicalSPIRV()) { initAvailableCapabilitiesForVulkan(ST); return; } @@ -969,7 +989,12 @@ static void addOpTypeImageReqs(const MachineInstr &MI, } // Has optional access qualifier. - if (ST.isOpenCLEnv()) { + // FIXME: ImageBasic/ImageReadWrite capabilities require Kernel capability. + // However, for now, both `isVulkanEnv()` and `isOpenCLEnv()` can return + // true under some circumstances. Instead, we're using `isLogicalSPIRV()`, + // but we should change this when `isVulkanEnv()` and `isOpenCLEnv()` are + // precise enough. + if (!ST.isLogicalSPIRV()) { if (MI.getNumOperands() > 8 && MI.getOperand(8).getImm() == SPIRV::AccessQualifier::ReadWrite) Reqs.addRequirements(SPIRV::Capability::ImageReadWrite); @@ -1267,7 +1292,12 @@ void addInstrRequirements(const MachineInstr &MI, ST); // If it's a type of pointer to float16 targeting OpenCL, add Float16Buffer // capability. - if (!ST.isOpenCLEnv()) + // FIXME: Float16Buffer capability requires Kernel capability. However, + // for now, both `isVulkanEnv()` and `isOpenCLEnv()` can return true under + // some circumstances. Instead, we're using `isLogicalSPIRV()`, but we + // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are precise + // enough. + if (ST.isLogicalSPIRV()) break; assert(MI.getOperand(2).isReg()); const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo(); @@ -1342,7 +1372,12 @@ void addInstrRequirements(const MachineInstr &MI, addOpTypeImageReqs(MI, Reqs, ST); break; case SPIRV::OpTypeSampler: - if (!ST.isVulkanEnv()) { + // FIXME: ImageBasic capability requires Kernel capability. However, for + // now, both `isVulkanEnv()` and `isOpenCLEnv()` can return true under + // some circumstances. Instead, we're using `isLogicalSPIRV()`, but + // we should change this when `isVulkanEnv()` and `isOpenCLEnv()` are + // precise enough. + if (!ST.isLogicalSPIRV()) { Reqs.addCapability(SPIRV::Capability::ImageBasic); } break; diff --git a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp index bd039871dec44..d2c51c80c1507 100644 --- a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp @@ -407,13 +407,23 @@ bool SPIRVPrepareFunctions::substituteIntrinsicCalls(Function *F) { Changed = true; break; case Intrinsic::lifetime_start: - if (STI.isOpenCLEnv()) { + // FIXME: OpLifetimeStart requires Kernel capability. However, for now, + // both `isVulkanEnv()` and `isOpenCLEnv()` can return true under some + // circumstances. Instead, we're using `isLogicalSPIRV()`, but we + // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are + // precise enough. + if (!STI.isLogicalSPIRV()) { Changed |= toSpvOverloadedIntrinsic( II, Intrinsic::SPVIntrinsics::spv_lifetime_start, {1}); } break; case Intrinsic::lifetime_end: - if (STI.isOpenCLEnv()) { + // FIXME: OpLifetimeStop requires Kernel capability. However, for now, + // both `isVulkanEnv()` and `isOpenCLEnv()` can return true under some + // circumstances. Instead, we're using `isLogicalSPIRV()`, but we + // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are + // precise enough. + if (!STI.isLogicalSPIRV()) { Changed |= toSpvOverloadedIntrinsic( II, Intrinsic::SPVIntrinsics::spv_lifetime_end, {1}); } diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp index 236a1272bcebb..f6457f7fb93f1 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp @@ -113,7 +113,11 @@ bool SPIRVSubtarget::canUseExtInstSet( SPIRV::InstructionSet::InstructionSet SPIRVSubtarget::getPreferredInstructionSet() const { - if (isOpenCLEnv()) + // FIXME: For now, both `isVulkanEnv()` and `isOpenCLEnv()` can return true + // under some circumstances. Instead, we're using `isLogicalSPIRV()`, but we + // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are precise + // enough. + if (!isLogicalSPIRV()) return SPIRV::InstructionSet::OpenCL_std; else return SPIRV::InstructionSet::GLSL_std_450; @@ -124,7 +128,11 @@ bool SPIRVSubtarget::isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const { } bool SPIRVSubtarget::isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const { - if (!isOpenCLEnv()) + // FIXME: For now, both `isVulkanEnv()` and `isOpenCLEnv()` can return true + // under some circumstances. Instead, we're using `isLogicalSPIRV()`, but we + // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are precise + // enough. + if (isLogicalSPIRV()) return false; return isAtLeastVer(OpenCLVersion, VerToCompareTo); } @@ -147,7 +155,11 @@ void SPIRVSubtarget::accountForAMDShaderTrinaryMinmax() { // Must have called initAvailableExtensions first. void SPIRVSubtarget::initAvailableExtInstSets() { AvailableExtInstSets.clear(); - if (!isOpenCLEnv()) + // FIXME: For now, both `isVulkanEnv()` and `isOpenCLEnv()` can return true + // under some circumstances. Instead, we're using `isLogicalSPIRV()`, but we + // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are precise + // enough. + if (isLogicalSPIRV()) AvailableExtInstSets.insert(SPIRV::InstructionSet::GLSL_std_450); else AvailableExtInstSets.insert(SPIRV::InstructionSet::OpenCL_std); diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h index e4484f6508b6b..3910fef4b8cbf 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h @@ -36,6 +36,8 @@ class StringRef; class SPIRVTargetMachine; class SPIRVSubtarget : public SPIRVGenSubtargetInfo { + // Enum for the SPIR-V environment: OpenCL, Vulkan or Unkwnown. + enum SPIRVEnvType { OpenCL, Vulkan, Unknown }; private: const unsigned PointerSize; VersionTuple SPIRVVersion; @@ -49,6 +51,7 @@ class SPIRVSubtarget : public SPIRVGenSubtargetInfo { SPIRVFrameLowering FrameLowering; SPIRVTargetLowering TLInfo; Triple TargetTriple; + SPIRVEnvType Env; // GlobalISel related APIs. std::unique_ptr CallLoweringInfo; @@ -78,14 +81,28 @@ class SPIRVSubtarget : public SPIRVGenSubtargetInfo { unsigned getPointerSize() const { return PointerSize; } unsigned getBound() const { return GR->getBound(); } bool canDirectlyComparePointers() const; - // TODO: this environment is not implemented in Triple, we need to decide - // how to standardize its support. For now, let's assume SPIR-V with physical - // addressing is OpenCL, and Logical addressing is Vulkan. + SPIRVEnvType getEnv() const { + if (TargetTriple.getOS() == Triple::Vulkan) + return Vulkan; + if (TargetTriple.getEnvironment() == Triple::OpenCL) + return OpenCL; + return Unknown; + } + // FIXME: For now, we rely only on the triple to determine the environment. + // However, a lot of frontends emit unknown OS or environment, which makes it + // difficult to determine the environment. We should consider adding other + // methods. For now, we will return true for both OpenCL and Unknown env. bool isOpenCLEnv() const { - return TargetTriple.getArch() == Triple::spirv32 || - TargetTriple.getArch() == Triple::spirv64; + return getEnv() == OpenCL || getEnv() == Unknown; + } + // FIXME: For now, we rely only on the triple to determine the environment. + // However, a lot of frontends emit unknown OS or environment, which makes it + // difficult to determine the environment. We should consider adding other + // methods. For now, we will return true for both Vulkan and Unknown env. + bool isVulkanEnv() const { + return getEnv() == Vulkan || getEnv() == Unknown; } - bool isVulkanEnv() const { return TargetTriple.getArch() == Triple::spirv; } + bool isLogicalSPIRV() const { return TargetTriple.getArch() == Triple::spirv; } const std::string &getTargetTripleAsStr() const { return TargetTriple.str(); } VersionTuple getSPIRVVersion() const { return SPIRVVersion; }; bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const; diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp index 68286737b972f..652ba85099728 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp @@ -189,7 +189,12 @@ TargetPassConfig *SPIRVTargetMachine::createPassConfig(PassManagerBase &PM) { void SPIRVPassConfig::addIRPasses() { TargetPassConfig::addIRPasses(); - if (TM.getSubtargetImpl()->isVulkanEnv()) { + // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and + // `isVulkanEnv()` return true. This is because the Triple is not always + // precise enough. For now, we'll rely instead on `isLogicalSPIRV`, but this + // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true + // at the same time. + if (TM.getSubtargetImpl()->isLogicalSPIRV()) { // 1. Simplify loop for subsequent transformations. After this steps, loops // have the following properties: // - loops have a single entry edge (pre-header to loop header). @@ -221,7 +226,7 @@ void SPIRVPassConfig::addIRPasses() { void SPIRVPassConfig::addISelPrepare() { addPass(createSPIRVEmitIntrinsicsPass(&getTM())); - if (TM.getSubtargetImpl()->isVulkanEnv()) + if (TM.getSubtargetImpl()->isLogicalSPIRV()) addPass(createSPIRVLegalizePointerCastPass(&getTM())); TargetPassConfig::addISelPrepare(); } From f6bf74b6c9b2c7e70909e37c83d1e0efdd536e09 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Wed, 16 Apr 2025 17:44:06 +0200 Subject: [PATCH 02/19] Extra change to complete dissociation. --- llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp index 2d59eab3626ce..3b62742441a9c 100644 --- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp @@ -185,7 +185,11 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) { // OpenCL 1.0 by default for the OpenCL environment to avoid puzzling // run-times with Unknown/0.0 version output. For a reference, LLVM-SPIRV // Translator avoids potential issues with run-times in a similar manner. - if (ST->isOpenCLEnv()) { + // FIXME: At the moment, `isOpenCLEnv()` is not precise enough. This is + // because the Triple is not always precise enough. For now, we'll rely + // instead on `isLogicalSPIRV()`, but this should be changed when + // `isOpenCLEnv()` is precise enough. + if (!ST->isLogicalSPIRV()) { MAI.SrcLang = SPIRV::SourceLanguage::OpenCL_CPP; MAI.SrcLangVersion = 100000; } else { From 4c7bbc26ef92797c6f8c357d5d0af46bfc60716f Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Wed, 23 Apr 2025 12:58:01 +0200 Subject: [PATCH 03/19] Use entry points to help determine the env. --- llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp | 34 +++++++++++++++-- llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp | 20 +++++++--- llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp | 8 ++++ llvm/lib/Target/SPIRV/SPIRVSubtarget.h | 37 ++++++++----------- 4 files changed, 69 insertions(+), 30 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp index 52fc54a9d392a..e6d056107d7d9 100644 --- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp @@ -272,14 +272,37 @@ getExecutionModel(const SPIRVSubtarget &STI, const Function &F) { // precise enough. For now, we'll rely instead on `isLogicalSPIRV()`, but this // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true // at the same time. - if (!STI.isLogicalSPIRV()) + if (STI.isOpenCLEnv()) return SPIRV::ExecutionModel::Kernel; + if (STI.isVulkanEnv()) { + auto attribute = F.getFnAttribute("hlsl.shader"); + if (!attribute.isValid()) { + report_fatal_error( + "This entry point lacks mandatory hlsl.shader attribute."); + } + + const auto value = attribute.getValueAsString(); + if (value == "compute") + return SPIRV::ExecutionModel::GLCompute; + + report_fatal_error( + "This HLSL entry point is not supported by this backend."); + } + + assert(STI.getEnv() == Unknown); + // Can we rely on "hlsl.shader" attribute? Is it mandatory for Vulkan env? If + // so, we can set Env to Vulkan whenever we find it, and to OpenCL otherwise. + + // We will now change the Env based on the attribute, so we need to strip + // `const` out of the ref to STI. + SPIRVSubtarget *NonConstSTI = const_cast(&STI); auto attribute = F.getFnAttribute("hlsl.shader"); if (!attribute.isValid()) { - report_fatal_error( - "This entry point lacks mandatory hlsl.shader attribute."); + NonConstSTI->setEnv(SPIRVSubtarget::OpenCL); + return SPIRV::ExecutionModel::Kernel; } + NonConstSTI->setEnv(SPIRVSubtarget::Vulkan); const auto value = attribute.getValueAsString(); if (value == "compute") @@ -444,6 +467,11 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder, // Handle entry points and function linkage. if (isEntryPoint(F)) { + // EntryPoints can help us to determine the environment we're working on. + // Therefore, we need a non-const pointer to SPIRVSubtarget to update the + // environment if we need to. + const SPIRVSubtarget *ST = + static_cast(&MIRBuilder.getMF().getSubtarget()); auto MIB = MIRBuilder.buildInstr(SPIRV::OpEntryPoint) .addImm(static_cast(getExecutionModel(*ST, F))) .addUse(FuncVReg); diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp index 3b62742441a9c..75a50ece9715e 100644 --- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp @@ -151,11 +151,11 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) { // TODO: Add support for VulkanMemoryModel. // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and // `isVulkanEnv()` return true. This is because the Triple is not always - // precise enough. For now, we'll rely instead on `isLogicalSPIRV()`, but this - // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true - // at the same time. + // precise enough. For now, we'll rely instead on `isLogicalSPIRV()`, but + // this should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be + // true at the same time. MAI.Mem = !ST->isLogicalSPIRV() ? SPIRV::MemoryModel::OpenCL - : SPIRV::MemoryModel::GLSL450; + : SPIRV::MemoryModel::GLSL450; if (MAI.Mem == SPIRV::MemoryModel::OpenCL) { unsigned PtrSize = ST->getPointerSize(); MAI.Addr = PtrSize == 32 ? SPIRV::AddressingModel::Physical32 @@ -1808,7 +1808,11 @@ void addInstrRequirements(const MachineInstr &MI, // not allowed to produce // StorageImageReadWithoutFormat/StorageImageWriteWithoutFormat, see // https://github.com/KhronosGroup/SPIRV-Headers/issues/487 - if (isImageTypeWithUnknownFormat(TypeDef) && !ST.isOpenCLEnv()) + + // FIXME: For now, `isOpenCLEnv()` is not precise enough. Instead, we're + // using `isLogicalSPIRV()`, but we should change this when `isOpenCLEnv()` + // is precise enough. + if (isImageTypeWithUnknownFormat(TypeDef) && ST.isLogicalSPIRV()) Reqs.addCapability(SPIRV::Capability::StorageImageReadWithoutFormat); break; } @@ -1821,7 +1825,11 @@ void addInstrRequirements(const MachineInstr &MI, // not allowed to produce // StorageImageReadWithoutFormat/StorageImageWriteWithoutFormat, see // https://github.com/KhronosGroup/SPIRV-Headers/issues/487 - if (isImageTypeWithUnknownFormat(TypeDef) && !ST.isOpenCLEnv()) + + // FIXME: For now, `isOpenCLEnv()` is not precise enough. Instead, we're + // using `isLogicalSPIRV()`, but we should change this when `isOpenCLEnv()` + // is precise enough. + if (isImageTypeWithUnknownFormat(TypeDef) && ST.isLogicalSPIRV()) Reqs.addCapability(SPIRV::Capability::StorageImageWriteWithoutFormat); break; } diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp index f6457f7fb93f1..e76646e4fa7a7 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp @@ -83,6 +83,14 @@ SPIRVSubtarget::SPIRVSubtarget(const Triple &TT, const std::string &CPU, } OpenCLVersion = VersionTuple(2, 2); + // Set the environment based on the target triple. + if (TargetTriple.getOS() == Triple::Vulkan) + Env = Vulkan; + else if (TargetTriple.getEnvironment() == Triple::OpenCL) + Env = OpenCL; + else + Env = Unknown; + // The order of initialization is important. initAvailableExtensions(Extensions); initAvailableExtInstSets(); diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h index 3910fef4b8cbf..6101ed6c71b4b 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h @@ -36,8 +36,10 @@ class StringRef; class SPIRVTargetMachine; class SPIRVSubtarget : public SPIRVGenSubtargetInfo { +public: // Enum for the SPIR-V environment: OpenCL, Vulkan or Unkwnown. enum SPIRVEnvType { OpenCL, Vulkan, Unknown }; + private: const unsigned PointerSize; VersionTuple SPIRVVersion; @@ -81,28 +83,21 @@ class SPIRVSubtarget : public SPIRVGenSubtargetInfo { unsigned getPointerSize() const { return PointerSize; } unsigned getBound() const { return GR->getBound(); } bool canDirectlyComparePointers() const; - SPIRVEnvType getEnv() const { - if (TargetTriple.getOS() == Triple::Vulkan) - return Vulkan; - if (TargetTriple.getEnvironment() == Triple::OpenCL) - return OpenCL; - return Unknown; - } - // FIXME: For now, we rely only on the triple to determine the environment. - // However, a lot of frontends emit unknown OS or environment, which makes it - // difficult to determine the environment. We should consider adding other - // methods. For now, we will return true for both OpenCL and Unknown env. - bool isOpenCLEnv() const { - return getEnv() == OpenCL || getEnv() == Unknown; - } - // FIXME: For now, we rely only on the triple to determine the environment. - // However, a lot of frontends emit unknown OS or environment, which makes it - // difficult to determine the environment. We should consider adding other - // methods. For now, we will return true for both Vulkan and Unknown env. - bool isVulkanEnv() const { - return getEnv() == Vulkan || getEnv() == Unknown; + void setEnv(SPIRVEnvType E) { + assert(E != Unknown && "Unknown environment is not allowed"); + assert(Env == Unknown && "Environment is already set"); + + Env = E; } - bool isLogicalSPIRV() const { return TargetTriple.getArch() == Triple::spirv; } + SPIRVEnvType getEnv() const { return Env; } + bool isOpenCLEnv() const { return getEnv() == OpenCL; } + bool isVulkanEnv() const { return getEnv() == Vulkan; } + // FIXME: This should check the triple arch instead, but a lot of places use + // this method now instead of `is[OpenCL/Vulkan]Env()`, and this is a + // shortcut to make sure `is[OpenCL/Vulkan]Env()` works as expected. When we + // change back all uses of `isLogicalSPIRV()` to `is[OpenCL/Vulkan]Env()`, we + // can implement this correctly again. + bool isLogicalSPIRV() const { return isVulkanEnv(); } const std::string &getTargetTripleAsStr() const { return TargetTriple.str(); } VersionTuple getSPIRVVersion() const { return SPIRVVersion; }; bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const; From ecb4f790f089731227a715316472b0b27ea91aa9 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Thu, 24 Apr 2025 11:50:50 +0200 Subject: [PATCH 04/19] Explicitly add vulkan to triple of failing tests. --- llvm/test/CodeGen/SPIRV/empty-logical.ll | 4 ++-- llvm/test/CodeGen/SPIRV/empty-module.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/AddUint64.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/abs.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/acos.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/all.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/any.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/asin.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/atan.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/atan2.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/ceil.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/clamp.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cos.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cosh.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/countbits.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cross.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/discard.ll | 12 ++++++------ llvm/test/CodeGen/SPIRV/hlsl-intrinsics/distance.ll | 4 ++-- .../SPIRV/hlsl-intrinsics/dot4add_i8packed.ll | 12 ++++++------ .../SPIRV/hlsl-intrinsics/dot4add_u8packed.ll | 12 ++++++------ llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp2.ll | 4 ++-- .../CodeGen/SPIRV/hlsl-intrinsics/firstbithigh.ll | 4 ++-- .../CodeGen/SPIRV/hlsl-intrinsics/firstbitlow.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/floor.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmad.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmax.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmin.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/frac.ll | 4 ++-- .../group_memory_barrier_with_group_sync.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/length.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/lerp.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log10.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log2.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/normalize.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/pow.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/radians.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/reflect.ll | 4 ++-- .../CodeGen/SPIRV/hlsl-intrinsics/reversebits.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/round.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/rsqrt.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/saturate.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sin.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sinh.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smax.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smin.ll | 4 ++-- .../test/CodeGen/SPIRV/hlsl-intrinsics/smoothstep.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sqrt.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/step.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/tan.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/tanh.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/trunc.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/umax.ll | 4 ++-- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/umin.ll | 4 ++-- llvm/test/CodeGen/SPIRV/inline/type.coop-matrix.ll | 2 +- .../SPIRV/structurizer/HLSLControlFlowHint.ll | 4 ++-- 58 files changed, 127 insertions(+), 127 deletions(-) diff --git a/llvm/test/CodeGen/SPIRV/empty-logical.ll b/llvm/test/CodeGen/SPIRV/empty-logical.ll index 1c6604006e2c2..eeacd31953f49 100644 --- a/llvm/test/CodeGen/SPIRV/empty-logical.ll +++ b/llvm/test/CodeGen/SPIRV/empty-logical.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ;; Ensure the required Capabilities are listed. ; CHECK-DAG: OpCapability Shader diff --git a/llvm/test/CodeGen/SPIRV/empty-module.ll b/llvm/test/CodeGen/SPIRV/empty-module.ll index b7cea042ee5dd..30a8a24e832e1 100644 --- a/llvm/test/CodeGen/SPIRV/empty-module.ll +++ b/llvm/test/CodeGen/SPIRV/empty-module.ll @@ -1,8 +1,8 @@ ; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-OCL ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} -; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOOCL -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOOCL +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: OpCapability Linkage ; CHECK-NOOCL-DAG: OpCapability Shader diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/AddUint64.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/AddUint64.ll index 1e7243e37b4a9..a97492b8453ea 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/AddUint64.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/AddUint64.ll @@ -1,5 +1,5 @@ -; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; Code here is an excerpt of clang/test/CodeGenHLSL/builtins/AddUint64.hlsl compiled for spirv using the following command ; clang -cc1 -finclude-default-header -triple spirv-unknown-vulkan-compute clang/test/CodeGenHLSL/builtins/AddUint64.hlsl -emit-llvm -disable-llvm-passes -o llvm/test/CodeGen/SPIRV/hlsl-intrinsics/uadd_with_overflow.ll diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/abs.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/abs.ll index 3b4ff4f293c64..4a15fa8b14537 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/abs.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/abs.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/acos.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/acos.ll index 9726bfbf1ada3..8b74135f89a2e 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/acos.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/acos.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" ; CHECK-DAG: %[[#float_32:]] = OpTypeFloat 32 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/all.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/all.ll index 0980a28f4e8ee..1850ff97b1380 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/all.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/all.ll @@ -1,6 +1,6 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-HLSL +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-HLSL ; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-OCL -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} ; Make sure spirv operation function calls for all are generated. diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/any.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/any.ll index 5d805202be5a7..7ba0f9a632fe5 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/any.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/any.ll @@ -1,6 +1,6 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-HLSL +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-HLSL ; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-OCL -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} ; Make sure spirv operation function calls for any are generated. diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/asin.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/asin.ll index 73b29b6a264be..29848aa471d48 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/asin.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/asin.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" ; CHECK-DAG: %[[#float_32:]] = OpTypeFloat 32 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/atan.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/atan.ll index f0ee310d3020c..1a2af12affe13 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/atan.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/atan.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" ; CHECK-DAG: %[[#float_32:]] = OpTypeFloat 32 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/atan2.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/atan2.ll index 922e017b0d5a0..e13b3a8296ac5 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/atan2.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/atan2.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" ; CHECK-DAG: %[[#float_32:]] = OpTypeFloat 32 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/ceil.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/ceil.ll index 29ac39ef9b418..14ad4e6eef3f2 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/ceil.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/ceil.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" define noundef float @ceil_float(float noundef %a) { diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/clamp.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/clamp.ll index 7ad786f78974c..124aba0746c28 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/clamp.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/clamp.ll @@ -1,5 +1,5 @@ -; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext:]] = OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cos.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cos.ll index 09f1cf07267fe..239b668644e12 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cos.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cos.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cosh.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cosh.ll index bc6dd75bce94c..9dad03aa6f911 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cosh.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cosh.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" ; CHECK-DAG: %[[#float_32:]] = OpTypeFloat 32 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/countbits.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/countbits.ll index 4fe0a6fff50d9..69f01dacc74a0 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/countbits.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/countbits.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpMemoryModel Logical GLSL450 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cross.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cross.ll index b1625c07111e4..bcb8cd32b2a9f 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cross.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/cross.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; Make sure SPIRV operation function calls for cross are lowered correctly. diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll index 5945bc390744a..d2d929b152cda 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/degrees.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/discard.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/discard.ll index 831592610d106..60fd1c8a8d170 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/discard.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/discard.ll @@ -1,9 +1,9 @@ -; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv1.5-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,SPIRV15 -; RUN: llc -verify-machineinstrs -spirv-ext=+SPV_EXT_demote_to_helper_invocation -O0 -mtriple=spirv1.5-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,SPIRV16,WITH-EXTENSION,WITH-CAPABILITY -; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv1.6-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,SPIRV16,WITH-CAPABILITY -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv1.5-unknown-unknown %s -o - -filetype=obj | spirv-val %} -; RUN: %if spirv-tools %{ llc -O0 -spirv-ext=+SPV_EXT_demote_to_helper_invocation -mtriple=spirv1.5-unknown-unknown %s -o - -filetype=obj | spirv-val %} -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv1.6-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv1.5-unknown-vulkan %s -o - | FileCheck %s --check-prefixes=CHECK,SPIRV15 +; RUN: llc -verify-machineinstrs -spirv-ext=+SPV_EXT_demote_to_helper_invocation -O0 -mtriple=spirv1.5-unknown-vulkan %s -o - | FileCheck %s --check-prefixes=CHECK,SPIRV16,WITH-EXTENSION,WITH-CAPABILITY +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv1.6-unknown-vulkan %s -o - | FileCheck %s --check-prefixes=CHECK,SPIRV16,WITH-CAPABILITY +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv1.5-unknown-vulkan %s -o - -filetype=obj | spirv-val %} +; RUN: %if spirv-tools %{ llc -O0 -spirv-ext=+SPV_EXT_demote_to_helper_invocation -mtriple=spirv1.5-unknown-vulkan %s -o - -filetype=obj | spirv-val %} +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv1.6-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; Make sure lowering is correctly generating spirv code. diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/distance.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/distance.ll index cb92f775eef31..53171780b90f7 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/distance.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/distance.ll @@ -1,5 +1,5 @@ -; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; Make sure SPIRV operation function calls for distance are lowered correctly. diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/dot4add_i8packed.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/dot4add_i8packed.ll index 8715fc324c071..bcc00ebce22ac 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/dot4add_i8packed.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/dot4add_i8packed.ll @@ -1,9 +1,9 @@ -; RUN: llc -O0 -mtriple=spirv1.5-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-EXP -; RUN: llc -O0 -mtriple=spirv1.6-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT -; RUN: llc -O0 -mtriple=spirv-unknown-unknown -spirv-ext=+SPV_KHR_integer_dot_product %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT,CHECK-EXT -; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv1.5-unknown-unknown %s -o - -filetype=obj | spirv-val %} -; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv1.6-unknown-unknown %s -o - -filetype=obj | spirv-val %} -; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown -spirv-ext=+SPV_KHR_integer_dot_product %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -mtriple=spirv1.5-unknown-vulkan %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-EXP +; RUN: llc -O0 -mtriple=spirv1.6-unknown-vulkan %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT +; RUN: llc -O0 -mtriple=spirv-unknown-vulkan -spirv-ext=+SPV_KHR_integer_dot_product %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT,CHECK-EXT +; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv1.5-unknown-vulkan %s -o - -filetype=obj | spirv-val %} +; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv1.6-unknown-vulkan %s -o - -filetype=obj | spirv-val %} +; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan -spirv-ext=+SPV_KHR_integer_dot_product %s -o - -filetype=obj | spirv-val %} ; CHECK-DOT: OpCapability DotProduct ; CHECK-DOT: OpCapability DotProductInput4x8BitPacked diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/dot4add_u8packed.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/dot4add_u8packed.ll index a43d0be9e775b..d677dc50fcc56 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/dot4add_u8packed.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/dot4add_u8packed.ll @@ -1,9 +1,9 @@ -; RUN: llc -O0 -mtriple=spirv1.5-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-EXP -; RUN: llc -O0 -mtriple=spirv1.6-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT -; RUN: llc -O0 -mtriple=spirv-unknown-unknown -spirv-ext=+SPV_KHR_integer_dot_product %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT,CHECK-EXT -; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv1.5-unknown-unknown %s -o - -filetype=obj | spirv-val %} -; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv1.6-unknown-unknown %s -o - -filetype=obj | spirv-val %} -; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown -spirv-ext=+SPV_KHR_integer_dot_product %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -mtriple=spirv1.5-unknown-vulkan %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-EXP +; RUN: llc -O0 -mtriple=spirv1.6-unknown-vulkan %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT +; RUN: llc -O0 -mtriple=spirv-unknown-vulkan -spirv-ext=+SPV_KHR_integer_dot_product %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-DOT,CHECK-EXT +; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv1.5-unknown-vulkan %s -o - -filetype=obj | spirv-val %} +; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv1.6-unknown-vulkan %s -o - -filetype=obj | spirv-val %} +; RUN: %if spirv-tools %{ llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan -spirv-ext=+SPV_KHR_integer_dot_product %s -o - -filetype=obj | spirv-val %} ; CHECK-DOT: OpCapability DotProduct ; CHECK-DOT: OpCapability DotProductInput4x8BitPacked diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp.ll index 949f750db2dc9..afd8b96db26e3 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp2.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp2.ll index 9e24c46cfcdef..3f7c47f391be2 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp2.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/exp2.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/firstbithigh.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/firstbithigh.ll index a4dd09d84d996..f99e699ce2233 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/firstbithigh.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/firstbithigh.ll @@ -1,5 +1,5 @@ -; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: [[glsl_450_ext:%.+]] = OpExtInstImport "GLSL.std.450" ; CHECK-DAG: OpMemoryModel Logical GLSL450 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/firstbitlow.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/firstbitlow.ll index 6de6cdc60ea9c..af94815faf7ef 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/firstbitlow.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/firstbitlow.ll @@ -1,5 +1,5 @@ -; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: [[glsl_450_ext:%.+]] = OpExtInstImport "GLSL.std.450" ; CHECK-DAG: OpMemoryModel Logical GLSL450 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/floor.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/floor.ll index 1f79cc951656f..261f634450042 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/floor.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/floor.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmad.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmad.ll index 0bb969021de3d..4a51f0b528f96 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmad.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmad.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmax.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmax.ll index 073a5c4f8b8ac..c62c3da59981f 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmax.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmax.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" define noundef half @test_fmax_half(half noundef %a, half noundef %b) { diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmin.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmin.ll index d4bd1a6044e53..c3ad1b5609e60 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmin.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/fmin.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" ; CHECK: OpMemoryModel Logical GLSL450 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/frac.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/frac.ll index d660abc1b6232..5920abf8d8a4f 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/frac.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/frac.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/group_memory_barrier_with_group_sync.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/group_memory_barrier_with_group_sync.ll index 10310cd30088c..adfd62d810c7e 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/group_memory_barrier_with_group_sync.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/group_memory_barrier_with_group_sync.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpMemoryModel Logical GLSL450 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/length.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/length.ll index 1ac862b79a3fa..1dcea29b36d67 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/length.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/length.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; Make sure SPIRV operation function calls for length are lowered correctly. diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/lerp.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/lerp.ll index 1d7f3a6ccc535..83ba0d2a8081a 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/lerp.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/lerp.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; Make sure SPIRV operation function calls for lerp are generated as FMix diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log.ll index 20339b98411a0..5c0d8546bacc5 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log10.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log10.ll index 10264d3ef11d3..7583066c01cf8 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log10.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log10.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: %[[#extinst:]] = OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log2.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log2.ll index 7bbd4596e99f7..62f98b3b640d8 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log2.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/log2.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/normalize.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/normalize.ll index 71f69438a5ae9..798a8dbbae8af 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/normalize.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/normalize.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; Make sure SPIRV operation function calls for normalize are lowered correctly. diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/pow.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/pow.ll index 9454143913116..f3cb9ce090eec 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/pow.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/pow.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/radians.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/radians.ll index 26e90bd7ef708..ce521c0a05ea9 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/radians.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/radians.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/reflect.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/reflect.ll index 18962807f84ff..0058e34d393eb 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/reflect.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/reflect.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; Make sure SPIRV operation function calls for reflect are lowered correctly. diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/reversebits.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/reversebits.ll index 9dc43cb25f7d6..6571b2992fab3 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/reversebits.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/reversebits.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpMemoryModel Logical GLSL450 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/round.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/round.ll index 58e54b0fbf26d..f32a0fa57901f 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/round.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/round.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/rsqrt.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/rsqrt.ll index cd9374bb180f2..fc43017cea241 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/rsqrt.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/rsqrt.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/saturate.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/saturate.ll index 0b05b615c4ad1..d1cd6f9030a11 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/saturate.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/saturate.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; Make sure SPIRV operation function calls for saturate are lowered correctly. diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sin.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sin.ll index 19aec458172f4..d7f8be6288788 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sin.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sin.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sinh.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sinh.ll index 99da3ac81b434..bb594e97657da 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sinh.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sinh.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" ; CHECK-DAG: %[[#float_32:]] = OpTypeFloat 32 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smax.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smax.ll index c6f17b677b47e..a77142b96ef71 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smax.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smax.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smin.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smin.ll index 3c7befe1078b8..7c2b44dcdc5b7 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smin.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smin.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smoothstep.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smoothstep.ll index 789b0cb15c9e2..b17fd22e13de7 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smoothstep.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/smoothstep.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val --target-env vulkan1.3 %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val --target-env vulkan1.3 %} ; TODO(#136344): This test currently fails when --target-env vulkan1.3 is specified. ; XFAIL: spirv-tools diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sqrt.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sqrt.ll index 3230f56511ebe..f793eba4273dc 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sqrt.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/sqrt.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/step.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/step.ll index f833c3256a815..20380688bff1d 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/step.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/step.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; Make sure SPIRV operation function calls for step are lowered correctly. diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/tan.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/tan.ll index f0969667f98f9..8301e05651776 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/tan.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/tan.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" ; CHECK-DAG: %[[#float_32:]] = OpTypeFloat 32 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/tanh.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/tanh.ll index 712c10d019b55..3bc908c0c8b9d 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/tanh.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/tanh.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: %[[#op_ext_glsl:]] = OpExtInstImport "GLSL.std.450" ; CHECK-DAG: %[[#float_32:]] = OpTypeFloat 32 diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/trunc.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/trunc.ll index b0f2a32d001e8..d72543ae6c6d4 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/trunc.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/trunc.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/umax.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/umax.ll index 3b3dbc997817c..81e64feddd9b9 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/umax.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/umax.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/umin.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/umin.ll index 1a3bcdbbcc31b..3d91c58216ce5 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/umin.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/umin.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK: OpExtInstImport "GLSL.std.450" diff --git a/llvm/test/CodeGen/SPIRV/inline/type.coop-matrix.ll b/llvm/test/CodeGen/SPIRV/inline/type.coop-matrix.ll index 12effdfd464f1..3bd55058e51db 100644 --- a/llvm/test/CodeGen/SPIRV/inline/type.coop-matrix.ll +++ b/llvm/test/CodeGen/SPIRV/inline/type.coop-matrix.ll @@ -1,4 +1,4 @@ -; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s ; TODO: enable spirv-val once we can add cooperative matrix capability and extension diff --git a/llvm/test/CodeGen/SPIRV/structurizer/HLSLControlFlowHint.ll b/llvm/test/CodeGen/SPIRV/structurizer/HLSLControlFlowHint.ll index 9c6f977dc9b34..5e72b66310db8 100644 --- a/llvm/test/CodeGen/SPIRV/structurizer/HLSLControlFlowHint.ll +++ b/llvm/test/CodeGen/SPIRV/structurizer/HLSLControlFlowHint.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} define spir_func noundef i32 @test_branch(i32 noundef %X) { From 1a4e754a046ef20362667c19dcb6470672fe8fa2 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Thu, 1 May 2025 10:40:22 +0200 Subject: [PATCH 05/19] Fix clang-format issue. --- llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp index 39cdf04b61345..d1342cb46b272 100644 --- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp @@ -2205,11 +2205,12 @@ bool SPIRVInstructionSelector::selectWaveOpInst(Register ResVReg, MachineBasicBlock &BB = *I.getParent(); SPIRVType *IntTy = GR.getOrCreateSPIRVIntegerType(32, I, TII); - auto BMI = BuildMI(BB, I, I.getDebugLoc(), TII.get(Opcode)) - .addDef(ResVReg) - .addUse(GR.getSPIRVTypeID(ResType)) - .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, - IntTy, TII, !STI.isLogicalSPIRV())); + auto BMI = + BuildMI(BB, I, I.getDebugLoc(), TII.get(Opcode)) + .addDef(ResVReg) + .addUse(GR.getSPIRVTypeID(ResType)) + .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, TII, + !STI.isLogicalSPIRV())); for (unsigned J = 2; J < I.getNumOperands(); J++) { BMI.addUse(I.getOperand(J).getReg()); From 314f4e0723f744d0cd047f8319139a6641856851 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Thu, 1 May 2025 10:55:13 +0200 Subject: [PATCH 06/19] Fix failing test. --- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll index 22742169506f2..2b8dc3da78bd7 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll @@ -1,7 +1,5 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val --target-env spv1.4 %} - -; FIXME(#136344): Change --target-env to vulkan1.3 and update this test accordingly once the issue is resolved. +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-uknown-vulkan1.3 %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan1.3 %s -o - -filetype=obj | spirv-val --target-env vulkan1.3 %} ; Make sure SPIRV operation function calls for faceforward are lowered correctly. From 6d0cf9e22bc710336f0eb1eaa92ad90aabbb75a1 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Thu, 1 May 2025 11:20:38 +0200 Subject: [PATCH 07/19] Fix debug build. --- llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp index 10530e0323feb..6e936bf0b5feb 100644 --- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp @@ -290,7 +290,7 @@ getExecutionModel(const SPIRVSubtarget &STI, const Function &F) { "This HLSL entry point is not supported by this backend."); } - assert(STI.getEnv() == Unknown); + assert(STI.getEnv() == SPIRVSubtarget::Unknown); // Can we rely on "hlsl.shader" attribute? Is it mandatory for Vulkan env? If // so, we can set Env to Vulkan whenever we find it, and to OpenCL otherwise. From 0f957262bb0dd862abedc6794aafde088e5be96e Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Thu, 1 May 2025 12:11:40 +0200 Subject: [PATCH 08/19] Fix failing tests. --- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll | 2 +- llvm/test/CodeGen/SPIRV/inline/type.ll | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll index 2b8dc3da78bd7..1486cb7d7224a 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll @@ -1,4 +1,4 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-uknown-vulkan1.3 %s -o - | FileCheck %s +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan1.3 %s -o - | FileCheck %s ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan1.3 %s -o - -filetype=obj | spirv-val --target-env vulkan1.3 %} ; Make sure SPIRV operation function calls for faceforward are lowered correctly. diff --git a/llvm/test/CodeGen/SPIRV/inline/type.ll b/llvm/test/CodeGen/SPIRV/inline/type.ll index 0607563381b16..be29ddfa21bab 100644 --- a/llvm/test/CodeGen/SPIRV/inline/type.ll +++ b/llvm/test/CodeGen/SPIRV/inline/type.ll @@ -1,6 +1,6 @@ -; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - | spirv-as - -o - | spirv-val %} +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - | spirv-as - -o - | spirv-val %} ; CHECK-DAG: [[float_t:%[0-9]+]] = OpTypeFloat 32 ; CHECK-DAG: [[uint32_t:%[0-9]+]] = OpTypeInt 32 0 From a42ecac9c52a56b8eeeca00cf9a24dc6ac902e71 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Thu, 1 May 2025 15:03:44 +0200 Subject: [PATCH 09/19] Fix test failure. --- llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll index 1486cb7d7224a..dbd992ef4ff5e 100644 --- a/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll +++ b/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/faceforward.ll @@ -1,5 +1,7 @@ -; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan1.3 %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan1.3 %s -o - -filetype=obj | spirv-val --target-env vulkan1.3 %} +; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val --target-env spv1.4 %} + +; FIXME(#136344): Change --target-env to vulkan1.3 and update this test accordingly once the issue is resolved. ; Make sure SPIRV operation function calls for faceforward are lowered correctly. From 0cb18d0e774d70a780e9abb8a049422fb3555f58 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Wed, 14 May 2025 16:06:34 +0200 Subject: [PATCH 10/19] Address code review feedback. --- llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp | 6 +- llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp | 17 ++--- llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp | 5 +- .../Target/SPIRV/SPIRVInstructionSelector.cpp | 10 +-- llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp | 69 ++++--------------- .../Target/SPIRV/SPIRVPrepareFunctions.cpp | 14 +--- llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp | 22 ++---- llvm/lib/Target/SPIRV/SPIRVSubtarget.h | 21 +++--- llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp | 7 +- .../Target/SPIRV/SPIRVTargetTransformInfo.h | 2 +- 10 files changed, 42 insertions(+), 131 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp index 7c133af621a0d..520c366f42d48 100644 --- a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp @@ -533,11 +533,7 @@ void SPIRVAsmPrinter::outputExecutionMode(const Module &M) { Inst.addOperand(MCOperand::createImm(TypeCode)); outputMCInst(Inst); } - // FIXME: At the moment, `isOpenCLEnv()` is not precise enough. This is - // because the Triple is not always precise enough. For now, we'll rely - // instead on `isLogicalSPIRV()`, but this should be changed when - // `isOpenCLEnv()` is precise enough. - if (!ST->isLogicalSPIRV() && !M.getNamedMetadata("spirv.ExecutionMode") && + if (ST->isKernelEnv() && !M.getNamedMetadata("spirv.ExecutionMode") && !M.getNamedMetadata("opencl.enable.FP_CONTRACT")) { MCInst Inst; Inst.setOpcode(SPIRV::OpExecutionMode); diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp index 6e936bf0b5feb..df60a7e44e6ac 100644 --- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp @@ -267,15 +267,10 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx, static SPIRV::ExecutionModel::ExecutionModel getExecutionModel(const SPIRVSubtarget &STI, const Function &F) { - // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and - // `isVulkanEnv()` return true. This is because the Triple is not always - // precise enough. For now, we'll rely instead on `isLogicalSPIRV()`, but this - // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true - // at the same time. - if (STI.isOpenCLEnv()) + if (STI.isKernelEnv()) return SPIRV::ExecutionModel::Kernel; - if (STI.isVulkanEnv()) { + if (STI.isShaderEnv()) { auto attribute = F.getFnAttribute("hlsl.shader"); if (!attribute.isValid()) { report_fatal_error( @@ -291,18 +286,18 @@ getExecutionModel(const SPIRVSubtarget &STI, const Function &F) { } assert(STI.getEnv() == SPIRVSubtarget::Unknown); - // Can we rely on "hlsl.shader" attribute? Is it mandatory for Vulkan env? If - // so, we can set Env to Vulkan whenever we find it, and to OpenCL otherwise. + // "hlsl.shader" attribute is mandatory for Vulkan, so we can set Env to + // Shader whenever we find it, and to Kernel otherwise. // We will now change the Env based on the attribute, so we need to strip // `const` out of the ref to STI. SPIRVSubtarget *NonConstSTI = const_cast(&STI); auto attribute = F.getFnAttribute("hlsl.shader"); if (!attribute.isValid()) { - NonConstSTI->setEnv(SPIRVSubtarget::OpenCL); + NonConstSTI->setEnv(SPIRVSubtarget::Kernel); return SPIRV::ExecutionModel::Kernel; } - NonConstSTI->setEnv(SPIRVSubtarget::Vulkan); + NonConstSTI->setEnv(SPIRVSubtarget::Shader); const auto value = attribute.getValueAsString(); if (value == "compute") diff --git a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp index b8c8531d0b89a..e9a7f27db5097 100644 --- a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp @@ -767,10 +767,7 @@ Register SPIRVGlobalRegistry::buildGlobalVariable( // TODO: maybe move to GenerateDecorations pass. const SPIRVSubtarget &ST = cast(MIRBuilder.getMF().getSubtarget()); - // FIXME: Constant requires Kernel Capabilities, so we only emit it if we are - // in OpenCL env. However, that is not good enough at the moment, so we use - // `!isLogicalSPIRV()` instead. - if (IsConst && !ST.isLogicalSPIRV()) + if (IsConst && !ST.isShaderEnv()) buildOpDecorate(Reg, MIRBuilder, SPIRV::Decoration::Constant, {}); if (GVar && GVar->getAlign().valueOrOne().value() != 1) { diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp index 603113cc645c2..f7de4fe680c6f 100644 --- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp @@ -3722,10 +3722,7 @@ bool SPIRVInstructionSelector::selectAllocaArray(Register ResVReg, .addUse(GR.getSPIRVTypeID(ResType)) .addUse(I.getOperand(2).getReg()) .constrainAllUses(TII, TRI, RBI); - // FIXME: Alignment requires Kernel Capabilities, so we only emit it if we are - // in OpenCL env. However, that is not good enough at the moment, so we use - // `!isLogicalSPIRV()` instead. - if (!STI.isLogicalSPIRV()) { + if (!STI.isShaderEnv()) { unsigned Alignment = I.getOperand(3).getImm(); buildOpDecorate(ResVReg, I, TII, SPIRV::Decoration::Alignment, {Alignment}); } @@ -3744,10 +3741,7 @@ bool SPIRVInstructionSelector::selectFrameIndex(Register ResVReg, .addUse(GR.getSPIRVTypeID(ResType)) .addImm(static_cast(SPIRV::StorageClass::Function)) .constrainAllUses(TII, TRI, RBI); - // FIXME: Alignment requires Kernel Capabilities, so we only emit it if we are - // in OpenCL env. However, that is not good enough at the moment, so we use - // `!isLogicalSPIRV()` instead. - if (!STI.isLogicalSPIRV()) { + if (!STI.isShaderEnv()) { unsigned Alignment = I.getOperand(2).getImm(); buildOpDecorate(ResVReg, *It, TII, SPIRV::Decoration::Alignment, {Alignment}); diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp index 12e66cd6baae6..1f020ac31ba3b 100644 --- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp @@ -68,12 +68,7 @@ getSymbolicOperandRequirements(SPIRV::OperandCategory::OperandCategory Category, SPIRV::RequirementHandler &Reqs) { // A set of capabilities to avoid if there is another option. AvoidCapabilitiesSet AvoidCaps; - // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and - // `isVulkanEnv()` return true. This is because the Triple is not always - // precise enough. For now, we'll rely instead on `isLogicalSPIRV()`, but this - // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true - // at the same time. - if (!ST.isLogicalSPIRV()) + if (!ST.isShaderEnv()) AvoidCaps.S.insert(SPIRV::Capability::Shader); VersionTuple ReqMinVer = getSymbolicOperandMinVersion(Category, i); @@ -149,13 +144,8 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) { static_cast(getMetadataUInt(MemMD, 1)); } else { // TODO: Add support for VulkanMemoryModel. - // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and - // `isVulkanEnv()` return true. This is because the Triple is not always - // precise enough. For now, we'll rely instead on `isLogicalSPIRV()`, but - // this should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be - // true at the same time. - MAI.Mem = !ST->isLogicalSPIRV() ? SPIRV::MemoryModel::OpenCL - : SPIRV::MemoryModel::GLSL450; + MAI.Mem = !ST->isShaderEnv() ? SPIRV::MemoryModel::OpenCL + : SPIRV::MemoryModel::GLSL450; if (MAI.Mem == SPIRV::MemoryModel::OpenCL) { unsigned PtrSize = ST->getPointerSize(); MAI.Addr = PtrSize == 32 ? SPIRV::AddressingModel::Physical32 @@ -185,11 +175,7 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) { // OpenCL 1.0 by default for the OpenCL environment to avoid puzzling // run-times with Unknown/0.0 version output. For a reference, LLVM-SPIRV // Translator avoids potential issues with run-times in a similar manner. - // FIXME: At the moment, `isOpenCLEnv()` is not precise enough. This is - // because the Triple is not always precise enough. For now, we'll rely - // instead on `isLogicalSPIRV()`, but this should be changed when - // `isOpenCLEnv()` is precise enough. - if (!ST->isLogicalSPIRV()) { + if (!ST->isShaderEnv()) { MAI.SrcLang = SPIRV::SourceLanguage::OpenCL_CPP; MAI.SrcLangVersion = 100000; } else { @@ -217,12 +203,7 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) { MAI.Reqs.getAndAddRequirements(SPIRV::OperandCategory::AddressingModelOperand, MAI.Addr, *ST); - // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and - // `isVulkanEnv()` return true. This is because the Triple is not always - // precise enough. For now, we'll rely instead on `isLogicalSPIRV()`, but this - // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true - // at the same time. - if (!ST->isLogicalSPIRV()) { + if (!ST->isShaderEnv()) { // TODO: check if it's required by default. MAI.ExtInstSetMap[static_cast( SPIRV::InstructionSet::OpenCL_std)] = MAI.getNextIDRegister(); @@ -823,17 +804,12 @@ void RequirementHandler::initAvailableCapabilities(const SPIRVSubtarget &ST) { addAvailableCaps(EnabledCapabilities); } - // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and - // `isVulkanEnv()` return true. This is because the Triple is not always - // precise enough. For now, we'll rely instead on `isLogicalSPIRV`, but this - // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true - // at the same time. - if (!ST.isLogicalSPIRV()) { + if (!ST.isShaderEnv()) { initAvailableCapabilitiesForOpenCL(ST); return; } - if (ST.isLogicalSPIRV()) { + if (ST.isShaderEnv()) { initAvailableCapabilitiesForVulkan(ST); return; } @@ -993,12 +969,7 @@ static void addOpTypeImageReqs(const MachineInstr &MI, } // Has optional access qualifier. - // FIXME: ImageBasic/ImageReadWrite capabilities require Kernel capability. - // However, for now, both `isVulkanEnv()` and `isOpenCLEnv()` can return - // true under some circumstances. Instead, we're using `isLogicalSPIRV()`, - // but we should change this when `isVulkanEnv()` and `isOpenCLEnv()` are - // precise enough. - if (!ST.isLogicalSPIRV()) { + if (!ST.isShaderEnv()) { if (MI.getNumOperands() > 8 && MI.getOperand(8).getImm() == SPIRV::AccessQualifier::ReadWrite) Reqs.addRequirements(SPIRV::Capability::ImageReadWrite); @@ -1296,12 +1267,7 @@ void addInstrRequirements(const MachineInstr &MI, ST); // If it's a type of pointer to float16 targeting OpenCL, add Float16Buffer // capability. - // FIXME: Float16Buffer capability requires Kernel capability. However, - // for now, both `isVulkanEnv()` and `isOpenCLEnv()` can return true under - // some circumstances. Instead, we're using `isLogicalSPIRV()`, but we - // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are precise - // enough. - if (ST.isLogicalSPIRV()) + if (ST.isShaderEnv()) break; assert(MI.getOperand(2).isReg()); const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo(); @@ -1376,12 +1342,7 @@ void addInstrRequirements(const MachineInstr &MI, addOpTypeImageReqs(MI, Reqs, ST); break; case SPIRV::OpTypeSampler: - // FIXME: ImageBasic capability requires Kernel capability. However, for - // now, both `isVulkanEnv()` and `isOpenCLEnv()` can return true under - // some circumstances. Instead, we're using `isLogicalSPIRV()`, but - // we should change this when `isVulkanEnv()` and `isOpenCLEnv()` are - // precise enough. - if (!ST.isLogicalSPIRV()) { + if (!ST.isShaderEnv()) { Reqs.addCapability(SPIRV::Capability::ImageBasic); } break; @@ -1809,10 +1770,7 @@ void addInstrRequirements(const MachineInstr &MI, // StorageImageReadWithoutFormat/StorageImageWriteWithoutFormat, see // https://github.com/KhronosGroup/SPIRV-Headers/issues/487 - // FIXME: For now, `isOpenCLEnv()` is not precise enough. Instead, we're - // using `isLogicalSPIRV()`, but we should change this when `isOpenCLEnv()` - // is precise enough. - if (isImageTypeWithUnknownFormat(TypeDef) && ST.isLogicalSPIRV()) + if (isImageTypeWithUnknownFormat(TypeDef) && ST.isShaderEnv()) Reqs.addCapability(SPIRV::Capability::StorageImageReadWithoutFormat); break; } @@ -1826,10 +1784,7 @@ void addInstrRequirements(const MachineInstr &MI, // StorageImageReadWithoutFormat/StorageImageWriteWithoutFormat, see // https://github.com/KhronosGroup/SPIRV-Headers/issues/487 - // FIXME: For now, `isOpenCLEnv()` is not precise enough. Instead, we're - // using `isLogicalSPIRV()`, but we should change this when `isOpenCLEnv()` - // is precise enough. - if (isImageTypeWithUnknownFormat(TypeDef) && ST.isLogicalSPIRV()) + if (isImageTypeWithUnknownFormat(TypeDef) && ST.isShaderEnv()) Reqs.addCapability(SPIRV::Capability::StorageImageWriteWithoutFormat); break; } diff --git a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp index ce1cfaee3b02e..c1c47d2b5d8ca 100644 --- a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp @@ -405,23 +405,13 @@ bool SPIRVPrepareFunctions::substituteIntrinsicCalls(Function *F) { Changed = true; break; case Intrinsic::lifetime_start: - // FIXME: OpLifetimeStart requires Kernel capability. However, for now, - // both `isVulkanEnv()` and `isOpenCLEnv()` can return true under some - // circumstances. Instead, we're using `isLogicalSPIRV()`, but we - // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are - // precise enough. - if (!STI.isLogicalSPIRV()) { + if (!STI.isShaderEnv()) { Changed |= toSpvOverloadedIntrinsic( II, Intrinsic::SPVIntrinsics::spv_lifetime_start, {1}); } break; case Intrinsic::lifetime_end: - // FIXME: OpLifetimeStop requires Kernel capability. However, for now, - // both `isVulkanEnv()` and `isOpenCLEnv()` can return true under some - // circumstances. Instead, we're using `isLogicalSPIRV()`, but we - // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are - // precise enough. - if (!STI.isLogicalSPIRV()) { + if (!STI.isShaderEnv()) { Changed |= toSpvOverloadedIntrinsic( II, Intrinsic::SPVIntrinsics::spv_lifetime_end, {1}); } diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp index 9038542ff47a6..1a8215311a619 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp @@ -85,9 +85,9 @@ SPIRVSubtarget::SPIRVSubtarget(const Triple &TT, const std::string &CPU, // Set the environment based on the target triple. if (TargetTriple.getOS() == Triple::Vulkan) - Env = Vulkan; + Env = Shader; else if (TargetTriple.getEnvironment() == Triple::OpenCL) - Env = OpenCL; + Env = Kernel; else Env = Unknown; @@ -120,11 +120,7 @@ bool SPIRVSubtarget::canUseExtInstSet( SPIRV::InstructionSet::InstructionSet SPIRVSubtarget::getPreferredInstructionSet() const { - // FIXME: For now, both `isVulkanEnv()` and `isOpenCLEnv()` can return true - // under some circumstances. Instead, we're using `isLogicalSPIRV()`, but we - // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are precise - // enough. - if (!isLogicalSPIRV()) + if (!isShaderEnv()) return SPIRV::InstructionSet::OpenCL_std; else return SPIRV::InstructionSet::GLSL_std_450; @@ -135,11 +131,7 @@ bool SPIRVSubtarget::isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const { } bool SPIRVSubtarget::isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const { - // FIXME: For now, both `isVulkanEnv()` and `isOpenCLEnv()` can return true - // under some circumstances. Instead, we're using `isLogicalSPIRV()`, but we - // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are precise - // enough. - if (isLogicalSPIRV()) + if (isShaderEnv()) return false; return isAtLeastVer(OpenCLVersion, VerToCompareTo); } @@ -162,11 +154,7 @@ void SPIRVSubtarget::accountForAMDShaderTrinaryMinmax() { // Must have called initAvailableExtensions first. void SPIRVSubtarget::initAvailableExtInstSets() { AvailableExtInstSets.clear(); - // FIXME: For now, both `isVulkanEnv()` and `isOpenCLEnv()` can return true - // under some circumstances. Instead, we're using `isLogicalSPIRV()`, but we - // should change this when `isVulkanEnv()` and `isOpenCLEnv()` are precise - // enough. - if (isLogicalSPIRV()) + if (isShaderEnv()) AvailableExtInstSets.insert(SPIRV::InstructionSet::GLSL_std_450); else AvailableExtInstSets.insert(SPIRV::InstructionSet::OpenCL_std); diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h index 6101ed6c71b4b..c84d42f4b07ce 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h @@ -37,8 +37,8 @@ class SPIRVTargetMachine; class SPIRVSubtarget : public SPIRVGenSubtargetInfo { public: - // Enum for the SPIR-V environment: OpenCL, Vulkan or Unkwnown. - enum SPIRVEnvType { OpenCL, Vulkan, Unknown }; + // Enum for the SPIR-V environment: Kernel, Shader or Unkwnown. + enum SPIRVEnvType { Kernel, Shader, Unknown }; private: const unsigned PointerSize; @@ -90,14 +90,15 @@ class SPIRVSubtarget : public SPIRVGenSubtargetInfo { Env = E; } SPIRVEnvType getEnv() const { return Env; } - bool isOpenCLEnv() const { return getEnv() == OpenCL; } - bool isVulkanEnv() const { return getEnv() == Vulkan; } - // FIXME: This should check the triple arch instead, but a lot of places use - // this method now instead of `is[OpenCL/Vulkan]Env()`, and this is a - // shortcut to make sure `is[OpenCL/Vulkan]Env()` works as expected. When we - // change back all uses of `isLogicalSPIRV()` to `is[OpenCL/Vulkan]Env()`, we - // can implement this correctly again. - bool isLogicalSPIRV() const { return isVulkanEnv(); } + bool isKernelEnv() const { return getEnv() == Kernel; } + bool isShaderEnv() const { return getEnv() == Shader; } + bool isLogicalSPIRV() const { + return TargetTriple.getArch() == Triple::spirv; + } + bool isPhysicalSPIRV() const { + return TargetTriple.getArch() == Triple::spirv32 || + TargetTriple.getArch() == Triple::spirv64; + } const std::string &getTargetTripleAsStr() const { return TargetTriple.str(); } VersionTuple getSPIRVVersion() const { return SPIRVVersion; }; bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const; diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp index 8793227db3e0d..2d831aa71cf77 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp @@ -191,12 +191,7 @@ TargetPassConfig *SPIRVTargetMachine::createPassConfig(PassManagerBase &PM) { void SPIRVPassConfig::addIRPasses() { TargetPassConfig::addIRPasses(); - // FIXME: At the moment, there's a possibility that both `isOpenCLEnv()` and - // `isVulkanEnv()` return true. This is because the Triple is not always - // precise enough. For now, we'll rely instead on `isLogicalSPIRV`, but this - // should be changed when `isOpenCLEnv()` and `isVulkanEnv()` cannot be true - // at the same time. - if (TM.getSubtargetImpl()->isLogicalSPIRV()) { + if (TM.getSubtargetImpl()->isShaderEnv()) { // Vulkan does not allow address space casts. This pass is run to remove // address space casts that can be removed. // If an address space cast is not removed while targeting Vulkan, lowering diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetTransformInfo.h b/llvm/lib/Target/SPIRV/SPIRVTargetTransformInfo.h index 911c9a19a8d1d..585a3606ee87b 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetTransformInfo.h +++ b/llvm/lib/Target/SPIRV/SPIRVTargetTransformInfo.h @@ -50,7 +50,7 @@ class SPIRVTTIImpl : public BasicTTIImplBase { } unsigned getFlatAddressSpace() const override { - if (ST->isVulkanEnv()) + if (ST->isShaderEnv()) return 0; // FIXME: Clang has 2 distinct address space maps. One where // default=4=Generic, and one with default=0=Function. This depends on the From 7a0be57357fbbf85fa86f2588457c691efae5c29 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Wed, 14 May 2025 16:58:56 +0200 Subject: [PATCH 11/19] Fix build issues. --- llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp | 2 +- llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp index b09528a3ad0e2..87b2367c3b2fa 100644 --- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp @@ -342,7 +342,7 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder, buildOpDecorate(VRegs[i][0], MIRBuilder, SPIRV::Decoration::MaxByteOffset, {DerefBytes}); } - if (Arg.hasAttribute(Attribute::Alignment) && !ST->isVulkanEnv()) { + if (Arg.hasAttribute(Attribute::Alignment) && !ST->isShaderEnv()) { auto Alignment = static_cast( Arg.getAttribute(Attribute::Alignment).getValueAsInt()); buildOpDecorate(VRegs[i][0], MIRBuilder, SPIRV::Decoration::Alignment, diff --git a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp index 6b1c3c1dec67b..c0b4af21e6006 100644 --- a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp @@ -770,7 +770,7 @@ Register SPIRVGlobalRegistry::buildGlobalVariable( if (IsConst && !ST.isShaderEnv()) buildOpDecorate(Reg, MIRBuilder, SPIRV::Decoration::Constant, {}); - if (GVar && GVar->getAlign().valueOrOne().value() != 1 && !ST.isVulkanEnv()) { + if (GVar && GVar->getAlign().valueOrOne().value() != 1 && !ST.isShaderEnv()) { unsigned Alignment = (unsigned)GVar->getAlign().valueOrOne().value(); buildOpDecorate(Reg, MIRBuilder, SPIRV::Decoration::Alignment, {Alignment}); } @@ -982,7 +982,7 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeStruct( Register ResVReg = createTypeVReg(MIRBuilder); if (Ty->hasName()) buildOpName(ResVReg, Ty->getName(), MIRBuilder); - if (Ty->isPacked() && !ST.isVulkanEnv()) + if (Ty->isPacked() && !ST.isShaderEnv()) buildOpDecorate(ResVReg, MIRBuilder, SPIRV::Decoration::CPacked, {}); SPIRVType *SPVType = From 70835b980eb51115dc4489d23f951d0c78f5706f Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Wed, 14 May 2025 20:52:47 +0200 Subject: [PATCH 12/19] Fix typo. --- llvm/lib/Target/SPIRV/SPIRVSubtarget.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h index c84d42f4b07ce..dbd5c935aa923 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h @@ -37,7 +37,7 @@ class SPIRVTargetMachine; class SPIRVSubtarget : public SPIRVGenSubtargetInfo { public: - // Enum for the SPIR-V environment: Kernel, Shader or Unkwnown. + // Enum for the SPIR-V environment: Kernel, Shader or Unknown. enum SPIRVEnvType { Kernel, Shader, Unknown }; private: From afa72c130eab40d194d791d4bd2e47e085a832ab Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Wed, 14 May 2025 21:10:47 +0200 Subject: [PATCH 13/19] Fix test failure. --- llvm/test/CodeGen/SPIRV/global-var-name-align.ll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/test/CodeGen/SPIRV/global-var-name-align.ll b/llvm/test/CodeGen/SPIRV/global-var-name-align.ll index d73c98e55b872..173c3dc608e58 100644 --- a/llvm/test/CodeGen/SPIRV/global-var-name-align.ll +++ b/llvm/test/CodeGen/SPIRV/global-var-name-align.ll @@ -6,8 +6,8 @@ ; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s -check-prefixes=CHECK,OCL ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} -; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -check-prefixes=CHECK,VK -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s -check-prefixes=CHECK,VK +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} ; CHECK-DAG: OpName %[[#id18:]] "G1" ; CHECK-DAG: OpName %[[#id22:]] "g1" From 85d600f1819930a4ecd43bdecb27c7c7c35fd806 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Thu, 15 May 2025 11:34:46 +0200 Subject: [PATCH 14/19] Fix test failure. --- llvm/test/CodeGen/SPIRV/OpVariable_order.ll | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/llvm/test/CodeGen/SPIRV/OpVariable_order.ll b/llvm/test/CodeGen/SPIRV/OpVariable_order.ll index c68250697c4a7..1e94be0886307 100644 --- a/llvm/test/CodeGen/SPIRV/OpVariable_order.ll +++ b/llvm/test/CodeGen/SPIRV/OpVariable_order.ll @@ -10,12 +10,10 @@ ; CHECK-SPIRV: OpReturn ; CHECK-SPIRV: OpFunctionEnd -define void @main() #1 { +define void @main() { entry: %0 = alloca <2 x i32>, align 4 %1 = getelementptr <2 x i32>, ptr %0, i32 0, i32 0 %2 = alloca float, align 4 ret void } - -attributes #1 = { "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" } From 61f2abdac4eb3abde1793b466d77bb521b0e6de5 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Tue, 27 May 2025 17:31:21 +0200 Subject: [PATCH 15/19] Address code review feedback. --- .../Target/SPIRV/SPIRVInstructionSelector.cpp | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp index e2c07ed48367f..7c013ddc66803 100644 --- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp @@ -1034,7 +1034,7 @@ bool SPIRVInstructionSelector::selectUnOp(Register ResVReg, const SPIRVType *ResType, MachineInstr &I, unsigned Opcode) const { - if (!STI.isLogicalSPIRV() && I.getOperand(1).isReg()) { + if (STI.isPhysicalSPIRV() && I.getOperand(1).isReg()) { Register SrcReg = I.getOperand(1).getReg(); bool IsGV = false; for (MachineRegisterInfo::def_instr_iterator DefIt = @@ -2062,7 +2062,7 @@ bool SPIRVInstructionSelector::selectDot4AddPackedExpansion( auto ExtractOp = Signed ? SPIRV::OpBitFieldSExtract : SPIRV::OpBitFieldUExtract; - bool ZeroAsNull = !STI.isLogicalSPIRV(); + bool ZeroAsNull = !STI.isShaderEnv(); // Extract the i8 element, multiply and add it to the accumulator for (unsigned i = 0; i < 4; i++) { // A[i] @@ -2203,7 +2203,7 @@ bool SPIRVInstructionSelector::selectWaveOpInst(Register ResVReg, .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType)) .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, TII, - !STI.isLogicalSPIRV())); + !STI.isShaderEnv())); for (unsigned J = 2; J < I.getNumOperands(); J++) { BMI.addUse(I.getOperand(J).getReg()); @@ -2227,7 +2227,7 @@ bool SPIRVInstructionSelector::selectWaveActiveCountBits( .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType)) .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, - TII, !STI.isLogicalSPIRV())) + TII, !STI.isShaderEnv())) .addImm(SPIRV::GroupOperation::Reduce) .addUse(BallotReg) .constrainAllUses(TII, TRI, RBI); @@ -2258,7 +2258,7 @@ bool SPIRVInstructionSelector::selectWaveReduceMax(Register ResVReg, .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType)) .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, TII, - !STI.isLogicalSPIRV())) + !STI.isShaderEnv())) .addImm(SPIRV::GroupOperation::Reduce) .addUse(I.getOperand(2).getReg()) .constrainAllUses(TII, TRI, RBI); @@ -2285,7 +2285,7 @@ bool SPIRVInstructionSelector::selectWaveReduceSum(Register ResVReg, .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType)) .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, TII, - !STI.isLogicalSPIRV())) + !STI.isShaderEnv())) .addImm(SPIRV::GroupOperation::Reduce) .addUse(I.getOperand(2).getReg()); } @@ -2507,7 +2507,7 @@ bool SPIRVInstructionSelector::selectFCmp(Register ResVReg, Register SPIRVInstructionSelector::buildZerosVal(const SPIRVType *ResType, MachineInstr &I) const { // OpenCL uses nulls for Zero. In HLSL we don't use null constants. - bool ZeroAsNull = !STI.isLogicalSPIRV(); + bool ZeroAsNull = !STI.isShaderEnv(); if (ResType->getOpcode() == SPIRV::OpTypeVector) return GR.getOrCreateConstVector(0UL, I, ResType, TII, ZeroAsNull); return GR.getOrCreateConstInt(0, I, ResType, TII, ZeroAsNull); @@ -2516,7 +2516,7 @@ Register SPIRVInstructionSelector::buildZerosVal(const SPIRVType *ResType, Register SPIRVInstructionSelector::buildZerosValF(const SPIRVType *ResType, MachineInstr &I) const { // OpenCL uses nulls for Zero. In HLSL we don't use null constants. - bool ZeroAsNull = !STI.isLogicalSPIRV(); + bool ZeroAsNull = !STI.isShaderEnv(); APFloat VZero = getZeroFP(GR.getTypeForSPIRVType(ResType)); if (ResType->getOpcode() == SPIRV::OpTypeVector) return GR.getOrCreateConstVector(VZero, I, ResType, TII, ZeroAsNull); @@ -2526,7 +2526,7 @@ Register SPIRVInstructionSelector::buildZerosValF(const SPIRVType *ResType, Register SPIRVInstructionSelector::buildOnesValF(const SPIRVType *ResType, MachineInstr &I) const { // OpenCL uses nulls for Zero. In HLSL we don't use null constants. - bool ZeroAsNull = !STI.isLogicalSPIRV(); + bool ZeroAsNull = !STI.isShaderEnv(); APFloat VOne = getOneFP(GR.getTypeForSPIRVType(ResType)); if (ResType->getOpcode() == SPIRV::OpTypeVector) return GR.getOrCreateConstVector(VOne, I, ResType, TII, ZeroAsNull); @@ -2714,10 +2714,10 @@ bool SPIRVInstructionSelector::selectConst(Register ResVReg, Reg = GR.getOrCreateConstNullPtr(MIRBuilder, ResType); } else if (Opcode == TargetOpcode::G_FCONSTANT) { Reg = GR.getOrCreateConstFP(I.getOperand(1).getFPImm()->getValue(), I, - ResType, TII, !STI.isLogicalSPIRV()); + ResType, TII, !STI.isShaderEnv()); } else { Reg = GR.getOrCreateConstInt(I.getOperand(1).getCImm()->getZExtValue(), I, - ResType, TII, !STI.isLogicalSPIRV()); + ResType, TII, !STI.isShaderEnv()); } return Reg == ResVReg ? true : BuildCOPY(ResVReg, Reg, I); } @@ -3494,7 +3494,7 @@ bool SPIRVInstructionSelector::selectFirstBitSet64Overflow( // On odd component counts we need to handle one more component if (CurrentComponent != ComponentCount) { - bool ZeroAsNull = !STI.isLogicalSPIRV(); + bool ZeroAsNull = !STI.isShaderEnv(); Register FinalElemReg = MRI->createVirtualRegister(GR.getRegClass(I64Type)); Register ConstIntLastIdx = GR.getOrCreateConstInt( ComponentCount - 1, I, BaseType, TII, ZeroAsNull); @@ -3524,7 +3524,7 @@ bool SPIRVInstructionSelector::selectFirstBitSet64( Register SrcReg, unsigned BitSetOpcode, bool SwapPrimarySide) const { unsigned ComponentCount = GR.getScalarOrVectorComponentCount(ResType); SPIRVType *BaseType = GR.retrieveScalarOrVectorIntType(ResType); - bool ZeroAsNull = !STI.isLogicalSPIRV(); + bool ZeroAsNull = !STI.isShaderEnv(); Register ConstIntZero = GR.getOrCreateConstInt(0, I, BaseType, TII, ZeroAsNull); Register ConstIntOne = From a36faa4ad1afe042daad5fc19be8727812edec37 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Wed, 28 May 2025 15:31:31 +0200 Subject: [PATCH 16/19] Address more code review feedback. --- llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp | 4 ++-- llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp index 70913cf215ca0..08877ac7fbe73 100644 --- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp @@ -144,8 +144,8 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) { static_cast(getMetadataUInt(MemMD, 1)); } else { // TODO: Add support for VulkanMemoryModel. - MAI.Mem = !ST->isShaderEnv() ? SPIRV::MemoryModel::OpenCL - : SPIRV::MemoryModel::GLSL450; + MAI.Mem = ST->isShaderEnv() ? SPIRV::MemoryModel::GLSL450 + : SPIRV::MemoryModel::OpenCL; if (MAI.Mem == SPIRV::MemoryModel::OpenCL) { unsigned PtrSize = ST->getPointerSize(); MAI.Addr = PtrSize == 32 ? SPIRV::AddressingModel::Physical32 diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp index db0a7e232c7df..58eb67ff5f7b8 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp @@ -119,10 +119,10 @@ bool SPIRVSubtarget::canUseExtInstSet( SPIRV::InstructionSet::InstructionSet SPIRVSubtarget::getPreferredInstructionSet() const { - if (!isShaderEnv()) - return SPIRV::InstructionSet::OpenCL_std; - else + if (isShaderEnv()) return SPIRV::InstructionSet::GLSL_std_450; + else + return SPIRV::InstructionSet::OpenCL_std; } bool SPIRVSubtarget::isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const { From fcc219ad79d42bb18ccac358792d5793a76792e0 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Wed, 28 May 2025 15:36:19 +0200 Subject: [PATCH 17/19] Turn assertion into fatal error. --- llvm/lib/Target/SPIRV/SPIRVSubtarget.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h index dbd5c935aa923..0071861364dc7 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h @@ -84,8 +84,10 @@ class SPIRVSubtarget : public SPIRVGenSubtargetInfo { unsigned getBound() const { return GR->getBound(); } bool canDirectlyComparePointers() const; void setEnv(SPIRVEnvType E) { - assert(E != Unknown && "Unknown environment is not allowed"); - assert(Env == Unknown && "Environment is already set"); + if (E == Unknown) + report_fatal_error("Unknown environment is not allowed."); + if (Env != Unknown) + report_fatal_error("Environment is already set."); Env = E; } From 42df23dbcdde2ca42448aa665f17defdd71e0dd4 Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Fri, 30 May 2025 13:02:54 +0200 Subject: [PATCH 18/19] Replace is[Kernel|Shader]Env with is[Kernel|Shader]. --- llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp | 2 +- llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp | 6 +-- llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp | 6 +-- .../Target/SPIRV/SPIRVInstructionSelector.cpp | 37 +++++++++---------- llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp | 24 ++++++------ .../Target/SPIRV/SPIRVPrepareFunctions.cpp | 4 +- llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp | 6 +-- llvm/lib/Target/SPIRV/SPIRVSubtarget.h | 4 +- llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp | 2 +- .../Target/SPIRV/SPIRVTargetTransformInfo.h | 2 +- 10 files changed, 46 insertions(+), 47 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp index c31f3ff62f693..d4becc2865049 100644 --- a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp @@ -532,7 +532,7 @@ void SPIRVAsmPrinter::outputExecutionMode(const Module &M) { Inst.addOperand(MCOperand::createImm(TypeCode)); outputMCInst(Inst); } - if (ST->isKernelEnv() && !M.getNamedMetadata("spirv.ExecutionMode") && + if (ST->isKernel() && !M.getNamedMetadata("spirv.ExecutionMode") && !M.getNamedMetadata("opencl.enable.FP_CONTRACT")) { MCInst Inst; Inst.setOpcode(SPIRV::OpExecutionMode); diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp index 87b2367c3b2fa..17be86db54062 100644 --- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp @@ -267,10 +267,10 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx, static SPIRV::ExecutionModel::ExecutionModel getExecutionModel(const SPIRVSubtarget &STI, const Function &F) { - if (STI.isKernelEnv()) + if (STI.isKernel()) return SPIRV::ExecutionModel::Kernel; - if (STI.isShaderEnv()) { + if (STI.isShader()) { auto attribute = F.getFnAttribute("hlsl.shader"); if (!attribute.isValid()) { report_fatal_error( @@ -342,7 +342,7 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder, buildOpDecorate(VRegs[i][0], MIRBuilder, SPIRV::Decoration::MaxByteOffset, {DerefBytes}); } - if (Arg.hasAttribute(Attribute::Alignment) && !ST->isShaderEnv()) { + if (Arg.hasAttribute(Attribute::Alignment) && !ST->isShader()) { auto Alignment = static_cast( Arg.getAttribute(Attribute::Alignment).getValueAsInt()); buildOpDecorate(VRegs[i][0], MIRBuilder, SPIRV::Decoration::Alignment, diff --git a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp index 8e1a8fb35d36f..29eb37c47150a 100644 --- a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp @@ -772,10 +772,10 @@ Register SPIRVGlobalRegistry::buildGlobalVariable( // TODO: maybe move to GenerateDecorations pass. const SPIRVSubtarget &ST = cast(MIRBuilder.getMF().getSubtarget()); - if (IsConst && !ST.isShaderEnv()) + if (IsConst && !ST.isShader()) buildOpDecorate(Reg, MIRBuilder, SPIRV::Decoration::Constant, {}); - if (GVar && GVar->getAlign().valueOrOne().value() != 1 && !ST.isShaderEnv()) { + if (GVar && GVar->getAlign().valueOrOne().value() != 1 && !ST.isShader()) { unsigned Alignment = (unsigned)GVar->getAlign().valueOrOne().value(); buildOpDecorate(Reg, MIRBuilder, SPIRV::Decoration::Alignment, {Alignment}); } @@ -987,7 +987,7 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeStruct( Register ResVReg = createTypeVReg(MIRBuilder); if (Ty->hasName()) buildOpName(ResVReg, Ty->getName(), MIRBuilder); - if (Ty->isPacked() && !ST.isShaderEnv()) + if (Ty->isPacked() && !ST.isShader()) buildOpDecorate(ResVReg, MIRBuilder, SPIRV::Decoration::CPacked, {}); SPIRVType *SPVType = diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp index 7c013ddc66803..2dae0721886c7 100644 --- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp @@ -2062,7 +2062,7 @@ bool SPIRVInstructionSelector::selectDot4AddPackedExpansion( auto ExtractOp = Signed ? SPIRV::OpBitFieldSExtract : SPIRV::OpBitFieldUExtract; - bool ZeroAsNull = !STI.isShaderEnv(); + bool ZeroAsNull = !STI.isShader(); // Extract the i8 element, multiply and add it to the accumulator for (unsigned i = 0; i < 4; i++) { // A[i] @@ -2198,12 +2198,11 @@ bool SPIRVInstructionSelector::selectWaveOpInst(Register ResVReg, MachineBasicBlock &BB = *I.getParent(); SPIRVType *IntTy = GR.getOrCreateSPIRVIntegerType(32, I, TII); - auto BMI = - BuildMI(BB, I, I.getDebugLoc(), TII.get(Opcode)) - .addDef(ResVReg) - .addUse(GR.getSPIRVTypeID(ResType)) - .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, TII, - !STI.isShaderEnv())); + auto BMI = BuildMI(BB, I, I.getDebugLoc(), TII.get(Opcode)) + .addDef(ResVReg) + .addUse(GR.getSPIRVTypeID(ResType)) + .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, + IntTy, TII, !STI.isShader())); for (unsigned J = 2; J < I.getNumOperands(); J++) { BMI.addUse(I.getOperand(J).getReg()); @@ -2227,7 +2226,7 @@ bool SPIRVInstructionSelector::selectWaveActiveCountBits( .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType)) .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, - TII, !STI.isShaderEnv())) + TII, !STI.isShader())) .addImm(SPIRV::GroupOperation::Reduce) .addUse(BallotReg) .constrainAllUses(TII, TRI, RBI); @@ -2258,7 +2257,7 @@ bool SPIRVInstructionSelector::selectWaveReduceMax(Register ResVReg, .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType)) .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, TII, - !STI.isShaderEnv())) + !STI.isShader())) .addImm(SPIRV::GroupOperation::Reduce) .addUse(I.getOperand(2).getReg()) .constrainAllUses(TII, TRI, RBI); @@ -2285,7 +2284,7 @@ bool SPIRVInstructionSelector::selectWaveReduceSum(Register ResVReg, .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType)) .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, TII, - !STI.isShaderEnv())) + !STI.isShader())) .addImm(SPIRV::GroupOperation::Reduce) .addUse(I.getOperand(2).getReg()); } @@ -2507,7 +2506,7 @@ bool SPIRVInstructionSelector::selectFCmp(Register ResVReg, Register SPIRVInstructionSelector::buildZerosVal(const SPIRVType *ResType, MachineInstr &I) const { // OpenCL uses nulls for Zero. In HLSL we don't use null constants. - bool ZeroAsNull = !STI.isShaderEnv(); + bool ZeroAsNull = !STI.isShader(); if (ResType->getOpcode() == SPIRV::OpTypeVector) return GR.getOrCreateConstVector(0UL, I, ResType, TII, ZeroAsNull); return GR.getOrCreateConstInt(0, I, ResType, TII, ZeroAsNull); @@ -2516,7 +2515,7 @@ Register SPIRVInstructionSelector::buildZerosVal(const SPIRVType *ResType, Register SPIRVInstructionSelector::buildZerosValF(const SPIRVType *ResType, MachineInstr &I) const { // OpenCL uses nulls for Zero. In HLSL we don't use null constants. - bool ZeroAsNull = !STI.isShaderEnv(); + bool ZeroAsNull = !STI.isShader(); APFloat VZero = getZeroFP(GR.getTypeForSPIRVType(ResType)); if (ResType->getOpcode() == SPIRV::OpTypeVector) return GR.getOrCreateConstVector(VZero, I, ResType, TII, ZeroAsNull); @@ -2526,7 +2525,7 @@ Register SPIRVInstructionSelector::buildZerosValF(const SPIRVType *ResType, Register SPIRVInstructionSelector::buildOnesValF(const SPIRVType *ResType, MachineInstr &I) const { // OpenCL uses nulls for Zero. In HLSL we don't use null constants. - bool ZeroAsNull = !STI.isShaderEnv(); + bool ZeroAsNull = !STI.isShader(); APFloat VOne = getOneFP(GR.getTypeForSPIRVType(ResType)); if (ResType->getOpcode() == SPIRV::OpTypeVector) return GR.getOrCreateConstVector(VOne, I, ResType, TII, ZeroAsNull); @@ -2714,10 +2713,10 @@ bool SPIRVInstructionSelector::selectConst(Register ResVReg, Reg = GR.getOrCreateConstNullPtr(MIRBuilder, ResType); } else if (Opcode == TargetOpcode::G_FCONSTANT) { Reg = GR.getOrCreateConstFP(I.getOperand(1).getFPImm()->getValue(), I, - ResType, TII, !STI.isShaderEnv()); + ResType, TII, !STI.isShader()); } else { Reg = GR.getOrCreateConstInt(I.getOperand(1).getCImm()->getZExtValue(), I, - ResType, TII, !STI.isShaderEnv()); + ResType, TII, !STI.isShader()); } return Reg == ResVReg ? true : BuildCOPY(ResVReg, Reg, I); } @@ -3494,7 +3493,7 @@ bool SPIRVInstructionSelector::selectFirstBitSet64Overflow( // On odd component counts we need to handle one more component if (CurrentComponent != ComponentCount) { - bool ZeroAsNull = !STI.isShaderEnv(); + bool ZeroAsNull = !STI.isShader(); Register FinalElemReg = MRI->createVirtualRegister(GR.getRegClass(I64Type)); Register ConstIntLastIdx = GR.getOrCreateConstInt( ComponentCount - 1, I, BaseType, TII, ZeroAsNull); @@ -3524,7 +3523,7 @@ bool SPIRVInstructionSelector::selectFirstBitSet64( Register SrcReg, unsigned BitSetOpcode, bool SwapPrimarySide) const { unsigned ComponentCount = GR.getScalarOrVectorComponentCount(ResType); SPIRVType *BaseType = GR.retrieveScalarOrVectorIntType(ResType); - bool ZeroAsNull = !STI.isShaderEnv(); + bool ZeroAsNull = !STI.isShader(); Register ConstIntZero = GR.getOrCreateConstInt(0, I, BaseType, TII, ZeroAsNull); Register ConstIntOne = @@ -3726,7 +3725,7 @@ bool SPIRVInstructionSelector::selectAllocaArray(Register ResVReg, .addUse(GR.getSPIRVTypeID(ResType)) .addUse(I.getOperand(2).getReg()) .constrainAllUses(TII, TRI, RBI); - if (!STI.isShaderEnv()) { + if (!STI.isShader()) { unsigned Alignment = I.getOperand(3).getImm(); buildOpDecorate(ResVReg, I, TII, SPIRV::Decoration::Alignment, {Alignment}); } @@ -3745,7 +3744,7 @@ bool SPIRVInstructionSelector::selectFrameIndex(Register ResVReg, .addUse(GR.getSPIRVTypeID(ResType)) .addImm(static_cast(SPIRV::StorageClass::Function)) .constrainAllUses(TII, TRI, RBI); - if (!STI.isShaderEnv()) { + if (!STI.isShader()) { unsigned Alignment = I.getOperand(2).getImm(); buildOpDecorate(ResVReg, *It, TII, SPIRV::Decoration::Alignment, {Alignment}); diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp index 08877ac7fbe73..b71a9dd68dd44 100644 --- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp @@ -68,7 +68,7 @@ getSymbolicOperandRequirements(SPIRV::OperandCategory::OperandCategory Category, SPIRV::RequirementHandler &Reqs) { // A set of capabilities to avoid if there is another option. AvoidCapabilitiesSet AvoidCaps; - if (!ST.isShaderEnv()) + if (!ST.isShader()) AvoidCaps.S.insert(SPIRV::Capability::Shader); VersionTuple ReqMinVer = getSymbolicOperandMinVersion(Category, i); @@ -144,8 +144,8 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) { static_cast(getMetadataUInt(MemMD, 1)); } else { // TODO: Add support for VulkanMemoryModel. - MAI.Mem = ST->isShaderEnv() ? SPIRV::MemoryModel::GLSL450 - : SPIRV::MemoryModel::OpenCL; + MAI.Mem = ST->isShader() ? SPIRV::MemoryModel::GLSL450 + : SPIRV::MemoryModel::OpenCL; if (MAI.Mem == SPIRV::MemoryModel::OpenCL) { unsigned PtrSize = ST->getPointerSize(); MAI.Addr = PtrSize == 32 ? SPIRV::AddressingModel::Physical32 @@ -175,7 +175,7 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) { // OpenCL 1.0 by default for the OpenCL environment to avoid puzzling // run-times with Unknown/0.0 version output. For a reference, LLVM-SPIRV // Translator avoids potential issues with run-times in a similar manner. - if (!ST->isShaderEnv()) { + if (!ST->isShader()) { MAI.SrcLang = SPIRV::SourceLanguage::OpenCL_CPP; MAI.SrcLangVersion = 100000; } else { @@ -203,7 +203,7 @@ void SPIRVModuleAnalysis::setBaseInfo(const Module &M) { MAI.Reqs.getAndAddRequirements(SPIRV::OperandCategory::AddressingModelOperand, MAI.Addr, *ST); - if (!ST->isShaderEnv()) { + if (!ST->isShader()) { // TODO: check if it's required by default. MAI.ExtInstSetMap[static_cast( SPIRV::InstructionSet::OpenCL_std)] = MAI.getNextIDRegister(); @@ -804,12 +804,12 @@ void RequirementHandler::initAvailableCapabilities(const SPIRVSubtarget &ST) { addAvailableCaps(EnabledCapabilities); } - if (!ST.isShaderEnv()) { + if (!ST.isShader()) { initAvailableCapabilitiesForOpenCL(ST); return; } - if (ST.isShaderEnv()) { + if (ST.isShader()) { initAvailableCapabilitiesForVulkan(ST); return; } @@ -969,7 +969,7 @@ static void addOpTypeImageReqs(const MachineInstr &MI, } // Has optional access qualifier. - if (!ST.isShaderEnv()) { + if (!ST.isShader()) { if (MI.getNumOperands() > 8 && MI.getOperand(8).getImm() == SPIRV::AccessQualifier::ReadWrite) Reqs.addRequirements(SPIRV::Capability::ImageReadWrite); @@ -1267,7 +1267,7 @@ void addInstrRequirements(const MachineInstr &MI, ST); // If it's a type of pointer to float16 targeting OpenCL, add Float16Buffer // capability. - if (ST.isShaderEnv()) + if (ST.isShader()) break; assert(MI.getOperand(2).isReg()); const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo(); @@ -1342,7 +1342,7 @@ void addInstrRequirements(const MachineInstr &MI, addOpTypeImageReqs(MI, Reqs, ST); break; case SPIRV::OpTypeSampler: - if (!ST.isShaderEnv()) { + if (!ST.isShader()) { Reqs.addCapability(SPIRV::Capability::ImageBasic); } break; @@ -1794,7 +1794,7 @@ void addInstrRequirements(const MachineInstr &MI, // StorageImageReadWithoutFormat/StorageImageWriteWithoutFormat, see // https://github.com/KhronosGroup/SPIRV-Headers/issues/487 - if (isImageTypeWithUnknownFormat(TypeDef) && ST.isShaderEnv()) + if (isImageTypeWithUnknownFormat(TypeDef) && ST.isShader()) Reqs.addCapability(SPIRV::Capability::StorageImageReadWithoutFormat); break; } @@ -1808,7 +1808,7 @@ void addInstrRequirements(const MachineInstr &MI, // StorageImageReadWithoutFormat/StorageImageWriteWithoutFormat, see // https://github.com/KhronosGroup/SPIRV-Headers/issues/487 - if (isImageTypeWithUnknownFormat(TypeDef) && ST.isShaderEnv()) + if (isImageTypeWithUnknownFormat(TypeDef) && ST.isShader()) Reqs.addCapability(SPIRV::Capability::StorageImageWriteWithoutFormat); break; } diff --git a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp index c1c47d2b5d8ca..26ab74e8caa49 100644 --- a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp @@ -405,13 +405,13 @@ bool SPIRVPrepareFunctions::substituteIntrinsicCalls(Function *F) { Changed = true; break; case Intrinsic::lifetime_start: - if (!STI.isShaderEnv()) { + if (!STI.isShader()) { Changed |= toSpvOverloadedIntrinsic( II, Intrinsic::SPVIntrinsics::spv_lifetime_start, {1}); } break; case Intrinsic::lifetime_end: - if (!STI.isShaderEnv()) { + if (!STI.isShader()) { Changed |= toSpvOverloadedIntrinsic( II, Intrinsic::SPVIntrinsics::spv_lifetime_end, {1}); } diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp index 58eb67ff5f7b8..cdf3c6224d4c8 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp @@ -119,7 +119,7 @@ bool SPIRVSubtarget::canUseExtInstSet( SPIRV::InstructionSet::InstructionSet SPIRVSubtarget::getPreferredInstructionSet() const { - if (isShaderEnv()) + if (isShader()) return SPIRV::InstructionSet::GLSL_std_450; else return SPIRV::InstructionSet::OpenCL_std; @@ -130,7 +130,7 @@ bool SPIRVSubtarget::isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const { } bool SPIRVSubtarget::isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const { - if (isShaderEnv()) + if (isShader()) return false; return isAtLeastVer(OpenCLVersion, VerToCompareTo); } @@ -153,7 +153,7 @@ void SPIRVSubtarget::accountForAMDShaderTrinaryMinmax() { // Must have called initAvailableExtensions first. void SPIRVSubtarget::initAvailableExtInstSets() { AvailableExtInstSets.clear(); - if (isShaderEnv()) + if (isShader()) AvailableExtInstSets.insert(SPIRV::InstructionSet::GLSL_std_450); else AvailableExtInstSets.insert(SPIRV::InstructionSet::OpenCL_std); diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h index 0071861364dc7..ad3e38d296ed7 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.h +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.h @@ -92,8 +92,8 @@ class SPIRVSubtarget : public SPIRVGenSubtargetInfo { Env = E; } SPIRVEnvType getEnv() const { return Env; } - bool isKernelEnv() const { return getEnv() == Kernel; } - bool isShaderEnv() const { return getEnv() == Shader; } + bool isKernel() const { return getEnv() == Kernel; } + bool isShader() const { return getEnv() == Shader; } bool isLogicalSPIRV() const { return TargetTriple.getArch() == Triple::spirv; } diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp index cb456a500325a..82fe23a22b60f 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp @@ -188,7 +188,7 @@ TargetPassConfig *SPIRVTargetMachine::createPassConfig(PassManagerBase &PM) { void SPIRVPassConfig::addIRPasses() { TargetPassConfig::addIRPasses(); - if (TM.getSubtargetImpl()->isShaderEnv()) { + if (TM.getSubtargetImpl()->isShader()) { // Vulkan does not allow address space casts. This pass is run to remove // address space casts that can be removed. // If an address space cast is not removed while targeting Vulkan, lowering diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetTransformInfo.h b/llvm/lib/Target/SPIRV/SPIRVTargetTransformInfo.h index 585a3606ee87b..3f211b5a8b168 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetTransformInfo.h +++ b/llvm/lib/Target/SPIRV/SPIRVTargetTransformInfo.h @@ -50,7 +50,7 @@ class SPIRVTTIImpl : public BasicTTIImplBase { } unsigned getFlatAddressSpace() const override { - if (ST->isShaderEnv()) + if (ST->isShader()) return 0; // FIXME: Clang has 2 distinct address space maps. One where // default=4=Generic, and one with default=0=Function. This depends on the From 248c5e6b801bc1b3aa0ab0f63ce460bf398c354d Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Fri, 30 May 2025 21:21:46 +0200 Subject: [PATCH 19/19] Fix test failure. --- llvm/test/CodeGen/SPIRV/inline/type.undef.ll | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/test/CodeGen/SPIRV/inline/type.undef.ll b/llvm/test/CodeGen/SPIRV/inline/type.undef.ll index 8cb90007c9aba..e84e6262d8873 100644 --- a/llvm/test/CodeGen/SPIRV/inline/type.undef.ll +++ b/llvm/test/CodeGen/SPIRV/inline/type.undef.ll @@ -1,6 +1,6 @@ -; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} -; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - | spirv-as - -o - | spirv-val %} +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %} +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - | spirv-as - -o - | spirv-val %} %literal_32 = type target("spirv.Literal", 32) %literal_true = type target("spirv.Literal", 1)