diff --git a/llvm/include/llvm/CodeGen/ValueTypes.td b/llvm/include/llvm/CodeGen/ValueTypes.td index 934800f10747..336b2a49b131 100644 --- a/llvm/include/llvm/CodeGen/ValueTypes.td +++ b/llvm/include/llvm/CodeGen/ValueTypes.td @@ -238,6 +238,7 @@ def x86amx : ValueType<8192, 194>; // X86 AMX value def i64x8 : ValueType<512, 195>; // 8 Consecutive GPRs (AArch64) def aarch64svcount : ValueType<16, 196>; // AArch64 predicate-as-counter +def spirvbuiltin : ValueType<0, 197>; // SPIR-V's builtin type def token : ValueType<0, 248>; // TokenTy def MetadataVT : ValueType<0, 249>; // Metadata diff --git a/llvm/include/llvm/Support/MachineValueType.h b/llvm/include/llvm/Support/MachineValueType.h index 58f294d1b873..eb97239612c5 100644 --- a/llvm/include/llvm/Support/MachineValueType.h +++ b/llvm/include/llvm/Support/MachineValueType.h @@ -292,9 +292,10 @@ namespace llvm { x86amx = 194, // This is an X86 AMX value i64x8 = 195, // 8 Consecutive GPRs (AArch64) aarch64svcount = 196, // AArch64 predicate-as-counter + spirvbuiltin = 197, // SPIR-V's builtin type FIRST_VALUETYPE = 1, // This is always the beginning of the list. - LAST_VALUETYPE = aarch64svcount, // This always remains at the end of the list. + LAST_VALUETYPE = spirvbuiltin, // This always remains at the end of the list. VALUETYPE_SIZE = LAST_VALUETYPE + 1, // This is the current maximum for LAST_VALUETYPE. @@ -1143,7 +1144,9 @@ namespace llvm { case v2048i32: case v2048f32: return TypeSize::Fixed(65536); case funcref: - case externref: return TypeSize::Fixed(0); // opaque type + case externref: + case spirvbuiltin: + return TypeSize::Fixed(0); // opaque type } } diff --git a/llvm/lib/CodeGen/ValueTypes.cpp b/llvm/lib/CodeGen/ValueTypes.cpp index b4c873c0b1ab..1b317bd0d790 100644 --- a/llvm/lib/CodeGen/ValueTypes.cpp +++ b/llvm/lib/CodeGen/ValueTypes.cpp @@ -176,6 +176,8 @@ std::string EVT::getEVTString() const { case MVT::externref: return "externref"; case MVT::aarch64svcount: return "aarch64svcount"; + case MVT::spirvbuiltin: + return "spirvbuiltin"; } } @@ -583,12 +585,16 @@ MVT MVT::getVT(Type *Ty, bool HandleUnknown){ case Type::DoubleTyID: return MVT(MVT::f64); case Type::X86_FP80TyID: return MVT(MVT::f80); case Type::X86_MMXTyID: return MVT(MVT::x86mmx); - case Type::TargetExtTyID: - if (cast(Ty)->getName() == "aarch64.svcount") + case Type::TargetExtTyID: { + TargetExtType *TargetExtTy = cast(Ty); + if (TargetExtTy->getName() == "aarch64.svcount") return MVT(MVT::aarch64svcount); + else if (TargetExtTy->getName().starts_with("spirv.")) + return MVT(MVT::spirvbuiltin); if (HandleUnknown) return MVT(MVT::Other); llvm_unreachable("Unknown target ext type!"); + } case Type::X86_AMXTyID: return MVT(MVT::x86amx); case Type::FP128TyID: return MVT(MVT::f128); case Type::PPC_FP128TyID: return MVT(MVT::ppcf128); diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp index a69e8c461282..c11b36a08854 100644 --- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp @@ -305,7 +305,7 @@ static bool buildSelectInst(MachineIRBuilder &MIRBuilder, if (ReturnType->getOpcode() == SPIRV::OpTypeVector) { unsigned Bits = GR->getScalarOrVectorBitWidth(ReturnType); - uint64_t AllOnes = APInt::getAllOnesValue(Bits).getZExtValue(); + uint64_t AllOnes = APInt::getAllOnes(Bits).getZExtValue(); TrueConst = GR->getOrCreateConsIntVector(AllOnes, MIRBuilder, ReturnType); FalseConst = GR->getOrCreateConsIntVector(0, MIRBuilder, ReturnType); } else { diff --git a/llvm/lib/Target/SPIRV/SPIRVInstrInfo.td b/llvm/lib/Target/SPIRV/SPIRVInstrInfo.td index e1521d44e4e5..44b5536becf7 100644 --- a/llvm/lib/Target/SPIRV/SPIRVInstrInfo.td +++ b/llvm/lib/Target/SPIRV/SPIRVInstrInfo.td @@ -213,7 +213,7 @@ def PseudoConstI: IntImmLeaf; def ConstPseudoTrue: IntImmLeaf; def ConstPseudoFalse: IntImmLeaf; -def ConstPseudoNull: IntImmLeaf; +def ConstPseudoNull: IntImmLeaf; multiclass IntFPImm opCode, string name> { def I: OpgetOpcode() == SPIRV::OpTypeVector) return GR.getOrCreateConsIntVector(One.getZExtValue(), I, ResType, TII); return GR.getOrCreateConstInt(One.getZExtValue(), I, ResType, TII); @@ -1180,10 +1180,10 @@ bool SPIRVInstructionSelector::selectConst(Register ResVReg, const APInt &Imm, MachineInstr &I) const { unsigned TyOpcode = ResType->getOpcode(); - assert(TyOpcode != SPIRV::OpTypePointer || Imm.isNullValue()); + assert(TyOpcode != SPIRV::OpTypePointer || Imm.isZero()); MachineBasicBlock &BB = *I.getParent(); if ((TyOpcode == SPIRV::OpTypePointer || TyOpcode == SPIRV::OpTypeEvent) && - Imm.isNullValue()) + Imm.isZero()) return BuildMI(BB, I, I.getDebugLoc(), TII.get(SPIRV::OpConstantNull)) .addDef(ResVReg) .addUse(GR.getSPIRVTypeID(ResType))