[llvm] [SPIRV] Replace `SPIRVType` with `SPIRVTypeInst` as much as we can (PR #180721)

Juan Manuel Martinez CaamaƱo via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 11 03:59:06 PST 2026


https://github.com/jmmartinez updated https://github.com/llvm/llvm-project/pull/180721

>From 6d77a231724d30f28bfe9dcbf77e0fee494ff86b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?=
 <jmartinezcaamao at gmail.com>
Date: Mon, 9 Feb 2026 07:05:40 -0600
Subject: [PATCH] [SPIRV] Replace SPIRVType with SPIRVTypeInst as much as we
 can

Co-authored-by: Cursor <cursoragent at cursor.com>
---
 llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp       | 188 ++---
 llvm/lib/Target/SPIRV/SPIRVBuiltins.h         |   8 +-
 llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp   |  34 +-
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp |  14 +-
 llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h   |  13 +-
 .../Target/SPIRV/SPIRVEmitNonSemanticDI.cpp   |   4 +-
 llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp | 396 +++++------
 llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.h   | 347 +++++-----
 llvm/lib/Target/SPIRV/SPIRVISelLowering.cpp   |  68 +-
 llvm/lib/Target/SPIRV/SPIRVISelLowering.h     |   2 +-
 .../Target/SPIRV/SPIRVInstructionSelector.cpp | 647 +++++++++---------
 llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp  |  28 +-
 llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp |  39 +-
 llvm/lib/Target/SPIRV/SPIRVPostLegalizer.cpp  | 111 +--
 llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp   |  44 +-
 15 files changed, 989 insertions(+), 954 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 4086d3228ff67..712549510e145 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -45,11 +45,11 @@ struct IncomingCall {
   const DemangledBuiltin *Builtin;
 
   const Register ReturnRegister;
-  const SPIRVType *ReturnType;
+  const SPIRVTypeInst ReturnType;
   const SmallVectorImpl<Register> &Arguments;
 
   IncomingCall(const std::string BuiltinName, const DemangledBuiltin *Builtin,
-               const Register ReturnRegister, const SPIRVType *ReturnType,
+               const Register ReturnRegister, SPIRVTypeInst ReturnType,
                const SmallVectorImpl<Register> &Arguments)
       : BuiltinName(std::move(BuiltinName)), Builtin(Builtin),
         ReturnRegister(ReturnRegister), ReturnType(ReturnType),
@@ -273,7 +273,7 @@ std::string lookupBuiltinNameHelper(StringRef DemangledCall,
 static std::unique_ptr<const SPIRV::IncomingCall>
 lookupBuiltin(StringRef DemangledCall,
               SPIRV::InstructionSet::InstructionSet Set,
-              Register ReturnRegister, const SPIRVType *ReturnType,
+              Register ReturnRegister, SPIRVTypeInst ReturnType,
               const SmallVectorImpl<Register> &Arguments) {
   std::string BuiltinName = SPIRV::lookupBuiltinNameHelper(DemangledCall);
 
@@ -439,11 +439,11 @@ static const Type *getBlockStructType(Register ParamReg,
 /// depending on the expected \p ResultType.
 ///
 /// \returns Tuple of the resulting register and its type.
-static std::tuple<Register, SPIRVType *>
-buildBoolRegister(MachineIRBuilder &MIRBuilder, const SPIRVType *ResultType,
+static std::tuple<Register, SPIRVTypeInst>
+buildBoolRegister(MachineIRBuilder &MIRBuilder, SPIRVTypeInst ResultType,
                   SPIRVGlobalRegistry *GR) {
   LLT Type;
-  SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType(MIRBuilder, true);
+  SPIRVTypeInst BoolType = GR->getOrCreateSPIRVBoolType(MIRBuilder, true);
 
   if (ResultType->getOpcode() == SPIRV::OpTypeVector) {
     unsigned VectorElements = ResultType->getOperand(2).getImm();
@@ -467,8 +467,7 @@ buildBoolRegister(MachineIRBuilder &MIRBuilder, const SPIRVType *ResultType,
 /// depending on the expected \p ResultType.
 static bool buildSelectInst(MachineIRBuilder &MIRBuilder,
                             Register ReturnRegister, Register SourceRegister,
-                            const SPIRVType *ReturnType,
-                            SPIRVGlobalRegistry *GR) {
+                            SPIRVTypeInst ReturnType, SPIRVGlobalRegistry *GR) {
   Register TrueConst, FalseConst;
 
   if (ReturnType->getOpcode() == SPIRV::OpTypeVector) {
@@ -488,7 +487,7 @@ static bool buildSelectInst(MachineIRBuilder &MIRBuilder,
 
 /// Helper function for building a load instruction loading into the
 /// \p DestinationReg.
-static Register buildLoadInst(SPIRVType *BaseType, Register PtrRegister,
+static Register buildLoadInst(SPIRVTypeInst BaseType, Register PtrRegister,
                               MachineIRBuilder &MIRBuilder,
                               SPIRVGlobalRegistry *GR, LLT LowLevelType,
                               Register DestinationReg = Register(0)) {
@@ -504,7 +503,7 @@ static Register buildLoadInst(SPIRVType *BaseType, Register PtrRegister,
 /// Helper function for building a load instruction for loading a builtin global
 /// variable of \p BuiltinValue value.
 static Register buildBuiltinVariableLoad(
-    MachineIRBuilder &MIRBuilder, SPIRVType *VariableType,
+    MachineIRBuilder &MIRBuilder, SPIRVTypeInst VariableType,
     SPIRVGlobalRegistry *GR, SPIRV::BuiltIn::BuiltIn BuiltinValue, LLT LLType,
     Register Reg = Register(0), bool isConst = true,
     const std::optional<SPIRV::LinkageType::LinkageType> &LinkageTy = {
@@ -515,7 +514,7 @@ static Register buildBuiltinVariableLoad(
       NewRegister,
       LLT::pointer(storageClassToAddressSpace(SPIRV::StorageClass::Function),
                    GR->getPointerSize()));
-  SPIRVType *PtrType = GR->getOrCreateSPIRVPointerType(
+  SPIRVTypeInst PtrType = GR->getOrCreateSPIRVPointerType(
       VariableType, MIRBuilder, SPIRV::StorageClass::Input);
   GR->assignSPIRVTypeToVReg(PtrType, NewRegister, MIRBuilder.getMF());
 
@@ -534,7 +533,7 @@ static Register buildBuiltinVariableLoad(
 
 /// Helper external function for assigning SPIRVType to a register, ensuring the
 /// register class and type are set in MRI. Defined in SPIRVPreLegalizer.cpp.
-extern void updateRegType(Register Reg, Type *Ty, SPIRVType *SpirvTy,
+extern void updateRegType(Register Reg, Type *Ty, SPIRVTypeInst SpirvTy,
                           SPIRVGlobalRegistry *GR, MachineIRBuilder &MIB,
                           MachineRegisterInfo &MRI);
 
@@ -602,7 +601,7 @@ static void setRegClassIfNull(Register Reg, MachineRegisterInfo *MRI,
                               SPIRVGlobalRegistry *GR) {
   if (MRI->getRegClassOrNull(Reg))
     return;
-  SPIRVType *SpvType = GR->getSPIRVTypeForVReg(Reg);
+  SPIRVTypeInst SpvType = GR->getSPIRVTypeForVReg(Reg);
   MRI->setRegClass(Reg,
                    SpvType ? GR->getRegClass(SpvType) : &SPIRV::iIDRegClass);
 }
@@ -728,7 +727,7 @@ static bool buildAtomicCompareExchangeInst(
   Register ObjectPtr = Call->Arguments[0];   // Pointer (volatile A *object.)
   Register ExpectedArg = Call->Arguments[1]; // Comparator (C* expected).
   Register Desired = Call->Arguments[2];     // Value (C Desired).
-  SPIRVType *SpvDesiredTy = GR->getSPIRVTypeForVReg(Desired);
+  SPIRVTypeInst SpvDesiredTy = GR->getSPIRVTypeForVReg(Desired);
   LLT DesiredLLT = MRI->getType(Desired);
 
   assert(GR->getSPIRVTypeForVReg(ObjectPtr)->getOpcode() ==
@@ -739,7 +738,7 @@ static bool buildAtomicCompareExchangeInst(
                    : ExpectedType == SPIRV::OpTypePointer);
   assert(GR->isScalarOfType(Desired, SPIRV::OpTypeInt));
 
-  SPIRVType *SpvObjectPtrTy = GR->getSPIRVTypeForVReg(ObjectPtr);
+  SPIRVTypeInst SpvObjectPtrTy = GR->getSPIRVTypeForVReg(ObjectPtr);
   assert(SpvObjectPtrTy->getOperand(2).isReg() && "SPIRV type is expected");
   auto StorageClass = static_cast<SPIRV::StorageClass::StorageClass>(
       SpvObjectPtrTy->getOperand(1).getImm());
@@ -1162,7 +1161,7 @@ static unsigned getNumComponentsForDim(SPIRV::Dim::Dim dim) {
 }
 
 /// Helper function for obtaining the number of size components.
-static unsigned getNumSizeComponents(SPIRVType *imgType) {
+static unsigned getNumSizeComponents(SPIRVTypeInst imgType) {
   assert(imgType->getOpcode() == SPIRV::OpTypeImage);
   auto dim = static_cast<SPIRV::Dim::Dim>(imgType->getOperand(2).getImm());
   unsigned numComps = getNumComponentsForDim(dim);
@@ -1213,7 +1212,7 @@ getBuiltinCallArguments(const SPIRV::IncomingCall *Call, uint32_t BuiltinNumber,
   SmallVector<Register> Arguments;
   for (Register Argument : Call->Arguments) {
     Register VecArg = Argument;
-    SPIRVType *ArgumentType = GR->getSPIRVTypeForVReg(Argument);
+    SPIRVTypeInst ArgumentType = GR->getSPIRVTypeForVReg(Argument);
     if (ArgumentType != Call->ReturnType) {
       VecArg = createVirtualRegister(Call->ReturnType, GR, MIRBuilder);
       auto VecSplat = MIRBuilder.buildInstr(SPIRV::OpCompositeConstruct)
@@ -1291,7 +1290,7 @@ static bool generateRelationalInst(const SPIRV::IncomingCall *Call,
       SPIRV::lookupNativeBuiltin(Builtin->Name, Builtin->Set)->Opcode;
 
   Register CompareRegister;
-  SPIRVType *RelationType;
+  SPIRVTypeInst RelationType = nullptr;
   std::tie(CompareRegister, RelationType) =
       buildBoolRegister(MIRBuilder, Call->ReturnType, GR);
 
@@ -1347,9 +1346,9 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
 
   Register Arg0;
   if (GroupBuiltin->HasBoolArg) {
-    SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType(MIRBuilder, true);
+    SPIRVTypeInst BoolType = GR->getOrCreateSPIRVBoolType(MIRBuilder, true);
     Register BoolReg = Call->Arguments[0];
-    SPIRVType *BoolRegType = GR->getSPIRVTypeForVReg(BoolReg);
+    SPIRVTypeInst BoolRegType = GR->getSPIRVTypeForVReg(BoolReg);
     if (!BoolRegType)
       report_fatal_error("Can't find a register's type definition");
     MachineInstr *ArgInstruction = getDefInstrMaybeConstant(BoolReg, MRI);
@@ -1375,7 +1374,7 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
   }
 
   Register GroupResultRegister = Call->ReturnRegister;
-  SPIRVType *GroupResultType = Call->ReturnType;
+  SPIRVTypeInst GroupResultType = Call->ReturnType;
 
   // TODO: maybe we need to check whether the result type is already boolean
   // and in this case do not insert select instruction.
@@ -1401,14 +1400,14 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
     // it's a work_group_broadcast(val, local_id_x, local_id_y) or
     // work_group_broadcast(val, local_id_x, local_id_y, local_id_z) call.
     Register ElemReg = Call->Arguments[1];
-    SPIRVType *ElemType = GR->getSPIRVTypeForVReg(ElemReg);
+    SPIRVTypeInst ElemType = GR->getSPIRVTypeForVReg(ElemReg);
     if (!ElemType || ElemType->getOpcode() != SPIRV::OpTypeInt)
       report_fatal_error("Expect an integer <LocalId> argument");
     unsigned VecLen = Call->Arguments.size() - 1;
     VecReg = MRI->createGenericVirtualRegister(
         LLT::fixed_vector(VecLen, MRI->getType(ElemReg)));
     MRI->setRegClass(VecReg, &SPIRV::vIDRegClass);
-    SPIRVType *VecType =
+    SPIRVTypeInst VecType =
         GR->getOrCreateSPIRVVectorType(ElemType, VecLen, MIRBuilder, true);
     GR->assignSPIRVTypeToVReg(VecType, VecReg, MIRBuilder.getMF());
     auto MIB =
@@ -1481,7 +1480,7 @@ static bool generateIntelSubgroupsInst(const SPIRV::IncomingCall *Call,
 
   if (IntelSubgroups->IsBlock) {
     // Minimal number or arguments set in TableGen records is 1
-    if (SPIRVType *Arg0Type = GR->getSPIRVTypeForVReg(Call->Arguments[0])) {
+    if (SPIRVTypeInst Arg0Type = GR->getSPIRVTypeForVReg(Call->Arguments[0])) {
       if (Arg0Type->getOpcode() == SPIRV::OpTypeImage) {
         // TODO: add required validation from the specification:
         // "'Image' must be an object whose type is OpTypeImage with a 'Sampled'
@@ -1636,7 +1635,7 @@ static bool genWorkgroupQuery(const SPIRV::IncomingCall *Call,
   Register IndexRegister = Call->Arguments[0];
   const unsigned ResultWidth = Call->ReturnType->getOperand(1).getImm();
   const unsigned PointerSize = GR->getPointerSize();
-  const SPIRVType *PointerSizeType =
+  const SPIRVTypeInst PointerSizeType =
       GR->getOrCreateSPIRVIntegerType(PointerSize, MIRBuilder);
   MachineRegisterInfo *MRI = MIRBuilder.getMRI();
   auto IndexInstruction = getDefInstrMaybeConstant(IndexRegister, MRI);
@@ -1955,16 +1954,16 @@ static bool generateICarryBorrowInst(const SPIRV::IncomingCall *Call,
       SPIRV::lookupNativeBuiltin(Builtin->Name, Builtin->Set)->Opcode;
 
   Register SRetReg = Call->Arguments[0];
-  SPIRVType *PtrRetType = GR->getSPIRVTypeForVReg(SRetReg);
-  SPIRVType *RetType = GR->getPointeeType(PtrRetType);
+  SPIRVTypeInst PtrRetType = GR->getSPIRVTypeForVReg(SRetReg);
+  SPIRVTypeInst RetType = GR->getPointeeType(PtrRetType);
   if (!RetType)
     report_fatal_error("The first parameter must be a pointer");
   if (RetType->getOpcode() != SPIRV::OpTypeStruct)
     report_fatal_error("Expected struct type result for the arithmetic with "
                        "overflow builtins");
 
-  SPIRVType *OpType1 = GR->getSPIRVTypeForVReg(Call->Arguments[1]);
-  SPIRVType *OpType2 = GR->getSPIRVTypeForVReg(Call->Arguments[2]);
+  SPIRVTypeInst OpType1 = GR->getSPIRVTypeForVReg(Call->Arguments[1]);
+  SPIRVTypeInst OpType2 = GR->getSPIRVTypeForVReg(Call->Arguments[2]);
   if (!OpType1 || !OpType2 || OpType1 != OpType2)
     report_fatal_error("Operands must have the same type");
   if (OpType1->getOpcode() == SPIRV::OpTypeVector)
@@ -2024,10 +2023,10 @@ static bool generateImageSizeQueryInst(const SPIRV::IncomingCall *Call,
           ? Call->ReturnType->getOperand(2).getImm()
           : 1;
   // Get the actual number of query result/size components.
-  SPIRVType *ImgType = GR->getSPIRVTypeForVReg(Call->Arguments[0]);
+  SPIRVTypeInst ImgType = GR->getSPIRVTypeForVReg(Call->Arguments[0]);
   unsigned NumActualRetComponents = getNumSizeComponents(ImgType);
   Register QueryResult = Call->ReturnRegister;
-  SPIRVType *QueryResultType = Call->ReturnType;
+  SPIRVTypeInst QueryResultType = Call->ReturnType;
   if (NumExpectedRetComponents != NumActualRetComponents) {
     unsigned Bitwidth = Call->ReturnType->getOpcode() == SPIRV::OpTypeInt
                             ? Call->ReturnType->getOperand(1).getImm()
@@ -2035,7 +2034,7 @@ static bool generateImageSizeQueryInst(const SPIRV::IncomingCall *Call,
     QueryResult = MIRBuilder.getMRI()->createGenericVirtualRegister(
         LLT::fixed_vector(NumActualRetComponents, Bitwidth));
     MIRBuilder.getMRI()->setRegClass(QueryResult, &SPIRV::vIDRegClass);
-    SPIRVType *IntTy = GR->getOrCreateSPIRVIntegerType(Bitwidth, MIRBuilder);
+    SPIRVTypeInst IntTy = GR->getOrCreateSPIRVIntegerType(Bitwidth, MIRBuilder);
     QueryResultType = GR->getOrCreateSPIRVVectorType(
         IntTy, NumActualRetComponents, MIRBuilder, true);
     GR->assignSPIRVTypeToVReg(QueryResultType, QueryResult, MIRBuilder.getMF());
@@ -2058,11 +2057,11 @@ static bool generateImageSizeQueryInst(const SPIRV::IncomingCall *Call,
     assert(ExtractedComposite < NumActualRetComponents &&
            "Invalid composite index!");
     Register TypeReg = GR->getSPIRVTypeID(Call->ReturnType);
-    SPIRVType *NewType = nullptr;
+    SPIRVTypeInst NewType = nullptr;
     if (QueryResultType->getOpcode() == SPIRV::OpTypeVector) {
       Register NewTypeReg = QueryResultType->getOperand(1).getReg();
       if (TypeReg != NewTypeReg &&
-          (NewType = GR->getSPIRVTypeForVReg(NewTypeReg)) != nullptr)
+          (NewType = GR->getSPIRVTypeForVReg(NewTypeReg)))
         TypeReg = NewTypeReg;
     }
     MIRBuilder.buildInstr(SPIRV::OpCompositeExtract)
@@ -2070,7 +2069,7 @@ static bool generateImageSizeQueryInst(const SPIRV::IncomingCall *Call,
         .addUse(TypeReg)
         .addUse(QueryResult)
         .addImm(ExtractedComposite);
-    if (NewType != nullptr)
+    if (NewType)
       updateRegType(Call->ReturnRegister, nullptr, NewType, GR, MIRBuilder,
                     MIRBuilder.getMF().getRegInfo());
   } else {
@@ -2177,8 +2176,8 @@ static bool generateReadImageInst(const StringRef DemangledCall,
           getSamplerParamFromBitmask(SamplerMask),
           getSamplerFilterModeFromBitmask(SamplerMask), MIRBuilder);
     }
-    SPIRVType *ImageType = GR->getSPIRVTypeForVReg(Image);
-    SPIRVType *SampledImageType =
+    SPIRVTypeInst ImageType = GR->getSPIRVTypeForVReg(Image);
+    SPIRVTypeInst SampledImageType =
         GR->getOrCreateOpTypeSampledImage(ImageType, MIRBuilder);
     Register SampledImage = MRI->createVirtualRegister(&SPIRV::iIDRegClass);
 
@@ -2192,7 +2191,7 @@ static bool generateReadImageInst(const StringRef DemangledCall,
                                        MIRBuilder);
 
     if (Call->ReturnType->getOpcode() != SPIRV::OpTypeVector) {
-      SPIRVType *TempType =
+      SPIRVTypeInst TempType =
           GR->getOrCreateSPIRVVectorType(Call->ReturnType, 4, MIRBuilder, true);
       Register TempRegister =
           MRI->createGenericVirtualRegister(GR->getRegType(TempType));
@@ -2267,8 +2266,8 @@ static bool generateSampleImageInst(const StringRef DemangledCall,
   } else if (Call->Builtin->Name.contains_insensitive("__spirv_SampledImage")) {
     // Create OpSampledImage.
     Register Image = Call->Arguments[0];
-    SPIRVType *ImageType = GR->getSPIRVTypeForVReg(Image);
-    SPIRVType *SampledImageType =
+    SPIRVTypeInst ImageType = GR->getSPIRVTypeForVReg(Image);
+    SPIRVTypeInst SampledImageType =
         GR->getOrCreateOpTypeSampledImage(ImageType, MIRBuilder);
     Register SampledImage =
         Call->ReturnRegister.isValid()
@@ -2288,10 +2287,10 @@ static bool generateSampleImageInst(const StringRef DemangledCall,
       ReturnType = ReturnType.substr(ReturnType.find("_R") + 2);
       ReturnType = ReturnType.substr(0, ReturnType.find('('));
     }
-    SPIRVType *Type =
-        Call->ReturnType
-            ? Call->ReturnType
-            : GR->getOrCreateSPIRVTypeByName(ReturnType, MIRBuilder, true);
+    SPIRVTypeInst Type = Call->ReturnType
+                             ? Call->ReturnType
+                             : SPIRVTypeInst(GR->getOrCreateSPIRVTypeByName(
+                                   ReturnType, MIRBuilder, true));
     if (!Type) {
       std::string DiagMsg =
           "Unable to recognize SPIRV type name: " + ReturnType;
@@ -2379,7 +2378,7 @@ static bool generateCoopMatrInst(const SPIRV::IncomingCall *Call,
     ImmArgs.push_back(getConstFromIntrinsic(Call->Arguments[LiteralIdx], MRI));
   Register TypeReg = GR->getSPIRVTypeID(Call->ReturnType);
   if (Opcode == SPIRV::OpCooperativeMatrixLengthKHR) {
-    SPIRVType *CoopMatrType = GR->getSPIRVTypeForVReg(Call->Arguments[0]);
+    SPIRVTypeInst CoopMatrType = GR->getSPIRVTypeForVReg(Call->Arguments[0]);
     if (!CoopMatrType)
       report_fatal_error("Can't find a register's type definition");
     MIRBuilder.buildInstr(Opcode)
@@ -2490,7 +2489,7 @@ static bool buildAPFixedPointInst(const SPIRV::IncomingCall *Call,
   if (IsSRet) {
     const LLT ValTy = MRI->getType(InputReg);
     Register ActualRetValReg = MRI->createGenericVirtualRegister(ValTy);
-    SPIRVType *InstructionType =
+    SPIRVTypeInst InstructionType =
         GR->getPointeeType(GR->getSPIRVTypeForVReg(InputReg));
     InputReg = Call->Arguments[1];
     auto InputType = GR->getTypeForSPIRVType(GR->getSPIRVTypeForVReg(InputReg));
@@ -2498,7 +2497,7 @@ static bool buildAPFixedPointInst(const SPIRV::IncomingCall *Call,
     if (InputType->getTypeID() == llvm::Type::TypeID::TypedPointerTyID) {
       LLT InputLLT = MRI->getType(InputReg);
       PtrInputReg = MRI->createGenericVirtualRegister(InputLLT);
-      SPIRVType *PtrType =
+      SPIRVTypeInst PtrType =
           GR->getPointeeType(GR->getSPIRVTypeForVReg(InputReg));
       MachineMemOperand *MMO1 = MIRBuilder.getMF().getMachineMemOperand(
           MachinePointerInfo(), MachineMemOperand::MOLoad,
@@ -2621,11 +2620,11 @@ static bool buildNDRange(const SPIRV::IncomingCall *Call,
                          MachineIRBuilder &MIRBuilder,
                          SPIRVGlobalRegistry *GR) {
   MachineRegisterInfo *MRI = MIRBuilder.getMRI();
-  SPIRVType *PtrType = GR->getSPIRVTypeForVReg(Call->Arguments[0]);
+  SPIRVTypeInst PtrType = GR->getSPIRVTypeForVReg(Call->Arguments[0]);
   assert(PtrType->getOpcode() == SPIRV::OpTypePointer &&
          PtrType->getOperand(2).isReg());
   Register TypeReg = PtrType->getOperand(2).getReg();
-  SPIRVType *StructType = GR->getSPIRVTypeForVReg(TypeReg);
+  SPIRVTypeInst StructType = GR->getSPIRVTypeForVReg(TypeReg);
   MachineFunction &MF = MIRBuilder.getMF();
   Register TmpReg = MRI->createVirtualRegister(&SPIRV::iIDRegClass);
   GR->assignSPIRVTypeToVReg(StructType, TmpReg, MF);
@@ -2639,7 +2638,7 @@ static bool buildNDRange(const SPIRV::IncomingCall *Call,
   Register GlobalWorkOffset = NumArgs <= 3 ? Register(0) : Call->Arguments[1];
   if (NumArgs < 4) {
     Register Const;
-    SPIRVType *SpvTy = GR->getSPIRVTypeForVReg(GlobalWorkSize);
+    SPIRVTypeInst SpvTy = GR->getSPIRVTypeForVReg(GlobalWorkSize);
     if (SpvTy->getOpcode() == SPIRV::OpTypePointer) {
       MachineInstr *DefInstr = MRI->getUniqueVRegDef(GlobalWorkSize);
       assert(DefInstr && isSpvIntrinsic(*DefInstr, Intrinsic::spv_gep) &&
@@ -2650,7 +2649,7 @@ static bool buildNDRange(const SPIRV::IncomingCall *Call,
       unsigned BitWidth = GR->getPointerSize() == 64 ? 64 : 32;
       Type *BaseTy = IntegerType::get(MF.getFunction().getContext(), BitWidth);
       Type *FieldTy = ArrayType::get(BaseTy, Size);
-      SPIRVType *SpvFieldTy = GR->getOrCreateSPIRVType(
+      SPIRVTypeInst SpvFieldTy = GR->getOrCreateSPIRVType(
           FieldTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
       GlobalWorkSize = MRI->createVirtualRegister(&SPIRV::iIDRegClass);
       GR->assignSPIRVTypeToVReg(SpvFieldTy, GlobalWorkSize, MF);
@@ -2683,7 +2682,7 @@ static bool buildNDRange(const SPIRV::IncomingCall *Call,
 }
 
 // TODO: maybe move to the global register.
-static SPIRVType *
+static SPIRVTypeInst
 getOrCreateSPIRVDeviceEventPointer(MachineIRBuilder &MIRBuilder,
                                    SPIRVGlobalRegistry *GR) {
   LLVMContext &Context = MIRBuilder.getMF().getFunction().getContext();
@@ -2700,7 +2699,7 @@ static bool buildEnqueueKernel(const SPIRV::IncomingCall *Call,
   const DataLayout &DL = MIRBuilder.getDataLayout();
   bool IsSpirvOp = Call->isSpirvOp();
   bool HasEvents = Call->Builtin->Name.contains("events") || IsSpirvOp;
-  const SPIRVType *Int32Ty = GR->getOrCreateSPIRVIntegerType(32, MIRBuilder);
+  const SPIRVTypeInst Int32Ty = GR->getOrCreateSPIRVIntegerType(32, MIRBuilder);
 
   // Make vararg instructions before OpEnqueueKernel.
   // Local sizes arguments: Sizes of block invoke arguments. Clang generates
@@ -2720,7 +2719,7 @@ static bool buildEnqueueKernel(const SPIRV::IncomingCall *Call,
         cast<ArrayType>(LocalSizeTy)->getNumElements();
     unsigned SC = storageClassToAddressSpace(SPIRV::StorageClass::Generic);
     const LLT LLType = LLT::pointer(SC, GR->getPointerSize());
-    const SPIRVType *PointerSizeTy = GR->getOrCreateSPIRVPointerType(
+    const SPIRVTypeInst PointerSizeTy = GR->getOrCreateSPIRVPointerType(
         Int32Ty, MIRBuilder, SPIRV::StorageClass::Function);
     for (unsigned I = 0; I < LocalSizeNum; ++I) {
       Register Reg = MRI->createVirtualRegister(&SPIRV::pIDRegClass);
@@ -2836,7 +2835,7 @@ static bool generateAsyncCopy(const SPIRV::IncomingCall *Call,
 
   switch (Opcode) {
   case SPIRV::OpGroupAsyncCopy: {
-    SPIRVType *NewType =
+    SPIRVTypeInst NewType =
         Call->ReturnType->getOpcode() == SPIRV::OpTypeEvent
             ? nullptr
             : GR->getOrCreateSPIRVTypeByName("spirv.Event", MIRBuilder, true);
@@ -2854,7 +2853,7 @@ static bool generateAsyncCopy(const SPIRV::IncomingCall *Call,
                                ? Call->Arguments[3]
                                : buildConstantIntReg32(1, MIRBuilder, GR))
                    .addUse(EventReg);
-    if (NewType != nullptr)
+    if (NewType)
       updateRegType(Call->ReturnRegister, nullptr, NewType, GR, MIRBuilder,
                     MIRBuilder.getMF().getRegInfo());
     return Res;
@@ -3028,7 +3027,7 @@ static bool generateAFPInst(const SPIRV::IncomingCall *Call,
     LLT PtrTy = MRI->getType(Call->Arguments[0]);
     DestReg = MRI->createGenericVirtualRegister(PtrTy);
     MRI->setRegClass(DestReg, &SPIRV::pIDRegClass);
-    SPIRVType *PointeeTy =
+    SPIRVTypeInst PointeeTy =
         GR->getPointeeType(GR->getSPIRVTypeForVReg(Call->Arguments[0]));
     MIB.addDef(DestReg);
     MIB.addUse(GR->getSPIRVTypeID(PointeeTy));
@@ -3173,7 +3172,7 @@ std::optional<bool> lowerBuiltin(const StringRef DemangledCall,
   LLVM_DEBUG(dbgs() << "Lowering builtin call: " << DemangledCall << "\n");
 
   // Lookup the builtin in the TableGen records.
-  SPIRVType *SpvType = GR->getSPIRVTypeForVReg(OrigRet);
+  SPIRVTypeInst SpvType = GR->getSPIRVTypeForVReg(OrigRet);
   assert(SpvType && "Inconsistent return register: expected valid type info");
   std::unique_ptr<const IncomingCall> Call =
       lookupBuiltin(DemangledCall, Set, OrigRet, SpvType, Args);
@@ -3380,24 +3379,24 @@ static Type *parseTypeString(const StringRef Name, LLVMContext &Context) {
 // Implementation functions for builtin types.
 //===----------------------------------------------------------------------===//
 
-static SPIRVType *getNonParameterizedType(const TargetExtType *ExtensionType,
-                                          const SPIRV::BuiltinType *TypeRecord,
-                                          MachineIRBuilder &MIRBuilder,
-                                          SPIRVGlobalRegistry *GR) {
+static SPIRVTypeInst
+getNonParameterizedType(const TargetExtType *ExtensionType,
+                        const SPIRV::BuiltinType *TypeRecord,
+                        MachineIRBuilder &MIRBuilder, SPIRVGlobalRegistry *GR) {
   unsigned Opcode = TypeRecord->Opcode;
   // Create or get an existing type from GlobalRegistry.
   return GR->getOrCreateOpTypeByOpcode(ExtensionType, MIRBuilder, Opcode);
 }
 
-static SPIRVType *getSamplerType(MachineIRBuilder &MIRBuilder,
-                                 SPIRVGlobalRegistry *GR) {
+static SPIRVTypeInst getSamplerType(MachineIRBuilder &MIRBuilder,
+                                    SPIRVGlobalRegistry *GR) {
   // Create or get an existing type from GlobalRegistry.
   return GR->getOrCreateOpTypeSampler(MIRBuilder);
 }
 
-static SPIRVType *getPipeType(const TargetExtType *ExtensionType,
-                              MachineIRBuilder &MIRBuilder,
-                              SPIRVGlobalRegistry *GR) {
+static SPIRVTypeInst getPipeType(const TargetExtType *ExtensionType,
+                                 MachineIRBuilder &MIRBuilder,
+                                 SPIRVGlobalRegistry *GR) {
   assert(ExtensionType->getNumIntParameters() == 1 &&
          "Invalid number of parameters for SPIR-V pipe builtin!");
   // Create or get an existing type from GlobalRegistry.
@@ -3406,14 +3405,14 @@ static SPIRVType *getPipeType(const TargetExtType *ExtensionType,
                                        ExtensionType->getIntParameter(0)));
 }
 
-static SPIRVType *getCoopMatrType(const TargetExtType *ExtensionType,
-                                  MachineIRBuilder &MIRBuilder,
-                                  SPIRVGlobalRegistry *GR) {
+static SPIRVTypeInst getCoopMatrType(const TargetExtType *ExtensionType,
+                                     MachineIRBuilder &MIRBuilder,
+                                     SPIRVGlobalRegistry *GR) {
   assert(ExtensionType->getNumIntParameters() == 4 &&
          "Invalid number of parameters for SPIR-V coop matrices builtin!");
   assert(ExtensionType->getNumTypeParameters() == 1 &&
          "SPIR-V coop matrices builtin type must have a type parameter!");
-  const SPIRVType *ElemType =
+  SPIRVTypeInst ElemType =
       GR->getOrCreateSPIRVType(ExtensionType->getTypeParameter(0), MIRBuilder,
                                SPIRV::AccessQualifier::ReadWrite, true);
   // Create or get an existing type from GlobalRegistry.
@@ -3423,18 +3422,18 @@ static SPIRVType *getCoopMatrType(const TargetExtType *ExtensionType,
       ExtensionType->getIntParameter(3), true);
 }
 
-static SPIRVType *getSampledImageType(const TargetExtType *OpaqueType,
-                                      MachineIRBuilder &MIRBuilder,
-                                      SPIRVGlobalRegistry *GR) {
-  SPIRVType *OpaqueImageType = GR->getImageType(
+static SPIRVTypeInst getSampledImageType(const TargetExtType *OpaqueType,
+                                         MachineIRBuilder &MIRBuilder,
+                                         SPIRVGlobalRegistry *GR) {
+  SPIRVTypeInst OpaqueImageType = GR->getImageType(
       OpaqueType, SPIRV::AccessQualifier::ReadOnly, MIRBuilder);
   // Create or get an existing type from GlobalRegistry.
   return GR->getOrCreateOpTypeSampledImage(OpaqueImageType, MIRBuilder);
 }
 
-static SPIRVType *getInlineSpirvType(const TargetExtType *ExtensionType,
-                                     MachineIRBuilder &MIRBuilder,
-                                     SPIRVGlobalRegistry *GR) {
+static SPIRVTypeInst getInlineSpirvType(const TargetExtType *ExtensionType,
+                                        MachineIRBuilder &MIRBuilder,
+                                        SPIRVGlobalRegistry *GR) {
   assert(ExtensionType->getNumIntParameters() == 3 &&
          "Inline SPIR-V type builtin takes an opcode, size, and alignment "
          "parameter");
@@ -3454,7 +3453,7 @@ static SPIRVType *getInlineSpirvType(const TargetExtType *ExtensionType,
         auto OperandValue = ParamEType->getIntParameter(0);
         auto *OperandType = ParamEType->getTypeParameter(0);
 
-        const SPIRVType *OperandSPIRVType = GR->getOrCreateSPIRVType(
+        SPIRVTypeInst OperandSPIRVType = GR->getOrCreateSPIRVType(
             OperandType, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
 
         Operands.push_back(MCOperand::createReg(GR->buildConstantInt(
@@ -3474,7 +3473,7 @@ static SPIRVType *getInlineSpirvType(const TargetExtType *ExtensionType,
         continue;
       }
     }
-    const SPIRVType *TypeOperand = GR->getOrCreateSPIRVType(
+    SPIRVTypeInst TypeOperand = GR->getOrCreateSPIRVType(
         Param, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
     Operands.push_back(MCOperand::createReg(GR->getSPIRVTypeID(TypeOperand)));
   }
@@ -3483,9 +3482,9 @@ static SPIRVType *getInlineSpirvType(const TargetExtType *ExtensionType,
                                     Operands);
 }
 
-static SPIRVType *getVulkanBufferType(const TargetExtType *ExtensionType,
-                                      MachineIRBuilder &MIRBuilder,
-                                      SPIRVGlobalRegistry *GR) {
+static SPIRVTypeInst getVulkanBufferType(const TargetExtType *ExtensionType,
+                                         MachineIRBuilder &MIRBuilder,
+                                         SPIRVGlobalRegistry *GR) {
   assert(ExtensionType->getNumTypeParameters() == 1 &&
          "Vulkan buffers have exactly one type for the type of the buffer.");
   assert(ExtensionType->getNumIntParameters() == 2 &&
@@ -3499,18 +3498,19 @@ static SPIRVType *getVulkanBufferType(const TargetExtType *ExtensionType,
   return GR->getOrCreateVulkanBufferType(MIRBuilder, T, SC, IsWritable);
 }
 
-static SPIRVType *getVulkanPushConstantType(const TargetExtType *ExtensionType,
-                                            MachineIRBuilder &MIRBuilder,
-                                            SPIRVGlobalRegistry *GR) {
+static SPIRVTypeInst
+getVulkanPushConstantType(const TargetExtType *ExtensionType,
+                          MachineIRBuilder &MIRBuilder,
+                          SPIRVGlobalRegistry *GR) {
   assert(ExtensionType->getNumTypeParameters() == 1 &&
          "Vulkan push constants have exactly one type as argument.");
   auto *T = ExtensionType->getTypeParameter(0);
   return GR->getOrCreateVulkanPushConstantType(MIRBuilder, T);
 }
 
-static SPIRVType *getLayoutType(const TargetExtType *ExtensionType,
-                                MachineIRBuilder &MIRBuilder,
-                                SPIRVGlobalRegistry *GR) {
+static SPIRVTypeInst getLayoutType(const TargetExtType *ExtensionType,
+                                   MachineIRBuilder &MIRBuilder,
+                                   SPIRVGlobalRegistry *GR) {
   return GR->getOrCreateLayoutType(MIRBuilder, ExtensionType);
 }
 
@@ -3564,10 +3564,10 @@ TargetExtType *parseBuiltinTypeNameToTargetExtType(std::string TypeName,
                             TypeParameters, IntParameters);
 }
 
-SPIRVType *lowerBuiltinType(const Type *OpaqueType,
-                            SPIRV::AccessQualifier::AccessQualifier AccessQual,
-                            MachineIRBuilder &MIRBuilder,
-                            SPIRVGlobalRegistry *GR) {
+SPIRVTypeInst
+lowerBuiltinType(const Type *OpaqueType,
+                 SPIRV::AccessQualifier::AccessQualifier AccessQual,
+                 MachineIRBuilder &MIRBuilder, SPIRVGlobalRegistry *GR) {
   // In LLVM IR, SPIR-V and OpenCL builtin types are represented as either
   // target(...) target extension types or pointers-to-opaque-structs. The
   // approach relying on structs is deprecated and works only in the non-opaque
@@ -3586,7 +3586,7 @@ SPIRVType *lowerBuiltinType(const Type *OpaqueType,
   const StringRef Name = BuiltinType->getName();
   LLVM_DEBUG(dbgs() << "Lowering builtin type: " << Name << "\n");
 
-  SPIRVType *TargetType;
+  SPIRVTypeInst TargetType = nullptr;
   if (Name == "spirv.Type") {
     TargetType = getInlineSpirvType(BuiltinType, MIRBuilder, GR);
   } else if (Name == "spirv.VulkanBuffer") {
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.h b/llvm/lib/Target/SPIRV/SPIRVBuiltins.h
index f6a5234cd3c73..81a6cc697ead7 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.h
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.h
@@ -79,10 +79,10 @@ TargetExtType *parseBuiltinTypeNameToTargetExtType(std::string TypeName,
 /// \return A machine instruction representing the OpType<...> SPIR-V type.
 ///
 /// \p Type is the special opaque/builtin type to be lowered.
-SPIRVType *lowerBuiltinType(const Type *Type,
-                            AccessQualifier::AccessQualifier AccessQual,
-                            MachineIRBuilder &MIRBuilder,
-                            SPIRVGlobalRegistry *GR);
+SPIRVTypeInst lowerBuiltinType(const Type *Type,
+                               AccessQualifier::AccessQualifier AccessQual,
+                               MachineIRBuilder &MIRBuilder,
+                               SPIRVGlobalRegistry *GR);
 } // namespace SPIRV
 } // namespace llvm
 #endif // LLVM_LIB_TARGET_SPIRV_SPIRVBUILTINS_H
diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
index f80926f9ff7f6..bc6418f2ceceb 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
@@ -101,8 +101,8 @@ static ConstantInt *getConstInt(MDNode *MD, unsigned NumOp) {
 // invalidating logic behind global registry and duplicates tracker.
 static FunctionType *
 fixFunctionTypeIfPtrArgs(SPIRVGlobalRegistry *GR, const Function &F,
-                         FunctionType *FTy, const SPIRVType *SRetTy,
-                         const SmallVector<SPIRVType *, 4> &SArgTys) {
+                         FunctionType *FTy, SPIRVTypeInst SRetTy,
+                         const SmallVector<SPIRVTypeInst, 4> &SArgTys) {
   bool hasArgPtrs = false;
   for (auto &Arg : F.args()) {
     // check if it's an instance of a non-typed PointerType
@@ -151,10 +151,10 @@ getKernelArgTypeQual(const Function &F, unsigned ArgIdx) {
   return {};
 }
 
-static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx,
-                                  SPIRVGlobalRegistry *GR,
-                                  MachineIRBuilder &MIRBuilder,
-                                  const SPIRVSubtarget &ST) {
+static SPIRVTypeInst getArgSPIRVType(const Function &F, unsigned ArgIdx,
+                                     SPIRVGlobalRegistry *GR,
+                                     MachineIRBuilder &MIRBuilder,
+                                     const SPIRVSubtarget &ST) {
   // Read argument's access qualifier from metadata or default.
   SPIRV::AccessQualifier::AccessQualifier ArgAccessQual =
       getArgAccessQual(F, ArgIdx);
@@ -262,7 +262,7 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
       static_cast<const SPIRVSubtarget *>(&MIRBuilder.getMF().getSubtarget());
 
   // Assign types and names to all args, and store their types for later.
-  SmallVector<SPIRVType *, 4> ArgTypeVRegs;
+  SmallVector<SPIRVTypeInst, 4> ArgTypeVRegs;
   if (VRegs.size() > 0) {
     unsigned i = 0;
     for (const auto &Arg : F.args()) {
@@ -270,7 +270,7 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
       // TODO: handle the case of multiple registers.
       if (VRegs[i].size() > 1)
         return false;
-      auto *SpirvTy = getArgSPIRVType(F, i, GR, MIRBuilder, *ST);
+      SPIRVTypeInst SpirvTy = getArgSPIRVType(F, i, GR, MIRBuilder, *ST);
       GR->assignSPIRVTypeToVReg(SpirvTy, VRegs[i][0], MIRBuilder.getMF());
       ArgTypeVRegs.push_back(SpirvTy);
 
@@ -371,10 +371,10 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
       FRetTy = DerivedTy;
     }
   }
-  SPIRVType *RetTy = GR->getOrCreateSPIRVType(
+  SPIRVTypeInst RetTy = GR->getOrCreateSPIRVType(
       FRetTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
   FTy = fixFunctionTypeIfPtrArgs(GR, F, FTy, RetTy, ArgTypeVRegs);
-  SPIRVType *FuncTy = GR->getOrCreateOpTypeFunctionWithArgs(
+  SPIRVTypeInst FuncTy = GR->getOrCreateOpTypeFunctionWithArgs(
       FTy, RetTy, ArgTypeVRegs, MIRBuilder);
   uint32_t FuncControl = getFunctionControl(F, ST);
 
@@ -449,11 +449,11 @@ void SPIRVCallLowering::produceIndirectPtrType(
   // Create indirect call data type if any
   MachineFunction &MF = MIRBuilder.getMF();
   const SPIRVSubtarget &ST = MF.getSubtarget<SPIRVSubtarget>();
-  SPIRVType *SpirvRetTy = GR->getOrCreateSPIRVType(
+  SPIRVTypeInst SpirvRetTy = GR->getOrCreateSPIRVType(
       IC.RetTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
-  SmallVector<SPIRVType *, 4> SpirvArgTypes;
+  SmallVector<SPIRVTypeInst, 4> SpirvArgTypes;
   for (size_t i = 0; i < IC.ArgTys.size(); ++i) {
-    SPIRVType *SPIRVTy = GR->getOrCreateSPIRVType(
+    SPIRVTypeInst SPIRVTy = GR->getOrCreateSPIRVType(
         IC.ArgTys[i], MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
     SpirvArgTypes.push_back(SPIRVTy);
     if (!GR->getSPIRVTypeForVReg(IC.ArgRegs[i]))
@@ -462,13 +462,13 @@ void SPIRVCallLowering::produceIndirectPtrType(
     // SPIR-V function type:
     FunctionType *FTy =
         FunctionType::get(const_cast<Type *>(IC.RetTy), IC.ArgTys, false);
-    SPIRVType *SpirvFuncTy = GR->getOrCreateOpTypeFunctionWithArgs(
+    SPIRVTypeInst SpirvFuncTy = GR->getOrCreateOpTypeFunctionWithArgs(
         FTy, SpirvRetTy, SpirvArgTypes, MIRBuilder);
     // SPIR-V pointer to function type:
     auto SC = ST.canUseExtension(SPIRV::Extension::SPV_INTEL_function_pointers)
                   ? SPIRV::StorageClass::CodeSectionINTEL
                   : SPIRV::StorageClass::Function;
-    SPIRVType *IndirectFuncPtrTy =
+    SPIRVTypeInst IndirectFuncPtrTy =
         GR->getOrCreateSPIRVPointerType(SpirvFuncTy, MIRBuilder, SC);
     // Correct the Callee type
     GR->assignSPIRVTypeToVReg(IndirectFuncPtrTy, IC.Callee, MF);
@@ -536,7 +536,7 @@ bool SPIRVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
       assert(Arg.Regs.size() == 1 && "Call arg has multiple VRegs");
       Register ArgReg = Arg.Regs[0];
       ArgVRegs.push_back(ArgReg);
-      SPIRVType *SpvType = GR->getSPIRVTypeForVReg(ArgReg);
+      SPIRVTypeInst SpvType = GR->getSPIRVTypeForVReg(ArgReg);
       if (!SpvType) {
         Type *ArgTy = nullptr;
         if (auto *PtrArgTy = dyn_cast<PointerType>(Arg.Ty)) {
@@ -642,7 +642,7 @@ bool SPIRVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
   // Make sure there's a valid return reg, even for functions returning void.
   if (!ResVReg.isValid())
     ResVReg = MIRBuilder.getMRI()->createVirtualRegister(&SPIRV::iIDRegClass);
-  SPIRVType *RetType = GR->assignTypeToVReg(
+  SPIRVTypeInst RetType = GR->assignTypeToVReg(
       OrigRetTy, ResVReg, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
 
   // Emit the call instruction and its args.
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
index acd9499d53da7..7ea8ec00440de 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.cpp
@@ -251,7 +251,7 @@ bool SPIRVCombinerHelper::matchMatrixMultiply(MachineInstr &MI) const {
 
 SmallVector<Register, 4>
 SPIRVCombinerHelper::extractColumns(Register MatrixReg, uint32_t NumberOfCols,
-                                    SPIRVType *SpvColType,
+                                    SPIRVTypeInst SpvColType,
                                     SPIRVGlobalRegistry *GR) const {
   // If the matrix is a single colunm, return that single column.
   if (NumberOfCols == 1)
@@ -270,7 +270,7 @@ SPIRVCombinerHelper::extractColumns(Register MatrixReg, uint32_t NumberOfCols,
 
 SmallVector<Register, 4>
 SPIRVCombinerHelper::extractRows(Register MatrixReg, uint32_t NumRows,
-                                 uint32_t NumCols, SPIRVType *SpvRowType,
+                                 uint32_t NumCols, SPIRVTypeInst SpvRowType,
                                  SPIRVGlobalRegistry *GR) const {
   SmallVector<Register, 4> Rows;
   LLT VecTy = GR->getRegType(SpvRowType);
@@ -307,10 +307,10 @@ SPIRVCombinerHelper::extractRows(Register MatrixReg, uint32_t NumRows,
 }
 
 Register SPIRVCombinerHelper::computeDotProduct(Register RowA, Register ColB,
-                                                SPIRVType *SpvVecType,
+                                                SPIRVTypeInst SpvVecType,
                                                 SPIRVGlobalRegistry *GR) const {
   bool IsVectorOp = SpvVecType->getOpcode() == SPIRV::OpTypeVector;
-  SPIRVType *SpvScalarType = GR->getScalarOrVectorComponentType(SpvVecType);
+  SPIRVTypeInst SpvScalarType = GR->getScalarOrVectorComponentType(SpvVecType);
   bool IsFloatOp = SpvScalarType->getOpcode() == SPIRV::OpTypeFloat;
   LLT VecTy = GR->getRegType(SpvVecType);
 
@@ -336,7 +336,7 @@ Register SPIRVCombinerHelper::computeDotProduct(Register RowA, Register ColB,
 SmallVector<Register, 16>
 SPIRVCombinerHelper::computeDotProducts(const SmallVector<Register, 4> &RowsA,
                                         const SmallVector<Register, 4> &ColsB,
-                                        SPIRVType *SpvVecType,
+                                        SPIRVTypeInst SpvVecType,
                                         SPIRVGlobalRegistry *GR) const {
   SmallVector<Register, 16> ResultScalars;
   for (uint32_t J = 0; J < ColsB.size(); ++J) {
@@ -348,7 +348,7 @@ SPIRVCombinerHelper::computeDotProducts(const SmallVector<Register, 4> &RowsA,
   return ResultScalars;
 }
 
-SPIRVType *
+SPIRVTypeInst
 SPIRVCombinerHelper::getDotProductVectorType(Register ResReg, uint32_t K,
                                              SPIRVGlobalRegistry *GR) const {
   // Loop over all non debug uses of ResReg
@@ -389,7 +389,7 @@ void SPIRVCombinerHelper::applyMatrixMultiply(MachineInstr &MI) const {
   SPIRVGlobalRegistry *GR =
       MI.getMF()->getSubtarget<SPIRVSubtarget>().getSPIRVGlobalRegistry();
 
-  SPIRVType *SpvVecType = getDotProductVectorType(ResReg, NumColsA, GR);
+  SPIRVTypeInst SpvVecType = getDotProductVectorType(ResReg, NumColsA, GR);
   SmallVector<Register, 4> ColsB =
       extractColumns(BReg, NumColsB, SpvVecType, GR);
   SmallVector<Register, 4> RowsA =
diff --git a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
index b6b3b36f03ade..ea70c83c2a531 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
+++ b/llvm/lib/Target/SPIRV/SPIRVCombinerHelper.h
@@ -39,20 +39,21 @@ class SPIRVCombinerHelper : public CombinerHelper {
   void applyMatrixMultiply(MachineInstr &MI) const;
 
 private:
-  SPIRVType *getDotProductVectorType(Register ResReg, uint32_t K,
-                                     SPIRVGlobalRegistry *GR) const;
+  SPIRVTypeInst getDotProductVectorType(Register ResReg, uint32_t K,
+                                        SPIRVGlobalRegistry *GR) const;
   SmallVector<Register, 4> extractColumns(Register BReg, uint32_t N,
-                                          SPIRVType *SpvVecType,
+                                          SPIRVTypeInst SpvVecType,
                                           SPIRVGlobalRegistry *GR) const;
   SmallVector<Register, 4> extractRows(Register AReg, uint32_t NumRows,
-                                       uint32_t NumCols, SPIRVType *SpvRowType,
+                                       uint32_t NumCols,
+                                       SPIRVTypeInst SpvRowType,
                                        SPIRVGlobalRegistry *GR) const;
   SmallVector<Register, 16>
   computeDotProducts(const SmallVector<Register, 4> &RowsA,
                      const SmallVector<Register, 4> &ColsB,
-                     SPIRVType *SpvVecType, SPIRVGlobalRegistry *GR) const;
+                     SPIRVTypeInst SpvVecType, SPIRVGlobalRegistry *GR) const;
   Register computeDotProduct(Register RowA, Register ColB,
-                             SPIRVType *SpvVecType,
+                             SPIRVTypeInst SpvVecType,
                              SPIRVGlobalRegistry *GR) const;
 };
 
diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitNonSemanticDI.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitNonSemanticDI.cpp
index 318ef0679ba03..a9208f00c1113 100644
--- a/llvm/lib/Target/SPIRV/SPIRVEmitNonSemanticDI.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVEmitNonSemanticDI.cpp
@@ -184,7 +184,7 @@ bool SPIRVEmitNonSemanticDI::emitGlobalDI(MachineFunction &MF) {
       return StrReg;
     };
 
-    const SPIRVType *VoidTy =
+    const SPIRVTypeInst VoidTy =
         GR->getOrCreateSPIRVType(Type::getVoidTy(*Context), MIRBuilder,
                                  SPIRV::AccessQualifier::ReadWrite, false);
 
@@ -209,7 +209,7 @@ bool SPIRVEmitNonSemanticDI::emitGlobalDI(MachineFunction &MF) {
           return InstReg;
         };
 
-    const SPIRVType *I32Ty =
+    const SPIRVTypeInst I32Ty =
         GR->getOrCreateSPIRVType(Type::getInt32Ty(*Context), MIRBuilder,
                                  SPIRV::AccessQualifier::ReadWrite, false);
 
diff --git a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp
index 14f1c97741ccc..76b46cd82554c 100644
--- a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp
@@ -91,43 +91,43 @@ storageClassRequiresExplictLayout(SPIRV::StorageClass::StorageClass SC) {
 SPIRVGlobalRegistry::SPIRVGlobalRegistry(unsigned PointerSize)
     : PointerSize(PointerSize), Bound(0), CurMF(nullptr) {}
 
-SPIRVType *SPIRVGlobalRegistry::assignIntTypeToVReg(unsigned BitWidth,
-                                                    Register VReg,
-                                                    MachineInstr &I,
-                                                    const SPIRVInstrInfo &TII) {
-  SPIRVType *SpirvType = getOrCreateSPIRVIntegerType(BitWidth, I, TII);
+SPIRVTypeInst
+SPIRVGlobalRegistry::assignIntTypeToVReg(unsigned BitWidth, Register VReg,
+                                         MachineInstr &I,
+                                         const SPIRVInstrInfo &TII) {
+  SPIRVTypeInst SpirvType = getOrCreateSPIRVIntegerType(BitWidth, I, TII);
   assignSPIRVTypeToVReg(SpirvType, VReg, *CurMF);
   return SpirvType;
 }
 
-SPIRVType *
+SPIRVTypeInst
 SPIRVGlobalRegistry::assignFloatTypeToVReg(unsigned BitWidth, Register VReg,
                                            MachineInstr &I,
                                            const SPIRVInstrInfo &TII) {
-  SPIRVType *SpirvType = getOrCreateSPIRVFloatType(BitWidth, I, TII);
+  SPIRVTypeInst SpirvType = getOrCreateSPIRVFloatType(BitWidth, I, TII);
   assignSPIRVTypeToVReg(SpirvType, VReg, *CurMF);
   return SpirvType;
 }
 
-SPIRVType *SPIRVGlobalRegistry::assignVectTypeToVReg(
-    SPIRVType *BaseType, unsigned NumElements, Register VReg, MachineInstr &I,
-    const SPIRVInstrInfo &TII) {
-  SPIRVType *SpirvType =
+SPIRVTypeInst SPIRVGlobalRegistry::assignVectTypeToVReg(
+    SPIRVTypeInst BaseType, unsigned NumElements, Register VReg,
+    MachineInstr &I, const SPIRVInstrInfo &TII) {
+  SPIRVTypeInst SpirvType =
       getOrCreateSPIRVVectorType(BaseType, NumElements, I, TII);
   assignSPIRVTypeToVReg(SpirvType, VReg, *CurMF);
   return SpirvType;
 }
 
-SPIRVType *SPIRVGlobalRegistry::assignTypeToVReg(
+SPIRVTypeInst SPIRVGlobalRegistry::assignTypeToVReg(
     const Type *Type, Register VReg, MachineIRBuilder &MIRBuilder,
     SPIRV::AccessQualifier::AccessQualifier AccessQual, bool EmitIR) {
-  SPIRVType *SpirvType =
+  SPIRVTypeInst SpirvType =
       getOrCreateSPIRVType(Type, MIRBuilder, AccessQual, EmitIR);
   assignSPIRVTypeToVReg(SpirvType, VReg, MIRBuilder.getMF());
   return SpirvType;
 }
 
-void SPIRVGlobalRegistry::assignSPIRVTypeToVReg(SPIRVType *SpirvType,
+void SPIRVGlobalRegistry::assignSPIRVTypeToVReg(SPIRVTypeInst SpirvType,
                                                 Register VReg,
                                                 const MachineFunction &MF) {
   VRegToTypeMap[&MF][VReg] = SpirvType;
@@ -143,7 +143,7 @@ inline Register createTypeVReg(MachineIRBuilder &MIRBuilder) {
   return createTypeVReg(MIRBuilder.getMF().getRegInfo());
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOpTypeBool(MachineIRBuilder &MIRBuilder) {
+SPIRVTypeInst SPIRVGlobalRegistry::getOpTypeBool(MachineIRBuilder &MIRBuilder) {
   return createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
     return MIRBuilder.buildInstr(SPIRV::OpTypeBool)
         .addDef(createTypeVReg(MIRBuilder));
@@ -169,9 +169,9 @@ unsigned SPIRVGlobalRegistry::adjustOpTypeIntWidth(unsigned Width) const {
   reportFatalUsageError("Unsupported Integer width!");
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOpTypeInt(unsigned Width,
-                                             MachineIRBuilder &MIRBuilder,
-                                             bool IsSigned) {
+SPIRVTypeInst SPIRVGlobalRegistry::getOpTypeInt(unsigned Width,
+                                                MachineIRBuilder &MIRBuilder,
+                                                bool IsSigned) {
   Width = adjustOpTypeIntWidth(Width);
   const SPIRVSubtarget &ST =
       cast<SPIRVSubtarget>(MIRBuilder.getMF().getSubtarget());
@@ -196,8 +196,9 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeInt(unsigned Width,
   });
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOpTypeFloat(uint32_t Width,
-                                               MachineIRBuilder &MIRBuilder) {
+SPIRVTypeInst
+SPIRVGlobalRegistry::getOpTypeFloat(uint32_t Width,
+                                    MachineIRBuilder &MIRBuilder) {
   return createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
     return MIRBuilder.buildInstr(SPIRV::OpTypeFloat)
         .addDef(createTypeVReg(MIRBuilder))
@@ -205,7 +206,7 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeFloat(uint32_t Width,
   });
 }
 
-SPIRVType *
+SPIRVTypeInst
 SPIRVGlobalRegistry::getOpTypeFloat(uint32_t Width,
                                     MachineIRBuilder &MIRBuilder,
                                     SPIRV::FPEncoding::FPEncoding FPEncode) {
@@ -217,7 +218,7 @@ SPIRVGlobalRegistry::getOpTypeFloat(uint32_t Width,
   });
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOpTypeVoid(MachineIRBuilder &MIRBuilder) {
+SPIRVTypeInst SPIRVGlobalRegistry::getOpTypeVoid(MachineIRBuilder &MIRBuilder) {
   return createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
     return MIRBuilder.buildInstr(SPIRV::OpTypeVoid)
         .addDef(createTypeVReg(MIRBuilder));
@@ -306,9 +307,9 @@ SPIRVType *SPIRVGlobalRegistry::createOpType(
   return Type;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOpTypeVector(uint32_t NumElems,
-                                                SPIRVType *ElemType,
-                                                MachineIRBuilder &MIRBuilder) {
+SPIRVTypeInst
+SPIRVGlobalRegistry::getOpTypeVector(uint32_t NumElems, SPIRVTypeInst ElemType,
+                                     MachineIRBuilder &MIRBuilder) {
   auto EleOpc = ElemType->getOpcode();
   (void)EleOpc;
   assert((EleOpc == SPIRV::OpTypeInt || EleOpc == SPIRV::OpTypeFloat ||
@@ -324,7 +325,7 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeVector(uint32_t NumElems,
 }
 
 Register SPIRVGlobalRegistry::getOrCreateConstFP(APFloat Val, MachineInstr &I,
-                                                 SPIRVType *SpvType,
+                                                 SPIRVTypeInst SpvType,
                                                  const SPIRVInstrInfo &TII,
                                                  bool ZeroAsNull) {
   LLVMContext &Ctx = CurMF->getFunction().getContext();
@@ -337,7 +338,8 @@ Register SPIRVGlobalRegistry::getOrCreateConstFP(APFloat Val, MachineInstr &I,
 }
 
 Register SPIRVGlobalRegistry::createConstFP(const ConstantFP *CF,
-                                            MachineInstr &I, SPIRVType *SpvType,
+                                            MachineInstr &I,
+                                            SPIRVTypeInst SpvType,
                                             const SPIRVInstrInfo &TII,
                                             bool ZeroAsNull) {
   unsigned BitWidth = getScalarOrVectorBitWidth(SpvType);
@@ -346,7 +348,8 @@ Register SPIRVGlobalRegistry::createConstFP(const ConstantFP *CF,
   CurMF->getRegInfo().setRegClass(Res, &SPIRV::fIDRegClass);
   assignSPIRVTypeToVReg(SpvType, Res, *CurMF);
 
-  MachineInstr *DepMI = const_cast<MachineInstr *>(SpvType);
+  MachineInstr *DepMI =
+      const_cast<MachineInstr *>(static_cast<const MachineInstr *>(SpvType));
   MachineIRBuilder MIRBuilder(*DepMI->getParent(), DepMI->getIterator());
   SPIRVType *NewType =
       createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
@@ -375,7 +378,7 @@ Register SPIRVGlobalRegistry::createConstFP(const ConstantFP *CF,
 }
 
 Register SPIRVGlobalRegistry::getOrCreateConstInt(uint64_t Val, MachineInstr &I,
-                                                  SPIRVType *SpvType,
+                                                  SPIRVTypeInst SpvType,
                                                   const SPIRVInstrInfo &TII,
                                                   bool ZeroAsNull) {
   return getOrCreateConstInt(APInt(getScalarOrVectorBitWidth(SpvType), Val), I,
@@ -384,7 +387,7 @@ Register SPIRVGlobalRegistry::getOrCreateConstInt(uint64_t Val, MachineInstr &I,
 
 Register SPIRVGlobalRegistry::getOrCreateConstInt(const APInt &Val,
                                                   MachineInstr &I,
-                                                  const SPIRVType *SpvType,
+                                                  SPIRVTypeInst SpvType,
                                                   const SPIRVInstrInfo &TII,
                                                   bool ZeroAsNull) {
   auto *const CI = ConstantInt::get(
@@ -398,7 +401,7 @@ Register SPIRVGlobalRegistry::getOrCreateConstInt(const APInt &Val,
 
 Register SPIRVGlobalRegistry::createConstInt(const ConstantInt *CI,
                                              MachineInstr &I,
-                                             SPIRVType *SpvType,
+                                             SPIRVTypeInst SpvType,
                                              const SPIRVInstrInfo &TII,
                                              bool ZeroAsNull) {
   unsigned BitWidth = getScalarOrVectorBitWidth(SpvType);
@@ -407,7 +410,8 @@ Register SPIRVGlobalRegistry::createConstInt(const ConstantInt *CI,
   CurMF->getRegInfo().setRegClass(Res, &SPIRV::iIDRegClass);
   assignIntTypeToVReg(BitWidth, Res, I, TII);
 
-  MachineInstr *DepMI = const_cast<MachineInstr *>(SpvType);
+  MachineInstr *DepMI =
+      const_cast<MachineInstr *>(static_cast<const MachineInstr *>(SpvType));
   MachineIRBuilder MIRBuilder(*DepMI->getParent(), DepMI->getIterator());
   SPIRVType *NewType =
       createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
@@ -440,8 +444,8 @@ Register SPIRVGlobalRegistry::createConstInt(const ConstantInt *CI,
 
 Register SPIRVGlobalRegistry::buildConstantInt(uint64_t Val,
                                                MachineIRBuilder &MIRBuilder,
-                                               SPIRVType *SpvType, bool EmitIR,
-                                               bool ZeroAsNull) {
+                                               SPIRVTypeInst SpvType,
+                                               bool EmitIR, bool ZeroAsNull) {
   assert(SpvType);
   auto &MF = MIRBuilder.getMF();
   const IntegerType *Ty = cast<IntegerType>(getTypeForSPIRVType(SpvType));
@@ -489,7 +493,7 @@ Register SPIRVGlobalRegistry::buildConstantInt(uint64_t Val,
 
 Register SPIRVGlobalRegistry::buildConstantFP(APFloat Val,
                                               MachineIRBuilder &MIRBuilder,
-                                              SPIRVType *SpvType) {
+                                              SPIRVTypeInst SpvType) {
   auto &MF = MIRBuilder.getMF();
   LLVMContext &Ctx = MF.getFunction().getContext();
   if (!SpvType)
@@ -519,27 +523,27 @@ Register SPIRVGlobalRegistry::buildConstantFP(APFloat Val,
 }
 
 Register SPIRVGlobalRegistry::getOrCreateBaseRegister(
-    Constant *Val, MachineInstr &I, SPIRVType *SpvType,
+    Constant *Val, MachineInstr &I, SPIRVTypeInst SpvType,
     const SPIRVInstrInfo &TII, unsigned BitWidth, bool ZeroAsNull) {
-  SPIRVType *Type = SpvType;
+  SPIRVTypeInst Type = SpvType;
   if (SpvType->getOpcode() == SPIRV::OpTypeVector ||
       SpvType->getOpcode() == SPIRV::OpTypeArray) {
     auto EleTypeReg = SpvType->getOperand(1).getReg();
     Type = getSPIRVTypeForVReg(EleTypeReg);
   }
   if (Type->getOpcode() == SPIRV::OpTypeFloat) {
-    SPIRVType *SpvBaseType = getOrCreateSPIRVFloatType(BitWidth, I, TII);
+    SPIRVTypeInst SpvBaseType = getOrCreateSPIRVFloatType(BitWidth, I, TII);
     return getOrCreateConstFP(cast<ConstantFP>(Val)->getValue(), I, SpvBaseType,
                               TII, ZeroAsNull);
   }
   assert(Type->getOpcode() == SPIRV::OpTypeInt);
-  SPIRVType *SpvBaseType = getOrCreateSPIRVIntegerType(BitWidth, I, TII);
+  SPIRVTypeInst SpvBaseType = getOrCreateSPIRVIntegerType(BitWidth, I, TII);
   return getOrCreateConstInt(Val->getUniqueInteger(), I, SpvBaseType, TII,
                              ZeroAsNull);
 }
 
 Register SPIRVGlobalRegistry::getOrCreateCompositeOrNull(
-    Constant *Val, MachineInstr &I, SPIRVType *SpvType,
+    Constant *Val, MachineInstr &I, SPIRVTypeInst SpvType,
     const SPIRVInstrInfo &TII, Constant *CA, unsigned BitWidth,
     unsigned ElemCnt, bool ZeroAsNull) {
   if (Register R = find(CA, CurMF); R.isValid())
@@ -556,7 +560,8 @@ Register SPIRVGlobalRegistry::getOrCreateCompositeOrNull(
   CurMF->getRegInfo().setRegClass(Res, getRegClass(SpvType));
   assignSPIRVTypeToVReg(SpvType, Res, *CurMF);
 
-  MachineInstr *DepMI = const_cast<MachineInstr *>(SpvType);
+  MachineInstr *DepMI =
+      const_cast<MachineInstr *>(static_cast<const MachineInstr *>(SpvType));
   MachineIRBuilder MIRBuilder(*DepMI->getParent(), DepMI->getIterator());
   const MachineInstr *NewMI =
       createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
@@ -584,7 +589,7 @@ Register SPIRVGlobalRegistry::getOrCreateCompositeOrNull(
 
 Register SPIRVGlobalRegistry::getOrCreateConstVector(uint64_t Val,
                                                      MachineInstr &I,
-                                                     SPIRVType *SpvType,
+                                                     SPIRVTypeInst SpvType,
                                                      const SPIRVInstrInfo &TII,
                                                      bool ZeroAsNull) {
   return getOrCreateConstVector(APInt(getScalarOrVectorBitWidth(SpvType), Val),
@@ -593,7 +598,7 @@ Register SPIRVGlobalRegistry::getOrCreateConstVector(uint64_t Val,
 
 Register SPIRVGlobalRegistry::getOrCreateConstVector(const APInt &Val,
                                                      MachineInstr &I,
-                                                     const SPIRVType *SpvType,
+                                                     SPIRVTypeInst SpvType,
                                                      const SPIRVInstrInfo &TII,
                                                      bool ZeroAsNull) {
   const Type *LLVMTy = getTypeForSPIRVType(SpvType);
@@ -614,7 +619,7 @@ Register SPIRVGlobalRegistry::getOrCreateConstVector(const APInt &Val,
 
 Register SPIRVGlobalRegistry::getOrCreateConstVector(APFloat Val,
                                                      MachineInstr &I,
-                                                     SPIRVType *SpvType,
+                                                     SPIRVTypeInst SpvType,
                                                      const SPIRVInstrInfo &TII,
                                                      bool ZeroAsNull) {
   const Type *LLVMTy = getTypeForSPIRVType(SpvType);
@@ -632,14 +637,15 @@ Register SPIRVGlobalRegistry::getOrCreateConstVector(APFloat Val,
 }
 
 Register SPIRVGlobalRegistry::getOrCreateConstIntArray(
-    uint64_t Val, size_t Num, MachineInstr &I, SPIRVType *SpvType,
+    uint64_t Val, size_t Num, MachineInstr &I, SPIRVTypeInst SpvType,
     const SPIRVInstrInfo &TII) {
   const Type *LLVMTy = getTypeForSPIRVType(SpvType);
   assert(LLVMTy->isArrayTy());
   const ArrayType *LLVMArrTy = cast<ArrayType>(LLVMTy);
   Type *LLVMBaseTy = LLVMArrTy->getElementType();
   Constant *CI = ConstantInt::get(LLVMBaseTy, Val);
-  SPIRVType *SpvBaseTy = getSPIRVTypeForVReg(SpvType->getOperand(1).getReg());
+  SPIRVTypeInst SpvBaseTy =
+      getSPIRVTypeForVReg(SpvType->getOperand(1).getReg());
   unsigned BW = getScalarOrVectorBitWidth(SpvBaseTy);
   // The following is reasonably unique key that is better that [Val]. The naive
   // alternative would be something along the lines of:
@@ -658,14 +664,15 @@ Register SPIRVGlobalRegistry::getOrCreateConstIntArray(
 }
 
 Register SPIRVGlobalRegistry::getOrCreateIntCompositeOrNull(
-    uint64_t Val, MachineIRBuilder &MIRBuilder, SPIRVType *SpvType, bool EmitIR,
-    Constant *CA, unsigned BitWidth, unsigned ElemCnt) {
+    uint64_t Val, MachineIRBuilder &MIRBuilder, SPIRVTypeInst SpvType,
+    bool EmitIR, Constant *CA, unsigned BitWidth, unsigned ElemCnt) {
   if (Register R = find(CA, CurMF); R.isValid())
     return R;
 
   Register ElemReg;
   if (Val || EmitIR) {
-    SPIRVType *SpvBaseType = getOrCreateSPIRVIntegerType(BitWidth, MIRBuilder);
+    SPIRVTypeInst SpvBaseType =
+        getOrCreateSPIRVIntegerType(BitWidth, MIRBuilder);
     ElemReg = buildConstantInt(Val, MIRBuilder, SpvBaseType, EmitIR);
   }
   LLT LLTy = EmitIR ? LLT::fixed_vector(ElemCnt, BitWidth) : LLT::scalar(64);
@@ -695,10 +702,9 @@ Register SPIRVGlobalRegistry::getOrCreateIntCompositeOrNull(
   return Res;
 }
 
-Register
-SPIRVGlobalRegistry::getOrCreateConsIntVector(uint64_t Val,
-                                              MachineIRBuilder &MIRBuilder,
-                                              SPIRVType *SpvType, bool EmitIR) {
+Register SPIRVGlobalRegistry::getOrCreateConsIntVector(
+    uint64_t Val, MachineIRBuilder &MIRBuilder, SPIRVTypeInst SpvType,
+    bool EmitIR) {
   const Type *LLVMTy = getTypeForSPIRVType(SpvType);
   assert(LLVMTy->isVectorTy());
   const FixedVectorType *LLVMVecTy = cast<FixedVectorType>(LLVMTy);
@@ -714,7 +720,7 @@ SPIRVGlobalRegistry::getOrCreateConsIntVector(uint64_t Val,
 
 Register
 SPIRVGlobalRegistry::getOrCreateConstNullPtr(MachineIRBuilder &MIRBuilder,
-                                             SPIRVType *SpvType) {
+                                             SPIRVTypeInst SpvType) {
   const Type *Ty = getTypeForSPIRVType(SpvType);
   unsigned AddressSpace = typeToAddressSpace(Ty);
   Type *ElemTy = ::getPointeeType(Ty);
@@ -748,7 +754,7 @@ SPIRVGlobalRegistry::buildConstantSampler(Register ResReg, unsigned AddrMode,
       ResReg.isValid()
           ? ResReg
           : MIRBuilder.getMRI()->createVirtualRegister(&SPIRV::iIDRegClass);
-  SPIRVType *TypeSampler = getOrCreateOpTypeSampler(MIRBuilder);
+  SPIRVTypeInst TypeSampler = getOrCreateOpTypeSampler(MIRBuilder);
   Register TypeSamplerReg = getSPIRVTypeID(TypeSampler);
   // We cannot use createOpType() logic here, because of the
   // GlobalISel/IRTranslator.cpp check for a tail call that expects that
@@ -765,7 +771,7 @@ SPIRVGlobalRegistry::buildConstantSampler(Register ResReg, unsigned AddrMode,
 }
 
 Register SPIRVGlobalRegistry::buildGlobalVariable(
-    Register ResVReg, SPIRVType *BaseType, StringRef Name,
+    Register ResVReg, SPIRVTypeInst BaseType, StringRef Name,
     const GlobalValue *GV, SPIRV::StorageClass::StorageClass Storage,
     const MachineInstr *Init, bool IsConst,
     const std::optional<SPIRV::LinkageType::LinkageType> &LinkageType,
@@ -826,8 +832,8 @@ Register SPIRVGlobalRegistry::buildGlobalVariable(
     // Our knowledge about the type may be updated.
     // If that's the case, we need to update a type
     // associated with the register.
-    SPIRVType *DefType = getSPIRVTypeForVReg(ResVReg);
-    if (!DefType || DefType != BaseType)
+    SPIRVTypeInst DefType = getSPIRVTypeForVReg(ResVReg);
+    if (!DefType || DefType != SPIRVTypeInst(BaseType))
       assignSPIRVTypeToVReg(BaseType, Reg, MIRBuilder.getMF());
   }
 
@@ -870,7 +876,7 @@ Register SPIRVGlobalRegistry::buildGlobalVariable(
 // decorations, and will return the same string for two types that are the same
 // except for decorations.
 Register SPIRVGlobalRegistry::getOrCreateGlobalVariableWithBinding(
-    const SPIRVType *VarType, uint32_t Set, uint32_t Binding, StringRef Name,
+    SPIRVTypeInst VarType, uint32_t Set, uint32_t Binding, StringRef Name,
     MachineIRBuilder &MIRBuilder) {
   Register VarReg =
       MIRBuilder.getMRI()->createVirtualRegister(&SPIRV::iIDRegClass);
@@ -886,15 +892,15 @@ Register SPIRVGlobalRegistry::getOrCreateGlobalVariableWithBinding(
 
 // TODO: Double check the calls to getOpTypeArray to make sure that `ElemType`
 // is explicitly laid out when required.
-SPIRVType *SPIRVGlobalRegistry::getOpTypeArray(uint32_t NumElems,
-                                               SPIRVType *ElemType,
-                                               MachineIRBuilder &MIRBuilder,
-                                               bool ExplicitLayoutRequired,
-                                               bool EmitIR) {
+SPIRVTypeInst SPIRVGlobalRegistry::getOpTypeArray(uint32_t NumElems,
+                                                  SPIRVTypeInst ElemType,
+                                                  MachineIRBuilder &MIRBuilder,
+                                                  bool ExplicitLayoutRequired,
+                                                  bool EmitIR) {
   assert((ElemType->getOpcode() != SPIRV::OpTypeVoid) &&
          "Invalid array element type");
-  SPIRVType *SpvTypeInt32 = getOrCreateSPIRVIntegerType(32, MIRBuilder);
-  SPIRVType *ArrayType = nullptr;
+  SPIRVTypeInst SpvTypeInt32 = getOrCreateSPIRVIntegerType(32, MIRBuilder);
+  SPIRVTypeInst ArrayType = nullptr;
   const SPIRVSubtarget &ST =
       cast<SPIRVSubtarget>(MIRBuilder.getMF().getSubtarget());
   if (NumElems != 0) {
@@ -909,7 +915,7 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeArray(uint32_t NumElems,
   } else if (ST.getTargetTriple().getVendor() == Triple::VendorType::AMD) {
     // We set the array size to the token UINT64_MAX value, which is generally
     // illegal (the maximum legal size is 61-bits) for the foreseeable future.
-    SPIRVType *SpvTypeInt64 = getOrCreateSPIRVIntegerType(64, MIRBuilder);
+    SPIRVTypeInst SpvTypeInt64 = getOrCreateSPIRVIntegerType(64, MIRBuilder);
     Register NumElementsVReg =
         buildConstantInt(UINT64_MAX, MIRBuilder, SpvTypeInt64, EmitIR);
     ArrayType = createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
@@ -941,8 +947,9 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeArray(uint32_t NumElems,
   return ArrayType;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOpTypeOpaque(const StructType *Ty,
-                                                MachineIRBuilder &MIRBuilder) {
+SPIRVTypeInst
+SPIRVGlobalRegistry::getOpTypeOpaque(const StructType *Ty,
+                                     MachineIRBuilder &MIRBuilder) {
   assert(Ty->hasName());
   const StringRef Name = Ty->hasName() ? Ty->getName() : "";
   Register ResVReg = createTypeVReg(MIRBuilder);
@@ -954,14 +961,14 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeOpaque(const StructType *Ty,
   });
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOpTypeStruct(
+SPIRVTypeInst SPIRVGlobalRegistry::getOpTypeStruct(
     const StructType *Ty, MachineIRBuilder &MIRBuilder,
     SPIRV::AccessQualifier::AccessQualifier AccQual,
     StructOffsetDecorator Decorator, bool EmitIR) {
   Type *OriginalElementType = nullptr;
   uint64_t TotalSize = 0;
   if (matchPeeledArrayPattern(Ty, OriginalElementType, TotalSize)) {
-    SPIRVType *ElementSPIRVType = findSPIRVType(
+    SPIRVTypeInst ElementSPIRVType = findSPIRVType(
         OriginalElementType, MIRBuilder, AccQual,
         /* ExplicitLayoutRequired= */ Decorator != nullptr, EmitIR);
     return getOpTypeArray(TotalSize, ElementSPIRVType, MIRBuilder,
@@ -984,7 +991,7 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeStruct(
   }
 
   for (const auto &Elem : Ty->elements()) {
-    SPIRVType *ElemTy = findSPIRVType(
+    SPIRVTypeInst ElemTy = findSPIRVType(
         toTypedPointer(Elem), MIRBuilder, AccQual,
         /* ExplicitLayoutRequired= */ Decorator != nullptr, EmitIR);
     assert(ElemTy && ElemTy->getOpcode() != SPIRV::OpTypeVoid &&
@@ -997,7 +1004,7 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeStruct(
   if (Ty->isPacked() && !ST.isShader())
     buildOpDecorate(ResVReg, MIRBuilder, SPIRV::Decoration::CPacked, {});
 
-  SPIRVType *SPVType =
+  SPIRVTypeInst SPVType =
       createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
         auto MIBStruct =
             MIRBuilder.buildInstr(SPIRV::OpTypeStruct).addDef(ResVReg);
@@ -1019,15 +1026,15 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeStruct(
   return SPVType;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSpecialType(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateSpecialType(
     const Type *Ty, MachineIRBuilder &MIRBuilder,
     SPIRV::AccessQualifier::AccessQualifier AccQual) {
   assert(isSpecialOpaqueType(Ty) && "Not a special opaque builtin type");
   return SPIRV::lowerBuiltinType(Ty, AccQual, MIRBuilder, this);
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOpTypePointer(
-    SPIRV::StorageClass::StorageClass SC, SPIRVType *ElemType,
+SPIRVTypeInst SPIRVGlobalRegistry::getOpTypePointer(
+    SPIRV::StorageClass::StorageClass SC, SPIRVTypeInst ElemType,
     MachineIRBuilder &MIRBuilder, Register Reg) {
   if (!Reg.isValid())
     Reg = createTypeVReg(MIRBuilder);
@@ -1040,7 +1047,7 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypePointer(
   });
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOpTypeForwardPointer(
+SPIRVTypeInst SPIRVGlobalRegistry::getOpTypeForwardPointer(
     SPIRV::StorageClass::StorageClass SC, MachineIRBuilder &MIRBuilder) {
   return createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
     return MIRBuilder.buildInstr(SPIRV::OpTypeForwardPointer)
@@ -1049,9 +1056,9 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeForwardPointer(
   });
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOpTypeFunction(
-    const FunctionType *Ty, SPIRVType *RetType,
-    const SmallVectorImpl<SPIRVType *> &ArgTypes,
+SPIRVTypeInst SPIRVGlobalRegistry::getOpTypeFunction(
+    const FunctionType *Ty, SPIRVTypeInst RetType,
+    const SmallVectorImpl<SPIRVTypeInst> &ArgTypes,
     MachineIRBuilder &MIRBuilder) {
   const SPIRVSubtarget *ST =
       static_cast<const SPIRVSubtarget *>(&MIRBuilder.getMF().getSubtarget());
@@ -1065,15 +1072,15 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeFunction(
     auto MIB = MIRBuilder.buildInstr(SPIRV::OpTypeFunction)
                    .addDef(createTypeVReg(MIRBuilder))
                    .addUse(getSPIRVTypeID(RetType));
-    for (const SPIRVType *ArgType : ArgTypes)
+    for (auto &ArgType : ArgTypes)
       MIB.addUse(getSPIRVTypeID(ArgType));
     return MIB;
   });
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeFunctionWithArgs(
-    const Type *Ty, SPIRVType *RetType,
-    const SmallVectorImpl<SPIRVType *> &ArgTypes,
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateOpTypeFunctionWithArgs(
+    const Type *Ty, SPIRVTypeInst RetType,
+    const SmallVectorImpl<SPIRVTypeInst> &ArgTypes,
     MachineIRBuilder &MIRBuilder) {
   if (const MachineInstr *MI = findMI(Ty, false, &MIRBuilder.getMF()))
     return MI;
@@ -1083,7 +1090,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeFunctionWithArgs(
   return finishCreatingSPIRVType(Ty, NewMI);
 }
 
-SPIRVType *SPIRVGlobalRegistry::findSPIRVType(
+SPIRVTypeInst SPIRVGlobalRegistry::findSPIRVType(
     const Type *Ty, MachineIRBuilder &MIRBuilder,
     SPIRV::AccessQualifier::AccessQualifier AccQual,
     bool ExplicitLayoutRequired, bool EmitIR) {
@@ -1098,7 +1105,7 @@ SPIRVType *SPIRVGlobalRegistry::findSPIRVType(
                                EmitIR);
 }
 
-Register SPIRVGlobalRegistry::getSPIRVTypeID(const SPIRVType *SpirvType) const {
+Register SPIRVGlobalRegistry::getSPIRVTypeID(SPIRVTypeInst SpirvType) const {
   assert(SpirvType && "Attempting to get type id for nullptr type.");
   if (SpirvType->getOpcode() == SPIRV::OpTypeForwardPointer ||
       SpirvType->getOpcode() == SPIRV::OpTypeStructContinuedINTEL)
@@ -1127,7 +1134,7 @@ const Type *SPIRVGlobalRegistry::adjustIntTypeByWidth(const Type *Ty) const {
   return Ty;
 }
 
-SPIRVType *SPIRVGlobalRegistry::createSPIRVType(
+SPIRVTypeInst SPIRVGlobalRegistry::createSPIRVType(
     const Type *Ty, MachineIRBuilder &MIRBuilder,
     SPIRV::AccessQualifier::AccessQualifier AccQual,
     bool ExplicitLayoutRequired, bool EmitIR) {
@@ -1154,15 +1161,15 @@ SPIRVType *SPIRVGlobalRegistry::createSPIRVType(
   if (Ty->isVoidTy())
     return getOpTypeVoid(MIRBuilder);
   if (Ty->isVectorTy()) {
-    SPIRVType *El =
+    SPIRVTypeInst El =
         findSPIRVType(cast<FixedVectorType>(Ty)->getElementType(), MIRBuilder,
                       AccQual, ExplicitLayoutRequired, EmitIR);
     return getOpTypeVector(cast<FixedVectorType>(Ty)->getNumElements(), El,
                            MIRBuilder);
   }
   if (Ty->isArrayTy()) {
-    SPIRVType *El = findSPIRVType(Ty->getArrayElementType(), MIRBuilder,
-                                  AccQual, ExplicitLayoutRequired, EmitIR);
+    SPIRVTypeInst El = findSPIRVType(Ty->getArrayElementType(), MIRBuilder,
+                                     AccQual, ExplicitLayoutRequired, EmitIR);
     return getOpTypeArray(Ty->getArrayNumElements(), El, MIRBuilder,
                           ExplicitLayoutRequired, EmitIR);
   }
@@ -1181,9 +1188,10 @@ SPIRVType *SPIRVGlobalRegistry::createSPIRVType(
                            EmitIR);
   }
   if (auto FType = dyn_cast<FunctionType>(Ty)) {
-    SPIRVType *RetTy = findSPIRVType(FType->getReturnType(), MIRBuilder,
-                                     AccQual, ExplicitLayoutRequired, EmitIR);
-    SmallVector<SPIRVType *, 4> ParamTypes;
+    SPIRVTypeInst RetTy =
+        findSPIRVType(FType->getReturnType(), MIRBuilder, AccQual,
+                      ExplicitLayoutRequired, EmitIR);
+    SmallVector<SPIRVTypeInst, 4> ParamTypes;
     for (const auto &ParamTy : FType->params())
       ParamTypes.push_back(findSPIRVType(ParamTy, MIRBuilder, AccQual,
                                          ExplicitLayoutRequired, EmitIR));
@@ -1191,7 +1199,7 @@ SPIRVType *SPIRVGlobalRegistry::createSPIRVType(
   }
 
   unsigned AddrSpace = typeToAddressSpace(Ty);
-  SPIRVType *SpvElementType = nullptr;
+  SPIRVTypeInst SpvElementType = nullptr;
   if (Type *ElemTy = ::getPointeeType(Ty))
     SpvElementType = getOrCreateSPIRVType(ElemTy, MIRBuilder, AccQual, EmitIR);
   else
@@ -1218,7 +1226,7 @@ SPIRVType *SPIRVGlobalRegistry::createSPIRVType(
   return getOrCreateSPIRVPointerType(ElemTy, MIRBuilder, SC);
 }
 
-SPIRVType *SPIRVGlobalRegistry::restOfCreateSPIRVType(
+SPIRVTypeInst SPIRVGlobalRegistry::restOfCreateSPIRVType(
     const Type *Ty, MachineIRBuilder &MIRBuilder,
     SPIRV::AccessQualifier::AccessQualifier AccessQual,
     bool ExplicitLayoutRequired, bool EmitIR) {
@@ -1227,8 +1235,8 @@ SPIRVType *SPIRVGlobalRegistry::restOfCreateSPIRVType(
   if (TypesInProcessing.count(Ty) && !isPointerTyOrWrapper(Ty))
     return nullptr;
   TypesInProcessing.insert(Ty);
-  SPIRVType *SpirvType = createSPIRVType(Ty, MIRBuilder, AccessQual,
-                                         ExplicitLayoutRequired, EmitIR);
+  SPIRVTypeInst SpirvType = createSPIRVType(Ty, MIRBuilder, AccessQual,
+                                            ExplicitLayoutRequired, EmitIR);
   TypesInProcessing.erase(Ty);
   VRegToTypeMap[&MIRBuilder.getMF()][getSPIRVTypeID(SpirvType)] = SpirvType;
 
@@ -1266,15 +1274,15 @@ SPIRVGlobalRegistry::getSPIRVTypeForVReg(Register VReg,
   return nullptr;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getResultType(Register VReg,
-                                              MachineFunction *MF) {
+SPIRVTypeInst SPIRVGlobalRegistry::getResultType(Register VReg,
+                                                 MachineFunction *MF) {
   if (!MF)
     MF = CurMF;
   MachineInstr *Instr = getVRegDef(MF->getRegInfo(), VReg);
   return getSPIRVTypeForVReg(Instr->getOperand(1).getReg(), MF);
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVType(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateSPIRVType(
     const Type *Ty, MachineIRBuilder &MIRBuilder,
     SPIRV::AccessQualifier::AccessQualifier AccessQual,
     bool ExplicitLayoutRequired, bool EmitIR) {
@@ -1295,15 +1303,15 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVType(
     return getSPIRVTypeForVReg(Reg);
 
   TypesInProcessing.clear();
-  SPIRVType *STy = restOfCreateSPIRVType(Ty, MIRBuilder, AccessQual,
-                                         ExplicitLayoutRequired, EmitIR);
+  SPIRVTypeInst STy = restOfCreateSPIRVType(Ty, MIRBuilder, AccessQual,
+                                            ExplicitLayoutRequired, EmitIR);
   // Create normal pointer types for the corresponding OpTypeForwardPointers.
   for (auto &CU : ForwardPointerTypes) {
     // Pointer type themselves do not require an explicit layout. The types
     // they pointer to might, but that is taken care of when creating the type.
     bool PtrNeedsLayout = false;
     const Type *Ty2 = CU.first;
-    SPIRVType *STy2 = CU.second;
+    SPIRVTypeInst STy2 = CU.second;
     if ((Reg = find(Ty2, PtrNeedsLayout, MF)).isValid())
       STy2 = getSPIRVTypeForVReg(Reg);
     else
@@ -1318,26 +1326,26 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVType(
 
 bool SPIRVGlobalRegistry::isScalarOfType(Register VReg,
                                          unsigned TypeOpcode) const {
-  SPIRVType *Type = getSPIRVTypeForVReg(VReg);
+  SPIRVTypeInst Type = getSPIRVTypeForVReg(VReg);
   assert(Type && "isScalarOfType VReg has no type assigned");
   return Type->getOpcode() == TypeOpcode;
 }
 
 bool SPIRVGlobalRegistry::isScalarOrVectorOfType(Register VReg,
                                                  unsigned TypeOpcode) const {
-  SPIRVType *Type = getSPIRVTypeForVReg(VReg);
+  SPIRVTypeInst Type = getSPIRVTypeForVReg(VReg);
   assert(Type && "isScalarOrVectorOfType VReg has no type assigned");
   if (Type->getOpcode() == TypeOpcode)
     return true;
   if (Type->getOpcode() == SPIRV::OpTypeVector) {
     Register ScalarTypeVReg = Type->getOperand(1).getReg();
-    SPIRVType *ScalarType = getSPIRVTypeForVReg(ScalarTypeVReg);
+    SPIRVTypeInst ScalarType = getSPIRVTypeForVReg(ScalarTypeVReg);
     return ScalarType->getOpcode() == TypeOpcode;
   }
   return false;
 }
 
-bool SPIRVGlobalRegistry::isResourceType(SPIRVType *Type) const {
+bool SPIRVGlobalRegistry::isResourceType(SPIRVTypeInst Type) const {
   switch (Type->getOpcode()) {
   case SPIRV::OpTypeImage:
   case SPIRV::OpTypeSampler:
@@ -1356,7 +1364,7 @@ SPIRVGlobalRegistry::getScalarOrVectorComponentCount(Register VReg) const {
 }
 
 unsigned
-SPIRVGlobalRegistry::getScalarOrVectorComponentCount(SPIRVType *Type) const {
+SPIRVGlobalRegistry::getScalarOrVectorComponentCount(SPIRVTypeInst Type) const {
   if (!Type)
     return 0;
   return Type->getOpcode() == SPIRV::OpTypeVector
@@ -1364,26 +1372,21 @@ SPIRVGlobalRegistry::getScalarOrVectorComponentCount(SPIRVType *Type) const {
              : 1;
 }
 
-SPIRVType *
-SPIRVGlobalRegistry::getScalarOrVectorComponentType(Register VReg) const {
-  return getScalarOrVectorComponentType(getSPIRVTypeForVReg(VReg));
-}
-
-SPIRVType *
-SPIRVGlobalRegistry::getScalarOrVectorComponentType(SPIRVType *Type) const {
+SPIRVTypeInst
+SPIRVGlobalRegistry::getScalarOrVectorComponentType(SPIRVTypeInst Type) const {
   if (!Type)
     return nullptr;
   Register ScalarReg = Type->getOpcode() == SPIRV::OpTypeVector
                            ? Type->getOperand(1).getReg()
                            : Type->getOperand(0).getReg();
-  SPIRVType *ScalarType = getSPIRVTypeForVReg(ScalarReg);
+  SPIRVTypeInst ScalarType = getSPIRVTypeForVReg(ScalarReg);
   assert(isScalarOrVectorOfType(Type->getOperand(0).getReg(),
                                 ScalarType->getOpcode()));
   return ScalarType;
 }
 
 unsigned
-SPIRVGlobalRegistry::getScalarOrVectorBitWidth(const SPIRVType *Type) const {
+SPIRVGlobalRegistry::getScalarOrVectorBitWidth(SPIRVTypeInst Type) const {
   assert(Type && "Invalid Type pointer");
   if (Type->getOpcode() == SPIRV::OpTypeVector) {
     auto EleTypeReg = Type->getOperand(1).getReg();
@@ -1398,7 +1401,7 @@ SPIRVGlobalRegistry::getScalarOrVectorBitWidth(const SPIRVType *Type) const {
 }
 
 unsigned SPIRVGlobalRegistry::getNumScalarOrVectorTotalBitWidth(
-    const SPIRVType *Type) const {
+    SPIRVTypeInst Type) const {
   assert(Type && "Invalid Type pointer");
   unsigned NumElements = 1;
   if (Type->getOpcode() == SPIRV::OpTypeVector) {
@@ -1411,31 +1414,31 @@ unsigned SPIRVGlobalRegistry::getNumScalarOrVectorTotalBitWidth(
              : 0;
 }
 
-const SPIRVType *SPIRVGlobalRegistry::retrieveScalarOrVectorIntType(
-    const SPIRVType *Type) const {
+SPIRVTypeInst
+SPIRVGlobalRegistry::retrieveScalarOrVectorIntType(SPIRVTypeInst Type) const {
   if (Type && Type->getOpcode() == SPIRV::OpTypeVector)
     Type = getSPIRVTypeForVReg(Type->getOperand(1).getReg());
   return Type && Type->getOpcode() == SPIRV::OpTypeInt ? Type : nullptr;
 }
 
-bool SPIRVGlobalRegistry::isScalarOrVectorSigned(const SPIRVType *Type) const {
-  const SPIRVType *IntType = retrieveScalarOrVectorIntType(Type);
+bool SPIRVGlobalRegistry::isScalarOrVectorSigned(SPIRVTypeInst Type) const {
+  SPIRVTypeInst IntType = retrieveScalarOrVectorIntType(Type);
   return IntType && IntType->getOperand(2).getImm() != 0;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getPointeeType(SPIRVType *PtrType) {
+SPIRVTypeInst SPIRVGlobalRegistry::getPointeeType(SPIRVTypeInst PtrType) {
   return PtrType && PtrType->getOpcode() == SPIRV::OpTypePointer
              ? getSPIRVTypeForVReg(PtrType->getOperand(2).getReg())
              : nullptr;
 }
 
 unsigned SPIRVGlobalRegistry::getPointeeTypeOp(Register PtrReg) {
-  SPIRVType *ElemType = getPointeeType(getSPIRVTypeForVReg(PtrReg));
+  SPIRVTypeInst ElemType = getPointeeType(getSPIRVTypeForVReg(PtrReg));
   return ElemType ? ElemType->getOpcode() : 0;
 }
 
-bool SPIRVGlobalRegistry::isBitcastCompatible(const SPIRVType *Type1,
-                                              const SPIRVType *Type2) const {
+bool SPIRVGlobalRegistry::isBitcastCompatible(SPIRVTypeInst Type1,
+                                              SPIRVTypeInst Type2) const {
   if (!Type1 || !Type2)
     return false;
   auto Op1 = Type1->getOpcode(), Op2 = Type2->getOpcode();
@@ -1455,19 +1458,19 @@ bool SPIRVGlobalRegistry::isBitcastCompatible(const SPIRVType *Type1,
 
 SPIRV::StorageClass::StorageClass
 SPIRVGlobalRegistry::getPointerStorageClass(Register VReg) const {
-  SPIRVType *Type = getSPIRVTypeForVReg(VReg);
+  SPIRVTypeInst Type = getSPIRVTypeForVReg(VReg);
   assert(Type && Type->getOpcode() == SPIRV::OpTypePointer &&
          Type->getOperand(1).isImm() && "Pointer type is expected");
   return getPointerStorageClass(Type);
 }
 
 SPIRV::StorageClass::StorageClass
-SPIRVGlobalRegistry::getPointerStorageClass(const SPIRVType *Type) const {
+SPIRVGlobalRegistry::getPointerStorageClass(SPIRVTypeInst Type) const {
   return static_cast<SPIRV::StorageClass::StorageClass>(
       Type->getOperand(1).getImm());
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateVulkanBufferType(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateVulkanBufferType(
     MachineIRBuilder &MIRBuilder, Type *ElemType,
     SPIRV::StorageClass::StorageClass SC, bool IsWritable, bool EmitIr) {
   auto Key = SPIRV::irhandle_vkbuffer(ElemType, SC, IsWritable);
@@ -1478,7 +1481,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateVulkanBufferType(
   // We need to get the SPIR-V type for the element here, so we can add the
   // decoration to it.
   auto *T = StructType::create(ElemType);
-  auto *BlockType =
+  SPIRVTypeInst BlockType =
       getOrCreateSPIRVType(T, MIRBuilder, SPIRV::AccessQualifier::None,
                            ExplicitLayoutRequired, EmitIr);
 
@@ -1490,24 +1493,25 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateVulkanBufferType(
                           SPIRV::Decoration::NonWritable, 0, {});
   }
 
-  SPIRVType *R = getOrCreateSPIRVPointerTypeInternal(BlockType, MIRBuilder, SC);
+  SPIRVTypeInst R =
+      getOrCreateSPIRVPointerTypeInternal(BlockType, MIRBuilder, SC);
   add(Key, R);
   return R;
 }
 
-SPIRVType *
+SPIRVTypeInst
 SPIRVGlobalRegistry::getOrCreatePaddingType(MachineIRBuilder &MIRBuilder) {
   auto Key = SPIRV::irhandle_padding();
   if (const MachineInstr *MI = findMI(Key, &MIRBuilder.getMF()))
     return MI;
   auto *T = Type::getInt8Ty(MIRBuilder.getContext());
-  SPIRVType *R = getOrCreateSPIRVIntegerType(8, MIRBuilder);
+  SPIRVTypeInst R = getOrCreateSPIRVIntegerType(8, MIRBuilder);
   finishCreatingSPIRVType(T, R);
   add(Key, R);
   return R;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateVulkanPushConstantType(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateVulkanPushConstantType(
     MachineIRBuilder &MIRBuilder, Type *T) {
   const auto SC = SPIRV::StorageClass::PushConstant;
 
@@ -1517,18 +1521,18 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateVulkanPushConstantType(
 
   // We need to get the SPIR-V type for the element here, so we can add the
   // decoration to it.
-  auto *BlockType = getOrCreateSPIRVType(
+  SPIRVTypeInst BlockType = getOrCreateSPIRVType(
       T, MIRBuilder, SPIRV::AccessQualifier::None,
       /* ExplicitLayoutRequired= */ true, /* EmitIr= */ false);
 
   buildOpDecorate(BlockType->defs().begin()->getReg(), MIRBuilder,
                   SPIRV::Decoration::Block, {});
-  SPIRVType *R = BlockType;
+  SPIRVTypeInst R = BlockType;
   add(Key, R);
   return R;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateLayoutType(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateLayoutType(
     MachineIRBuilder &MIRBuilder, const TargetExtType *T, bool EmitIr) {
   auto Key = SPIRV::handle(T);
   if (const MachineInstr *MI = findMI(Key, &MIRBuilder.getMF()))
@@ -1548,20 +1552,20 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateLayoutType(
   // We need a new OpTypeStruct instruction because decorations will be
   // different from a struct with an explicit layout created from a different
   // entry point.
-  SPIRVType *SPIRVStructType =
+  SPIRVTypeInst SPIRVStructType =
       getOpTypeStruct(ST, MIRBuilder, SPIRV::AccessQualifier::None,
                       std::move(Decorator), EmitIr);
   add(Key, SPIRVStructType);
   return SPIRVStructType;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getImageType(
+SPIRVTypeInst SPIRVGlobalRegistry::getImageType(
     const TargetExtType *ExtensionType,
     const SPIRV::AccessQualifier::AccessQualifier Qualifier,
     MachineIRBuilder &MIRBuilder) {
   assert(ExtensionType->getNumTypeParameters() == 1 &&
          "SPIR-V image builtin type must have sampled type parameter!");
-  const SPIRVType *SampledType =
+  const SPIRVTypeInst SampledType =
       getOrCreateSPIRVType(ExtensionType->getTypeParameter(0), MIRBuilder,
                            SPIRV::AccessQualifier::ReadWrite, true);
   assert((ExtensionType->getNumIntParameters() == 7 ||
@@ -1578,7 +1582,7 @@ SPIRVType *SPIRVGlobalRegistry::getImageType(
   }
 
   // Create or get an existing type from GlobalRegistry.
-  SPIRVType *R = getOrCreateOpTypeImage(
+  SPIRVTypeInst R = getOrCreateOpTypeImage(
       MIRBuilder, SampledType,
       SPIRV::Dim::Dim(ExtensionType->getIntParameter(0)),
       ExtensionType->getIntParameter(1), ExtensionType->getIntParameter(2),
@@ -1589,9 +1593,10 @@ SPIRVType *SPIRVGlobalRegistry::getImageType(
   return R;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeImage(
-    MachineIRBuilder &MIRBuilder, SPIRVType *SampledType, SPIRV::Dim::Dim Dim,
-    uint32_t Depth, uint32_t Arrayed, uint32_t Multisampled, uint32_t Sampled,
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateOpTypeImage(
+    MachineIRBuilder &MIRBuilder, SPIRVTypeInst SampledType,
+    SPIRV::Dim::Dim Dim, uint32_t Depth, uint32_t Arrayed,
+    uint32_t Multisampled, uint32_t Sampled,
     SPIRV::ImageFormat::ImageFormat ImageFormat,
     SPIRV::AccessQualifier::AccessQualifier AccessQual) {
   auto Key = SPIRV::irhandle_image(SPIRVToLLVMType.lookup(SampledType), Dim,
@@ -1619,7 +1624,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeImage(
   return NewMI;
 }
 
-SPIRVType *
+SPIRVTypeInst
 SPIRVGlobalRegistry::getOrCreateOpTypeSampler(MachineIRBuilder &MIRBuilder) {
   auto Key = SPIRV::irhandle_sampler();
   const MachineFunction *MF = &MIRBuilder.getMF();
@@ -1634,7 +1639,7 @@ SPIRVGlobalRegistry::getOrCreateOpTypeSampler(MachineIRBuilder &MIRBuilder) {
   return NewMI;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypePipe(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateOpTypePipe(
     MachineIRBuilder &MIRBuilder,
     SPIRV::AccessQualifier::AccessQualifier AccessQual) {
   auto Key = SPIRV::irhandle_pipe(AccessQual);
@@ -1650,7 +1655,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypePipe(
   return NewMI;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeDeviceEvent(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateOpTypeDeviceEvent(
     MachineIRBuilder &MIRBuilder) {
   auto Key = SPIRV::irhandle_event();
   if (const MachineInstr *MI = findMI(Key, &MIRBuilder.getMF()))
@@ -1664,8 +1669,8 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeDeviceEvent(
   return NewMI;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeSampledImage(
-    SPIRVType *ImageType, MachineIRBuilder &MIRBuilder) {
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateOpTypeSampledImage(
+    SPIRVTypeInst ImageType, MachineIRBuilder &MIRBuilder) {
   auto Key = SPIRV::irhandle_sampled_image(
       SPIRVToLLVMType.lookup(MIRBuilder.getMF().getRegInfo().getVRegDef(
           ImageType->getOperand(1).getReg())),
@@ -1682,16 +1687,17 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeSampledImage(
   return NewMI;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeCoopMatr(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateOpTypeCoopMatr(
     MachineIRBuilder &MIRBuilder, const TargetExtType *ExtensionType,
-    const SPIRVType *ElemType, uint32_t Scope, uint32_t Rows, uint32_t Columns,
+    SPIRVTypeInst ElemType, uint32_t Scope, uint32_t Rows, uint32_t Columns,
     uint32_t Use, bool EmitIR) {
   if (const MachineInstr *MI =
           findMI(ExtensionType, false, &MIRBuilder.getMF()))
     return MI;
   const MachineInstr *NewMI =
       createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
-        SPIRVType *SpvTypeInt32 = getOrCreateSPIRVIntegerType(32, MIRBuilder);
+        SPIRVTypeInst SpvTypeInt32 =
+            getOrCreateSPIRVIntegerType(32, MIRBuilder);
         const Type *ET = getTypeForSPIRVType(ElemType);
         if (ET->isIntegerTy() && ET->getIntegerBitWidth() == 4 &&
             cast<SPIRVSubtarget>(MIRBuilder.getMF().getSubtarget())
@@ -1711,7 +1717,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeCoopMatr(
   return NewMI;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeByOpcode(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateOpTypeByOpcode(
     const Type *Ty, MachineIRBuilder &MIRBuilder, unsigned Opcode) {
   if (const MachineInstr *MI = findMI(Ty, false, &MIRBuilder.getMF()))
     return MI;
@@ -1723,7 +1729,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeByOpcode(
   return NewMI;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateUnknownType(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateUnknownType(
     const Type *Ty, MachineIRBuilder &MIRBuilder, unsigned Opcode,
     const ArrayRef<MCOperand> Operands) {
   if (const MachineInstr *MI = findMI(Ty, false, &MIRBuilder.getMF()))
@@ -1748,7 +1754,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateUnknownType(
 }
 
 // Returns nullptr if unable to recognize SPIRV type name
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVTypeByName(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateSPIRVTypeByName(
     StringRef TypeStr, MachineIRBuilder &MIRBuilder, bool EmitIR,
     SPIRV::StorageClass::StorageClass SC,
     SPIRV::AccessQualifier::AccessQualifier AQ) {
@@ -1770,8 +1776,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVTypeByName(
     // Unable to recognize SPIRV type name
     return nullptr;
 
-  const SPIRVType *SpirvTy =
-      getOrCreateSPIRVType(Ty, MIRBuilder, AQ, false, true);
+  SPIRVTypeInst SpirvTy = getOrCreateSPIRVType(Ty, MIRBuilder, AQ, false, true);
 
   // Handle "type*" or  "type* vector[N]".
   if (TypeStr.consume_front("*"))
@@ -1793,7 +1798,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVTypeByName(
   return SpirvTy;
 }
 
-SPIRVType *
+SPIRVTypeInst
 SPIRVGlobalRegistry::getOrCreateSPIRVIntegerType(unsigned BitWidth,
                                                  MachineIRBuilder &MIRBuilder) {
   return getOrCreateSPIRVType(
@@ -1801,19 +1806,19 @@ SPIRVGlobalRegistry::getOrCreateSPIRVIntegerType(unsigned BitWidth,
       MIRBuilder, SPIRV::AccessQualifier::ReadWrite, false, true);
 }
 
-SPIRVType *SPIRVGlobalRegistry::finishCreatingSPIRVType(const Type *LLVMTy,
-                                                        SPIRVType *SpirvType) {
+SPIRVTypeInst
+SPIRVGlobalRegistry::finishCreatingSPIRVType(const Type *LLVMTy,
+                                             SPIRVTypeInst SpirvType) {
   assert(CurMF == SpirvType->getMF());
   VRegToTypeMap[CurMF][getSPIRVTypeID(SpirvType)] = SpirvType;
   SPIRVToLLVMType[SpirvType] = unifyPtrType(LLVMTy);
   return SpirvType;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVType(unsigned BitWidth,
-                                                     MachineInstr &I,
-                                                     const SPIRVInstrInfo &TII,
-                                                     unsigned SPIRVOPcode,
-                                                     Type *Ty) {
+SPIRVTypeInst
+SPIRVGlobalRegistry::getOrCreateSPIRVType(unsigned BitWidth, MachineInstr &I,
+                                          const SPIRVInstrInfo &TII,
+                                          unsigned SPIRVOPcode, Type *Ty) {
   if (const MachineInstr *MI = findMI(Ty, false, CurMF))
     return MI;
   MachineBasicBlock &DepMBB = I.getMF()->front();
@@ -1835,7 +1840,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVType(unsigned BitWidth,
   return finishCreatingSPIRVType(Ty, NewMI);
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVIntegerType(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateSPIRVIntegerType(
     unsigned BitWidth, MachineInstr &I, const SPIRVInstrInfo &TII) {
   // Maybe adjust bit width to keep DuplicateTracker consistent. Without
   // such an adjustment SPIRVGlobalRegistry::getOpTypeInt() could create, for
@@ -1847,7 +1852,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVIntegerType(
   return getOrCreateSPIRVType(BitWidth, I, TII, SPIRV::OpTypeInt, LLVMTy);
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVFloatType(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateSPIRVFloatType(
     unsigned BitWidth, MachineInstr &I, const SPIRVInstrInfo &TII) {
   LLVMContext &Ctx = CurMF->getFunction().getContext();
   Type *LLVMTy;
@@ -1867,7 +1872,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVFloatType(
   return getOrCreateSPIRVType(BitWidth, I, TII, SPIRV::OpTypeFloat, LLVMTy);
 }
 
-SPIRVType *
+SPIRVTypeInst
 SPIRVGlobalRegistry::getOrCreateSPIRVBoolType(MachineIRBuilder &MIRBuilder,
                                               bool EmitIR) {
   return getOrCreateSPIRVType(
@@ -1875,7 +1880,7 @@ SPIRVGlobalRegistry::getOrCreateSPIRVBoolType(MachineIRBuilder &MIRBuilder,
       MIRBuilder, SPIRV::AccessQualifier::ReadWrite, false, EmitIR);
 }
 
-SPIRVType *
+SPIRVTypeInst
 SPIRVGlobalRegistry::getOrCreateSPIRVBoolType(MachineInstr &I,
                                               const SPIRVInstrInfo &TII) {
   Type *Ty = IntegerType::get(CurMF->getFunction().getContext(), 1);
@@ -1893,8 +1898,8 @@ SPIRVGlobalRegistry::getOrCreateSPIRVBoolType(MachineInstr &I,
   return finishCreatingSPIRVType(Ty, NewMI);
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVVectorType(
-    SPIRVType *BaseType, unsigned NumElements, MachineIRBuilder &MIRBuilder,
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateSPIRVVectorType(
+    SPIRVTypeInst BaseType, unsigned NumElements, MachineIRBuilder &MIRBuilder,
     bool EmitIR) {
   return getOrCreateSPIRVType(
       FixedVectorType::get(const_cast<Type *>(getTypeForSPIRVType(BaseType)),
@@ -1902,14 +1907,15 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVVectorType(
       MIRBuilder, SPIRV::AccessQualifier::ReadWrite, false, EmitIR);
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVVectorType(
-    SPIRVType *BaseType, unsigned NumElements, MachineInstr &I,
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateSPIRVVectorType(
+    SPIRVTypeInst BaseType, unsigned NumElements, MachineInstr &I,
     const SPIRVInstrInfo &TII) {
   Type *Ty = FixedVectorType::get(
       const_cast<Type *>(getTypeForSPIRVType(BaseType)), NumElements);
   if (const MachineInstr *MI = findMI(Ty, false, CurMF))
     return MI;
-  MachineInstr *DepMI = const_cast<MachineInstr *>(BaseType);
+  MachineInstr *DepMI =
+      const_cast<MachineInstr *>(static_cast<const MachineInstr *>(BaseType));
   MachineIRBuilder MIRBuilder(*DepMI->getParent(), DepMI->getIterator());
   const MachineInstr *NewMI =
       createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
@@ -1923,50 +1929,51 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVVectorType(
   return finishCreatingSPIRVType(Ty, NewMI);
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVPointerType(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateSPIRVPointerType(
     const Type *BaseType, MachineInstr &I,
     SPIRV::StorageClass::StorageClass SC) {
   MachineIRBuilder MIRBuilder(I);
   return getOrCreateSPIRVPointerType(BaseType, MIRBuilder, SC);
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVPointerType(
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateSPIRVPointerType(
     const Type *BaseType, MachineIRBuilder &MIRBuilder,
     SPIRV::StorageClass::StorageClass SC) {
   // TODO: Need to check if EmitIr should always be true.
-  SPIRVType *SpirvBaseType = getOrCreateSPIRVType(
+  SPIRVTypeInst SpirvBaseType = getOrCreateSPIRVType(
       BaseType, MIRBuilder, SPIRV::AccessQualifier::ReadWrite,
       storageClassRequiresExplictLayout(SC), true);
   assert(SpirvBaseType);
   return getOrCreateSPIRVPointerTypeInternal(SpirvBaseType, MIRBuilder, SC);
 }
 
-SPIRVType *SPIRVGlobalRegistry::changePointerStorageClass(
-    SPIRVType *PtrType, SPIRV::StorageClass::StorageClass SC, MachineInstr &I) {
+SPIRVTypeInst SPIRVGlobalRegistry::changePointerStorageClass(
+    SPIRVTypeInst PtrType, SPIRV::StorageClass::StorageClass SC,
+    MachineInstr &I) {
   [[maybe_unused]] SPIRV::StorageClass::StorageClass OldSC =
       getPointerStorageClass(PtrType);
   assert(storageClassRequiresExplictLayout(OldSC) ==
          storageClassRequiresExplictLayout(SC));
 
-  SPIRVType *PointeeType = getPointeeType(PtrType);
+  SPIRVTypeInst PointeeType = getPointeeType(PtrType);
   MachineIRBuilder MIRBuilder(I);
   return getOrCreateSPIRVPointerTypeInternal(PointeeType, MIRBuilder, SC);
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVPointerType(
-    SPIRVType *BaseType, MachineIRBuilder &MIRBuilder,
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateSPIRVPointerType(
+    SPIRVTypeInst BaseType, MachineIRBuilder &MIRBuilder,
     SPIRV::StorageClass::StorageClass SC) {
   const Type *LLVMType = getTypeForSPIRVType(BaseType);
   assert(!storageClassRequiresExplictLayout(SC));
-  SPIRVType *R = getOrCreateSPIRVPointerType(LLVMType, MIRBuilder, SC);
+  SPIRVTypeInst R = getOrCreateSPIRVPointerType(LLVMType, MIRBuilder, SC);
   assert(
       getPointeeType(R) == BaseType &&
       "The base type was not correctly laid out for the given storage class.");
   return R;
 }
 
-SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVPointerTypeInternal(
-    SPIRVType *BaseType, MachineIRBuilder &MIRBuilder,
+SPIRVTypeInst SPIRVGlobalRegistry::getOrCreateSPIRVPointerTypeInternal(
+    SPIRVTypeInst BaseType, MachineIRBuilder &MIRBuilder,
     SPIRV::StorageClass::StorageClass SC) {
   const Type *PointerElementType = getTypeForSPIRVType(BaseType);
   unsigned AddressSpace = storageClassToAddressSpace(SC);
@@ -1988,7 +1995,7 @@ SPIRVType *SPIRVGlobalRegistry::getOrCreateSPIRVPointerTypeInternal(
 }
 
 Register SPIRVGlobalRegistry::getOrCreateUndef(MachineInstr &I,
-                                               SPIRVType *SpvType,
+                                               SPIRVTypeInst SpvType,
                                                const SPIRVInstrInfo &TII) {
   UndefValue *UV =
       UndefValue::get(const_cast<Type *>(getTypeForSPIRVType(SpvType)));
@@ -2001,7 +2008,8 @@ Register SPIRVGlobalRegistry::getOrCreateUndef(MachineInstr &I,
   CurMF->getRegInfo().setRegClass(Res, &SPIRV::iIDRegClass);
   assignSPIRVTypeToVReg(SpvType, Res, *CurMF);
 
-  MachineInstr *DepMI = const_cast<MachineInstr *>(SpvType);
+  MachineInstr *DepMI =
+      const_cast<MachineInstr *>(static_cast<const MachineInstr *>(SpvType));
   MachineIRBuilder MIRBuilder(*DepMI->getParent(), DepMI->getIterator());
   const MachineInstr *NewMI =
       createOpType(MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
@@ -2020,7 +2028,7 @@ Register SPIRVGlobalRegistry::getOrCreateUndef(MachineInstr &I,
 }
 
 const TargetRegisterClass *
-SPIRVGlobalRegistry::getRegClass(SPIRVType *SpvType) const {
+SPIRVGlobalRegistry::getRegClass(SPIRVTypeInst SpvType) const {
   unsigned Opcode = SpvType->getOpcode();
   switch (Opcode) {
   case SPIRV::OpTypeFloat:
@@ -2028,7 +2036,8 @@ SPIRVGlobalRegistry::getRegClass(SPIRVType *SpvType) const {
   case SPIRV::OpTypePointer:
     return &SPIRV::pIDRegClass;
   case SPIRV::OpTypeVector: {
-    SPIRVType *ElemType = getSPIRVTypeForVReg(SpvType->getOperand(1).getReg());
+    SPIRVTypeInst ElemType =
+        getSPIRVTypeForVReg(SpvType->getOperand(1).getReg());
     unsigned ElemOpcode = ElemType ? ElemType->getOpcode() : 0;
     if (ElemOpcode == SPIRV::OpTypeFloat)
       return &SPIRV::vfIDRegClass;
@@ -2040,13 +2049,13 @@ SPIRVGlobalRegistry::getRegClass(SPIRVType *SpvType) const {
   return &SPIRV::iIDRegClass;
 }
 
-inline unsigned getAS(SPIRVType *SpvType) {
+inline unsigned getAS(SPIRVTypeInst SpvType) {
   return storageClassToAddressSpace(
       static_cast<SPIRV::StorageClass::StorageClass>(
           SpvType->getOperand(1).getImm()));
 }
 
-LLT SPIRVGlobalRegistry::getRegType(SPIRVType *SpvType) const {
+LLT SPIRVGlobalRegistry::getRegType(SPIRVTypeInst SpvType) const {
   unsigned Opcode = SpvType ? SpvType->getOpcode() : 0;
   switch (Opcode) {
   case SPIRV::OpTypeInt:
@@ -2056,7 +2065,8 @@ LLT SPIRVGlobalRegistry::getRegType(SPIRVType *SpvType) const {
   case SPIRV::OpTypePointer:
     return LLT::pointer(getAS(SpvType), getPointerSize());
   case SPIRV::OpTypeVector: {
-    SPIRVType *ElemType = getSPIRVTypeForVReg(SpvType->getOperand(1).getReg());
+    SPIRVTypeInst ElemType =
+        getSPIRVTypeForVReg(SpvType->getOperand(1).getReg());
     LLT ET;
     switch (ElemType ? ElemType->getOpcode() : 0) {
     case SPIRV::OpTypePointer:
@@ -2222,7 +2232,7 @@ void SPIRVGlobalRegistry::addArrayStrideDecorations(
                   {SizeInBytes});
 }
 
-bool SPIRVGlobalRegistry::hasBlockDecoration(SPIRVType *Type) const {
+bool SPIRVGlobalRegistry::hasBlockDecoration(SPIRVTypeInst Type) const {
   Register Def = getSPIRVTypeID(Type);
   for (const MachineInstr &Use :
        Type->getMF()->getRegInfo().use_instructions(Def)) {
diff --git a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.h b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.h
index 269e59d9ed82b..0dd0bbaf36bc0 100644
--- a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.h
+++ b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.h
@@ -93,7 +93,7 @@ class SPIRVGlobalRegistry : public SPIRVIRMapping {
   DenseMap<const MachineFunction *, DenseMap<Register, SPIRVType *>>
       VRegToTypeMap;
 
-  DenseMap<SPIRVType *, const Type *> SPIRVToLLVMType;
+  DenseMap<SPIRVTypeInst, const Type *> SPIRVToLLVMType;
 
   // map a Function to its definition (as a machine instruction operand)
   DenseMap<const Function *, const MachineOperand *> FunctionToInstr;
@@ -144,13 +144,14 @@ class SPIRVGlobalRegistry : public SPIRVIRMapping {
   std::unordered_map<const MDNode *, MachineInstr *> AliasInstMDMap;
 
   // Add a new OpTypeXXX instruction without checking for duplicates.
-  SPIRVType *createSPIRVType(const Type *Type, MachineIRBuilder &MIRBuilder,
-                             SPIRV::AccessQualifier::AccessQualifier AQ,
-                             bool ExplicitLayoutRequired, bool EmitIR);
-  SPIRVType *findSPIRVType(const Type *Ty, MachineIRBuilder &MIRBuilder,
-                           SPIRV::AccessQualifier::AccessQualifier accessQual,
-                           bool ExplicitLayoutRequired, bool EmitIR);
-  SPIRVType *
+  SPIRVTypeInst createSPIRVType(const Type *Type, MachineIRBuilder &MIRBuilder,
+                                SPIRV::AccessQualifier::AccessQualifier AQ,
+                                bool ExplicitLayoutRequired, bool EmitIR);
+  SPIRVTypeInst
+  findSPIRVType(const Type *Ty, MachineIRBuilder &MIRBuilder,
+                SPIRV::AccessQualifier::AccessQualifier accessQual,
+                bool ExplicitLayoutRequired, bool EmitIR);
+  SPIRVTypeInst
   restOfCreateSPIRVType(const Type *Type, MachineIRBuilder &MIRBuilder,
                         SPIRV::AccessQualifier::AccessQualifier AccessQual,
                         bool ExplicitLayoutRequired, bool EmitIR);
@@ -334,21 +335,23 @@ class SPIRVGlobalRegistry : public SPIRVIRMapping {
 
   // Get or create a SPIR-V type corresponding the given LLVM IR type,
   // and map it to the given VReg.
-  SPIRVType *assignTypeToVReg(const Type *Type, Register VReg,
-                              MachineIRBuilder &MIRBuilder,
-                              SPIRV::AccessQualifier::AccessQualifier AQ,
-                              bool EmitIR);
-  SPIRVType *assignIntTypeToVReg(unsigned BitWidth, Register VReg,
-                                 MachineInstr &I, const SPIRVInstrInfo &TII);
-  SPIRVType *assignFloatTypeToVReg(unsigned BitWidth, Register VReg,
-                                   MachineInstr &I, const SPIRVInstrInfo &TII);
-  SPIRVType *assignVectTypeToVReg(SPIRVType *BaseType, unsigned NumElements,
-                                  Register VReg, MachineInstr &I,
-                                  const SPIRVInstrInfo &TII);
+  SPIRVTypeInst assignTypeToVReg(const Type *Type, Register VReg,
+                                 MachineIRBuilder &MIRBuilder,
+                                 SPIRV::AccessQualifier::AccessQualifier AQ,
+                                 bool EmitIR);
+  SPIRVTypeInst assignIntTypeToVReg(unsigned BitWidth, Register VReg,
+                                    MachineInstr &I, const SPIRVInstrInfo &TII);
+  SPIRVTypeInst assignFloatTypeToVReg(unsigned BitWidth, Register VReg,
+                                      MachineInstr &I,
+                                      const SPIRVInstrInfo &TII);
+  SPIRVTypeInst assignVectTypeToVReg(SPIRVTypeInst BaseType,
+                                     unsigned NumElements, Register VReg,
+                                     MachineInstr &I,
+                                     const SPIRVInstrInfo &TII);
 
   // In cases where the SPIR-V type is already known, this function can be
   // used to map it to the given VReg.
-  void assignSPIRVTypeToVReg(SPIRVType *Type, Register VReg,
+  void assignSPIRVTypeToVReg(SPIRVTypeInst Type, Register VReg,
                              const MachineFunction &MF);
 
   // Either generate a new OpTypeXXX instruction or return an existing one
@@ -356,35 +359,35 @@ class SPIRVGlobalRegistry : public SPIRVIRMapping {
   // EmitIR controls if we emit GMIR or SPV constants (e.g. for array sizes)
   // because this method may be called from InstructionSelector and we don't
   // want to emit extra IR instructions there.
-  SPIRVType *getOrCreateSPIRVType(const Type *Type, MachineInstr &I,
-                                  SPIRV::AccessQualifier::AccessQualifier AQ,
-                                  bool EmitIR) {
+  SPIRVTypeInst getOrCreateSPIRVType(const Type *Type, MachineInstr &I,
+                                     SPIRV::AccessQualifier::AccessQualifier AQ,
+                                     bool EmitIR) {
     MachineIRBuilder MIRBuilder(I);
     return getOrCreateSPIRVType(Type, MIRBuilder, AQ, EmitIR);
   }
 
-  SPIRVType *getOrCreateSPIRVType(const Type *Type,
-                                  MachineIRBuilder &MIRBuilder,
-                                  SPIRV::AccessQualifier::AccessQualifier AQ,
-                                  bool EmitIR) {
+  SPIRVTypeInst getOrCreateSPIRVType(const Type *Type,
+                                     MachineIRBuilder &MIRBuilder,
+                                     SPIRV::AccessQualifier::AccessQualifier AQ,
+                                     bool EmitIR) {
     return getOrCreateSPIRVType(Type, MIRBuilder, AQ, false, EmitIR);
   }
 
-  const Type *getTypeForSPIRVType(const SPIRVType *Ty) const {
+  const Type *getTypeForSPIRVType(SPIRVTypeInst Ty) const {
     auto Res = SPIRVToLLVMType.find(Ty);
     assert(Res != SPIRVToLLVMType.end());
     return Res->second;
   }
 
   // Return a pointee's type, or nullptr otherwise.
-  SPIRVType *getPointeeType(SPIRVType *PtrType);
+  SPIRVTypeInst getPointeeType(SPIRVTypeInst PtrType);
   // Return a pointee's type op code, or 0 otherwise.
   unsigned getPointeeTypeOp(Register PtrReg);
 
   // Either generate a new OpTypeXXX instruction or return an existing one
   // corresponding to the given string containing the name of the builtin type.
   // Return nullptr if unable to recognize SPIRV type name from `TypeStr`.
-  SPIRVType *getOrCreateSPIRVTypeByName(
+  SPIRVTypeInst getOrCreateSPIRVTypeByName(
       StringRef TypeStr, MachineIRBuilder &MIRBuilder, bool EmitIR,
       SPIRV::StorageClass::StorageClass SC = SPIRV::StorageClass::Function,
       SPIRV::AccessQualifier::AccessQualifier AQ =
@@ -399,7 +402,7 @@ class SPIRVGlobalRegistry : public SPIRVIRMapping {
                                  const MachineFunction *MF = nullptr) const;
 
   // Return the result type of the instruction defining the register.
-  SPIRVType *getResultType(Register VReg, MachineFunction *MF = nullptr);
+  SPIRVTypeInst getResultType(Register VReg, MachineFunction *MF = nullptr);
 
   // Whether the given VReg has a SPIR-V type mapped to it yet.
   bool hasSPIRVTypeForVReg(Register VReg) const {
@@ -407,7 +410,7 @@ class SPIRVGlobalRegistry : public SPIRVIRMapping {
   }
 
   // Return the VReg holding the result of the given OpTypeXXX instruction.
-  Register getSPIRVTypeID(const SPIRVType *SpirvType) const;
+  Register getSPIRVTypeID(SPIRVTypeInst SpirvType) const;
 
   // Return previous value of the current machine function
   MachineFunction *setCurrentFunc(MachineFunction &MF) {
@@ -417,7 +420,7 @@ class SPIRVGlobalRegistry : public SPIRVIRMapping {
   }
 
   // Return true if the type is an aggregate type.
-  bool isAggregateType(SPIRVType *Type) const {
+  bool isAggregateType(SPIRVTypeInst Type) const {
     return Type && (Type->getOpcode() == SPIRV::OpTypeStruct &&
                     Type->getOpcode() == SPIRV::OpTypeArray);
   }
@@ -433,116 +436,117 @@ class SPIRVGlobalRegistry : public SPIRVIRMapping {
 
   // Returns true if `Type` is a resource type. This could be an image type
   // or a struct for a buffer decorated with the block decoration.
-  bool isResourceType(SPIRVType *Type) const;
+  bool isResourceType(SPIRVTypeInst Type) const;
 
   // Return number of elements in a vector if the argument is associated with
   // a vector type. Return 1 for a scalar type, and 0 for a missing type.
   unsigned getScalarOrVectorComponentCount(Register VReg) const;
-  unsigned getScalarOrVectorComponentCount(SPIRVType *Type) const;
+  unsigned getScalarOrVectorComponentCount(SPIRVTypeInst Type) const;
 
   // Return the component type in a vector if the argument is associated with
   // a vector type. Returns the argument itself for other types, and nullptr
   // for a missing type.
-  SPIRVType *getScalarOrVectorComponentType(Register VReg) const;
-  SPIRVType *getScalarOrVectorComponentType(SPIRVType *Type) const;
+  SPIRVTypeInst getScalarOrVectorComponentType(SPIRVTypeInst Type) const;
 
   // For vectors or scalars of booleans, integers and floats, return the scalar
   // type's bitwidth. Otherwise calls llvm_unreachable().
-  unsigned getScalarOrVectorBitWidth(const SPIRVType *Type) const;
+  unsigned getScalarOrVectorBitWidth(SPIRVTypeInst Type) const;
 
   // For vectors or scalars of integers and floats, return total bitwidth of the
   // argument. Otherwise returns 0.
-  unsigned getNumScalarOrVectorTotalBitWidth(const SPIRVType *Type) const;
+  unsigned getNumScalarOrVectorTotalBitWidth(SPIRVTypeInst Type) const;
 
   // Returns either pointer to integer type, that may be a type of vector
   // elements or an original type, or nullptr if the argument is niether
   // an integer scalar, nor an integer vector
-  const SPIRVType *retrieveScalarOrVectorIntType(const SPIRVType *Type) const;
+  SPIRVTypeInst retrieveScalarOrVectorIntType(SPIRVTypeInst Type) const;
 
   // For integer vectors or scalars, return whether the integers are signed.
-  bool isScalarOrVectorSigned(const SPIRVType *Type) const;
+  bool isScalarOrVectorSigned(SPIRVTypeInst Type) const;
 
   // Gets the storage class of the pointer type assigned to this vreg.
   SPIRV::StorageClass::StorageClass getPointerStorageClass(Register VReg) const;
   SPIRV::StorageClass::StorageClass
-  getPointerStorageClass(const SPIRVType *Type) const;
+  getPointerStorageClass(SPIRVTypeInst Type) const;
 
   // Return the number of bits SPIR-V pointers and size_t variables require.
   unsigned getPointerSize() const { return PointerSize; }
 
   // Returns true if two types are defined and are compatible in a sense of
   // OpBitcast instruction
-  bool isBitcastCompatible(const SPIRVType *Type1,
-                           const SPIRVType *Type2) const;
+  bool isBitcastCompatible(SPIRVTypeInst Type1, SPIRVTypeInst Type2) const;
 
   // Informs about removal of the machine instruction and invalidates data
   // structures referring this instruction.
   void invalidateMachineInstr(MachineInstr *MI);
 
 private:
-  SPIRVType *getOpTypeBool(MachineIRBuilder &MIRBuilder);
+  SPIRVTypeInst getOpTypeBool(MachineIRBuilder &MIRBuilder);
 
   const Type *adjustIntTypeByWidth(const Type *Ty) const;
   unsigned adjustOpTypeIntWidth(unsigned Width) const;
 
-  SPIRVType *getOrCreateSPIRVType(const Type *Type,
-                                  MachineIRBuilder &MIRBuilder,
-                                  SPIRV::AccessQualifier::AccessQualifier AQ,
-                                  bool ExplicitLayoutRequired, bool EmitIR);
+  SPIRVTypeInst getOrCreateSPIRVType(const Type *Type,
+                                     MachineIRBuilder &MIRBuilder,
+                                     SPIRV::AccessQualifier::AccessQualifier AQ,
+                                     bool ExplicitLayoutRequired, bool EmitIR);
 
-  SPIRVType *getOpTypeInt(unsigned Width, MachineIRBuilder &MIRBuilder,
-                          bool IsSigned = false);
+  SPIRVTypeInst getOpTypeInt(unsigned Width, MachineIRBuilder &MIRBuilder,
+                             bool IsSigned = false);
 
-  SPIRVType *getOpTypeFloat(uint32_t Width, MachineIRBuilder &MIRBuilder);
+  SPIRVTypeInst getOpTypeFloat(uint32_t Width, MachineIRBuilder &MIRBuilder);
 
-  SPIRVType *getOpTypeFloat(uint32_t Width, MachineIRBuilder &MIRBuilder,
-                            SPIRV::FPEncoding::FPEncoding FPEncode);
+  SPIRVTypeInst getOpTypeFloat(uint32_t Width, MachineIRBuilder &MIRBuilder,
+                               SPIRV::FPEncoding::FPEncoding FPEncode);
 
-  SPIRVType *getOpTypeVoid(MachineIRBuilder &MIRBuilder);
+  SPIRVTypeInst getOpTypeVoid(MachineIRBuilder &MIRBuilder);
 
-  SPIRVType *getOpTypeVector(uint32_t NumElems, SPIRVType *ElemType,
-                             MachineIRBuilder &MIRBuilder);
+  SPIRVTypeInst getOpTypeVector(uint32_t NumElems, SPIRVTypeInst ElemType,
+                                MachineIRBuilder &MIRBuilder);
 
-  SPIRVType *getOpTypeArray(uint32_t NumElems, SPIRVType *ElemType,
-                            MachineIRBuilder &MIRBuilder,
-                            bool ExplicitLayoutRequired, bool EmitIR);
+  SPIRVTypeInst getOpTypeArray(uint32_t NumElems, SPIRVTypeInst ElemType,
+                               MachineIRBuilder &MIRBuilder,
+                               bool ExplicitLayoutRequired, bool EmitIR);
 
-  SPIRVType *getOpTypeOpaque(const StructType *Ty,
-                             MachineIRBuilder &MIRBuilder);
+  SPIRVTypeInst getOpTypeOpaque(const StructType *Ty,
+                                MachineIRBuilder &MIRBuilder);
 
-  SPIRVType *getOpTypeStruct(const StructType *Ty, MachineIRBuilder &MIRBuilder,
-                             SPIRV::AccessQualifier::AccessQualifier AccQual,
-                             StructOffsetDecorator Decorator, bool EmitIR);
+  SPIRVTypeInst getOpTypeStruct(const StructType *Ty,
+                                MachineIRBuilder &MIRBuilder,
+                                SPIRV::AccessQualifier::AccessQualifier AccQual,
+                                StructOffsetDecorator Decorator, bool EmitIR);
 
-  SPIRVType *getOpTypePointer(SPIRV::StorageClass::StorageClass SC,
-                              SPIRVType *ElemType, MachineIRBuilder &MIRBuilder,
-                              Register Reg);
+  SPIRVTypeInst getOpTypePointer(SPIRV::StorageClass::StorageClass SC,
+                                 SPIRVTypeInst ElemType,
+                                 MachineIRBuilder &MIRBuilder, Register Reg);
 
-  SPIRVType *getOpTypeForwardPointer(SPIRV::StorageClass::StorageClass SC,
-                                     MachineIRBuilder &MIRBuilder);
+  SPIRVTypeInst getOpTypeForwardPointer(SPIRV::StorageClass::StorageClass SC,
+                                        MachineIRBuilder &MIRBuilder);
 
-  SPIRVType *getOpTypeFunction(const FunctionType *Ty, SPIRVType *RetType,
-                               const SmallVectorImpl<SPIRVType *> &ArgTypes,
-                               MachineIRBuilder &MIRBuilder);
+  SPIRVTypeInst
+  getOpTypeFunction(const FunctionType *Ty, SPIRVTypeInst RetType,
+                    const SmallVectorImpl<SPIRVTypeInst> &ArgTypes,
+                    MachineIRBuilder &MIRBuilder);
 
-  SPIRVType *
+  SPIRVTypeInst
   getOrCreateSpecialType(const Type *Ty, MachineIRBuilder &MIRBuilder,
                          SPIRV::AccessQualifier::AccessQualifier AccQual);
 
-  SPIRVType *finishCreatingSPIRVType(const Type *LLVMTy, SPIRVType *SpirvType);
+  SPIRVTypeInst finishCreatingSPIRVType(const Type *LLVMTy,
+                                        SPIRVTypeInst SpirvType);
   Register getOrCreateBaseRegister(Constant *Val, MachineInstr &I,
-                                   SPIRVType *SpvType,
+                                   SPIRVTypeInst SpvType,
                                    const SPIRVInstrInfo &TII, unsigned BitWidth,
                                    bool ZeroAsNull);
   Register getOrCreateCompositeOrNull(Constant *Val, MachineInstr &I,
-                                      SPIRVType *SpvType,
+                                      SPIRVTypeInst SpvType,
                                       const SPIRVInstrInfo &TII, Constant *CA,
                                       unsigned BitWidth, unsigned ElemCnt,
                                       bool ZeroAsNull = true);
 
   Register getOrCreateIntCompositeOrNull(uint64_t Val,
                                          MachineIRBuilder &MIRBuilder,
-                                         SPIRVType *SpvType, bool EmitIR,
+                                         SPIRVTypeInst SpvType, bool EmitIR,
                                          Constant *CA, unsigned BitWidth,
                                          unsigned ElemCnt);
 
@@ -550,8 +554,8 @@ class SPIRVGlobalRegistry : public SPIRVIRMapping {
   // storage class. It is the responsibility of the caller to make sure the
   // decorations on the base type are valid for the given storage class. For
   // example, it has the correct offset and stride decorations.
-  SPIRVType *
-  getOrCreateSPIRVPointerTypeInternal(SPIRVType *BaseType,
+  SPIRVTypeInst
+  getOrCreateSPIRVPointerTypeInternal(SPIRVTypeInst BaseType,
                                       MachineIRBuilder &MIRBuilder,
                                       SPIRV::StorageClass::StorageClass SC);
 
@@ -559,165 +563,172 @@ class SPIRVGlobalRegistry : public SPIRVIRMapping {
                                   MachineIRBuilder &MIRBuilder);
   void addArrayStrideDecorations(Register Reg, Type *ElementType,
                                  MachineIRBuilder &MIRBuilder);
-  bool hasBlockDecoration(SPIRVType *Type) const;
+  bool hasBlockDecoration(SPIRVTypeInst Type) const;
 
-  SPIRVType *
-  getOrCreateOpTypeImage(MachineIRBuilder &MIRBuilder, SPIRVType *SampledType,
-                         SPIRV::Dim::Dim Dim, uint32_t Depth, uint32_t Arrayed,
+  SPIRVTypeInst
+  getOrCreateOpTypeImage(MachineIRBuilder &MIRBuilder,
+                         SPIRVTypeInst SampledType, SPIRV::Dim::Dim Dim,
+                         uint32_t Depth, uint32_t Arrayed,
                          uint32_t Multisampled, uint32_t Sampled,
                          SPIRV::ImageFormat::ImageFormat ImageFormat,
                          SPIRV::AccessQualifier::AccessQualifier AccQual);
 
 public:
   Register buildConstantInt(uint64_t Val, MachineIRBuilder &MIRBuilder,
-                            SPIRVType *SpvType, bool EmitIR,
+                            SPIRVTypeInst SpvType, bool EmitIR,
                             bool ZeroAsNull = true);
   Register getOrCreateConstInt(uint64_t Val, MachineInstr &I,
-                               SPIRVType *SpvType, const SPIRVInstrInfo &TII,
+                               SPIRVTypeInst SpvType, const SPIRVInstrInfo &TII,
                                bool ZeroAsNull = true);
   Register getOrCreateConstInt(const APInt &Val, MachineInstr &I,
-                               const SPIRVType *SpvType,
-                               const SPIRVInstrInfo &TII,
+                               SPIRVTypeInst SpvType, const SPIRVInstrInfo &TII,
                                bool ZeroAsNull = true);
   Register createConstInt(const ConstantInt *CI, MachineInstr &I,
-                          SPIRVType *SpvType, const SPIRVInstrInfo &TII,
+                          SPIRVTypeInst SpvType, const SPIRVInstrInfo &TII,
                           bool ZeroAsNull);
-  Register getOrCreateConstFP(APFloat Val, MachineInstr &I, SPIRVType *SpvType,
-                              const SPIRVInstrInfo &TII,
+  Register getOrCreateConstFP(APFloat Val, MachineInstr &I,
+                              SPIRVTypeInst SpvType, const SPIRVInstrInfo &TII,
                               bool ZeroAsNull = true);
   Register createConstFP(const ConstantFP *CF, MachineInstr &I,
-                         SPIRVType *SpvType, const SPIRVInstrInfo &TII,
+                         SPIRVTypeInst SpvType, const SPIRVInstrInfo &TII,
                          bool ZeroAsNull);
   Register buildConstantFP(APFloat Val, MachineIRBuilder &MIRBuilder,
-                           SPIRVType *SpvType = nullptr);
+                           SPIRVTypeInst SpvType = nullptr);
 
   Register getOrCreateConstVector(uint64_t Val, MachineInstr &I,
-                                  SPIRVType *SpvType, const SPIRVInstrInfo &TII,
+                                  SPIRVTypeInst SpvType,
+                                  const SPIRVInstrInfo &TII,
                                   bool ZeroAsNull = true);
   Register getOrCreateConstVector(const APInt &Val, MachineInstr &I,
-                                  const SPIRVType *SpvType,
+                                  SPIRVTypeInst SpvType,
                                   const SPIRVInstrInfo &TII,
                                   bool ZeroAsNull = true);
   Register getOrCreateConstVector(APFloat Val, MachineInstr &I,
-                                  SPIRVType *SpvType, const SPIRVInstrInfo &TII,
+                                  SPIRVTypeInst SpvType,
+                                  const SPIRVInstrInfo &TII,
                                   bool ZeroAsNull = true);
   Register getOrCreateConstIntArray(uint64_t Val, size_t Num, MachineInstr &I,
-                                    SPIRVType *SpvType,
+                                    SPIRVTypeInst SpvType,
                                     const SPIRVInstrInfo &TII);
   Register getOrCreateConsIntVector(uint64_t Val, MachineIRBuilder &MIRBuilder,
-                                    SPIRVType *SpvType, bool EmitIR);
+                                    SPIRVTypeInst SpvType, bool EmitIR);
   Register getOrCreateConstNullPtr(MachineIRBuilder &MIRBuilder,
-                                   SPIRVType *SpvType);
+                                   SPIRVTypeInst SpvType);
   Register buildConstantSampler(Register Res, unsigned AddrMode, unsigned Param,
                                 unsigned FilerMode,
                                 MachineIRBuilder &MIRBuilder);
-  Register getOrCreateUndef(MachineInstr &I, SPIRVType *SpvType,
+  Register getOrCreateUndef(MachineInstr &I, SPIRVTypeInst SpvType,
                             const SPIRVInstrInfo &TII);
   Register buildGlobalVariable(
-      Register Reg, SPIRVType *BaseType, StringRef Name, const GlobalValue *GV,
-      SPIRV::StorageClass::StorageClass Storage, const MachineInstr *Init,
-      bool IsConst,
+      Register Reg, SPIRVTypeInst BaseType, StringRef Name,
+      const GlobalValue *GV, SPIRV::StorageClass::StorageClass Storage,
+      const MachineInstr *Init, bool IsConst,
       const std::optional<SPIRV::LinkageType::LinkageType> &LinkageType,
       MachineIRBuilder &MIRBuilder, bool IsInstSelector);
-  Register getOrCreateGlobalVariableWithBinding(const SPIRVType *VarType,
+  Register getOrCreateGlobalVariableWithBinding(SPIRVTypeInst VarType,
                                                 uint32_t Set, uint32_t Binding,
                                                 StringRef Name,
                                                 MachineIRBuilder &MIRBuilder);
 
   // Convenient helpers for getting types with check for duplicates.
-  SPIRVType *getOrCreateSPIRVIntegerType(unsigned BitWidth,
-                                         MachineIRBuilder &MIRBuilder);
-  SPIRVType *getOrCreateSPIRVIntegerType(unsigned BitWidth, MachineInstr &I,
+  SPIRVTypeInst getOrCreateSPIRVIntegerType(unsigned BitWidth,
+                                            MachineIRBuilder &MIRBuilder);
+  SPIRVTypeInst getOrCreateSPIRVIntegerType(unsigned BitWidth, MachineInstr &I,
+                                            const SPIRVInstrInfo &TII);
+  SPIRVTypeInst getOrCreateSPIRVType(unsigned BitWidth, MachineInstr &I,
+                                     const SPIRVInstrInfo &TII,
+                                     unsigned SPIRVOPcode, Type *LLVMTy);
+  SPIRVTypeInst getOrCreateSPIRVFloatType(unsigned BitWidth, MachineInstr &I,
+                                          const SPIRVInstrInfo &TII);
+  SPIRVTypeInst getOrCreateSPIRVBoolType(MachineIRBuilder &MIRBuilder,
+                                         bool EmitIR);
+  SPIRVTypeInst getOrCreateSPIRVBoolType(MachineInstr &I,
                                          const SPIRVInstrInfo &TII);
-  SPIRVType *getOrCreateSPIRVType(unsigned BitWidth, MachineInstr &I,
-                                  const SPIRVInstrInfo &TII,
-                                  unsigned SPIRVOPcode, Type *LLVMTy);
-  SPIRVType *getOrCreateSPIRVFloatType(unsigned BitWidth, MachineInstr &I,
-                                       const SPIRVInstrInfo &TII);
-  SPIRVType *getOrCreateSPIRVBoolType(MachineIRBuilder &MIRBuilder,
-                                      bool EmitIR);
-  SPIRVType *getOrCreateSPIRVBoolType(MachineInstr &I,
-                                      const SPIRVInstrInfo &TII);
-  SPIRVType *getOrCreateSPIRVVectorType(SPIRVType *BaseType,
-                                        unsigned NumElements,
-                                        MachineIRBuilder &MIRBuilder,
-                                        bool EmitIR);
-  SPIRVType *getOrCreateSPIRVVectorType(SPIRVType *BaseType,
-                                        unsigned NumElements, MachineInstr &I,
-                                        const SPIRVInstrInfo &TII);
+  SPIRVTypeInst getOrCreateSPIRVVectorType(SPIRVTypeInst BaseType,
+                                           unsigned NumElements,
+                                           MachineIRBuilder &MIRBuilder,
+                                           bool EmitIR);
+  SPIRVTypeInst getOrCreateSPIRVVectorType(SPIRVTypeInst BaseType,
+                                           unsigned NumElements,
+                                           MachineInstr &I,
+                                           const SPIRVInstrInfo &TII);
 
   // Returns a pointer to a SPIR-V pointer type with the given base type and
   // storage class. The base type will be translated to a SPIR-V type, and the
   // appropriate layout decorations will be added to the base type.
-  SPIRVType *getOrCreateSPIRVPointerType(const Type *BaseType,
-                                         MachineIRBuilder &MIRBuilder,
-                                         SPIRV::StorageClass::StorageClass SC);
-  SPIRVType *getOrCreateSPIRVPointerType(const Type *BaseType, MachineInstr &I,
-                                         SPIRV::StorageClass::StorageClass SC);
+  SPIRVTypeInst
+  getOrCreateSPIRVPointerType(const Type *BaseType,
+                              MachineIRBuilder &MIRBuilder,
+                              SPIRV::StorageClass::StorageClass SC);
+  SPIRVTypeInst
+  getOrCreateSPIRVPointerType(const Type *BaseType, MachineInstr &I,
+                              SPIRV::StorageClass::StorageClass SC);
 
   // Returns a pointer to a SPIR-V pointer type with the given base type and
   // storage class. It is the responsibility of the caller to make sure the
   // decorations on the base type are valid for the given storage class. For
   // example, it has the correct offset and stride decorations.
-  SPIRVType *getOrCreateSPIRVPointerType(SPIRVType *BaseType,
-                                         MachineIRBuilder &MIRBuilder,
-                                         SPIRV::StorageClass::StorageClass SC);
+  SPIRVTypeInst
+  getOrCreateSPIRVPointerType(SPIRVTypeInst BaseType,
+                              MachineIRBuilder &MIRBuilder,
+                              SPIRV::StorageClass::StorageClass SC);
 
   // Returns a pointer to a SPIR-V pointer type that is the same as `PtrType`
   // except the stroage class has been changed to `SC`. It is the responsibility
   // of the caller to be sure that the original and new storage class have the
   // same layout requirements.
-  SPIRVType *changePointerStorageClass(SPIRVType *PtrType,
-                                       SPIRV::StorageClass::StorageClass SC,
-                                       MachineInstr &I);
+  SPIRVTypeInst changePointerStorageClass(SPIRVTypeInst PtrType,
+                                          SPIRV::StorageClass::StorageClass SC,
+                                          MachineInstr &I);
 
-  SPIRVType *getOrCreateVulkanBufferType(MachineIRBuilder &MIRBuilder,
-                                         Type *ElemType,
-                                         SPIRV::StorageClass::StorageClass SC,
-                                         bool IsWritable, bool EmitIr = false);
+  SPIRVTypeInst
+  getOrCreateVulkanBufferType(MachineIRBuilder &MIRBuilder, Type *ElemType,
+                              SPIRV::StorageClass::StorageClass SC,
+                              bool IsWritable, bool EmitIr = false);
 
-  SPIRVType *getOrCreatePaddingType(MachineIRBuilder &MIRBuilder);
+  SPIRVTypeInst getOrCreatePaddingType(MachineIRBuilder &MIRBuilder);
 
-  SPIRVType *getOrCreateVulkanPushConstantType(MachineIRBuilder &MIRBuilder,
-                                               Type *ElemType);
+  SPIRVTypeInst getOrCreateVulkanPushConstantType(MachineIRBuilder &MIRBuilder,
+                                                  Type *ElemType);
 
-  SPIRVType *getOrCreateLayoutType(MachineIRBuilder &MIRBuilder,
-                                   const TargetExtType *T, bool EmitIr = false);
+  SPIRVTypeInst getOrCreateLayoutType(MachineIRBuilder &MIRBuilder,
+                                      const TargetExtType *T,
+                                      bool EmitIr = false);
 
-  SPIRVType *
+  SPIRVTypeInst
   getImageType(const TargetExtType *ExtensionType,
                const SPIRV::AccessQualifier::AccessQualifier Qualifier,
                MachineIRBuilder &MIRBuilder);
 
-  SPIRVType *getOrCreateOpTypeSampler(MachineIRBuilder &MIRBuilder);
-
-  SPIRVType *getOrCreateOpTypeSampledImage(SPIRVType *ImageType,
-                                           MachineIRBuilder &MIRBuilder);
-  SPIRVType *getOrCreateOpTypeCoopMatr(MachineIRBuilder &MIRBuilder,
-                                       const TargetExtType *ExtensionType,
-                                       const SPIRVType *ElemType,
-                                       uint32_t Scope, uint32_t Rows,
-                                       uint32_t Columns, uint32_t Use,
-                                       bool EmitIR);
-  SPIRVType *
+  SPIRVTypeInst getOrCreateOpTypeSampler(MachineIRBuilder &MIRBuilder);
+
+  SPIRVTypeInst getOrCreateOpTypeSampledImage(SPIRVTypeInst ImageType,
+                                              MachineIRBuilder &MIRBuilder);
+  SPIRVTypeInst getOrCreateOpTypeCoopMatr(MachineIRBuilder &MIRBuilder,
+                                          const TargetExtType *ExtensionType,
+                                          SPIRVTypeInst ElemType,
+                                          uint32_t Scope, uint32_t Rows,
+                                          uint32_t Columns, uint32_t Use,
+                                          bool EmitIR);
+  SPIRVTypeInst
   getOrCreateOpTypePipe(MachineIRBuilder &MIRBuilder,
                         SPIRV::AccessQualifier::AccessQualifier AccQual);
-  SPIRVType *getOrCreateOpTypeDeviceEvent(MachineIRBuilder &MIRBuilder);
-  SPIRVType *getOrCreateOpTypeFunctionWithArgs(
-      const Type *Ty, SPIRVType *RetType,
-      const SmallVectorImpl<SPIRVType *> &ArgTypes,
+  SPIRVTypeInst getOrCreateOpTypeDeviceEvent(MachineIRBuilder &MIRBuilder);
+  SPIRVTypeInst getOrCreateOpTypeFunctionWithArgs(
+      const Type *Ty, SPIRVTypeInst RetType,
+      const SmallVectorImpl<SPIRVTypeInst> &ArgTypes,
       MachineIRBuilder &MIRBuilder);
-  SPIRVType *getOrCreateOpTypeByOpcode(const Type *Ty,
-                                       MachineIRBuilder &MIRBuilder,
-                                       unsigned Opcode);
+  SPIRVTypeInst getOrCreateOpTypeByOpcode(const Type *Ty,
+                                          MachineIRBuilder &MIRBuilder,
+                                          unsigned Opcode);
 
-  SPIRVType *getOrCreateUnknownType(const Type *Ty,
-                                    MachineIRBuilder &MIRBuilder,
-                                    unsigned Opcode,
-                                    const ArrayRef<MCOperand> Operands);
+  SPIRVTypeInst getOrCreateUnknownType(const Type *Ty,
+                                       MachineIRBuilder &MIRBuilder,
+                                       unsigned Opcode,
+                                       const ArrayRef<MCOperand> Operands);
 
-  const TargetRegisterClass *getRegClass(SPIRVType *SpvType) const;
-  LLT getRegType(SPIRVType *SpvType) const;
+  const TargetRegisterClass *getRegClass(SPIRVTypeInst SpvType) const;
+  LLT getRegType(SPIRVTypeInst SpvType) const;
 
   MachineInstr *getOrAddMemAliasingINTELInst(MachineIRBuilder &MIRBuilder,
                                              const MDNode *AliasingListMD);
diff --git a/llvm/lib/Target/SPIRV/SPIRVISelLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVISelLowering.cpp
index b16dae012b10d..ff73fff8752d7 100644
--- a/llvm/lib/Target/SPIRV/SPIRVISelLowering.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVISelLowering.cpp
@@ -160,7 +160,7 @@ inline Register getTypeReg(MachineRegisterInfo *MRI, Register OpReg) {
 static void doInsertBitcast(const SPIRVSubtarget &STI, MachineRegisterInfo *MRI,
                             SPIRVGlobalRegistry &GR, MachineInstr &I,
                             Register OpReg, unsigned OpIdx,
-                            SPIRVType *NewPtrType) {
+                            SPIRVTypeInst NewPtrType) {
   MachineIRBuilder MIB(I);
   Register NewReg = createVirtualRegister(NewPtrType, &GR, MRI, MIB.getMF());
   MIB.buildInstr(SPIRV::OpBitcast)
@@ -172,14 +172,15 @@ static void doInsertBitcast(const SPIRVSubtarget &STI, MachineRegisterInfo *MRI,
   I.getOperand(OpIdx).setReg(NewReg);
 }
 
-static SPIRVType *createNewPtrType(SPIRVGlobalRegistry &GR, MachineInstr &I,
-                                   SPIRVType *OpType, bool ReuseType,
-                                   SPIRVType *ResType, const Type *ResTy) {
+static SPIRVTypeInst createNewPtrType(SPIRVGlobalRegistry &GR, MachineInstr &I,
+                                      SPIRVTypeInst OpType, bool ReuseType,
+                                      SPIRVTypeInst ResType,
+                                      const Type *ResTy) {
   SPIRV::StorageClass::StorageClass SC =
       static_cast<SPIRV::StorageClass::StorageClass>(
           OpType->getOperand(1).getImm());
   MachineIRBuilder MIB(I);
-  SPIRVType *NewBaseType =
+  SPIRVTypeInst NewBaseType =
       ReuseType ? ResType
                 : GR.getOrCreateSPIRVType(
                       ResTy, MIB, SPIRV::AccessQualifier::ReadWrite, false);
@@ -191,7 +192,8 @@ static SPIRVType *createNewPtrType(SPIRVGlobalRegistry &GR, MachineInstr &I,
 static void validatePtrTypes(const SPIRVSubtarget &STI,
                              MachineRegisterInfo *MRI, SPIRVGlobalRegistry &GR,
                              MachineInstr &I, unsigned OpIdx,
-                             SPIRVType *ResType, const Type *ResTy = nullptr) {
+                             SPIRVTypeInst ResType,
+                             const Type *ResTy = nullptr) {
   // Get operand type
   MachineFunction *MF = I.getParent()->getParent();
   Register OpReg = I.getOperand(OpIdx).getReg();
@@ -201,7 +203,7 @@ static void validatePtrTypes(const SPIRVSubtarget &STI,
     return;
   // Get operand's pointee type
   Register ElemTypeReg = OpType->getOperand(2).getReg();
-  SPIRVType *ElemType = GR.getSPIRVTypeForVReg(ElemTypeReg, MF);
+  SPIRVTypeInst ElemType = GR.getSPIRVTypeForVReg(ElemTypeReg, MF);
   if (!ElemType)
     return;
   // Check if we need a bitcast to make a statement valid
@@ -212,7 +214,7 @@ static void validatePtrTypes(const SPIRVSubtarget &STI,
     return;
   // There is a type mismatch between results and operand types
   // and we insert a bitcast before the instruction to keep SPIR-V code valid
-  SPIRVType *NewPtrType =
+  SPIRVTypeInst NewPtrType =
       createNewPtrType(GR, I, OpType, IsSameMF, ResType, ResTy);
   if (!GR.isBitcastCompatible(NewPtrType, OpType))
     report_fatal_error(
@@ -230,15 +232,16 @@ static void validateGroupWaitEventsPtr(const SPIRVSubtarget &STI,
   MachineFunction *MF = I.getParent()->getParent();
   Register OpReg = I.getOperand(OpIdx).getReg();
   Register OpTypeReg = getTypeReg(MRI, OpReg);
-  SPIRVType *OpType = GR.getSPIRVTypeForVReg(OpTypeReg, MF);
+  SPIRVTypeInst OpType = GR.getSPIRVTypeForVReg(OpTypeReg, MF);
   if (!OpType || OpType->getOpcode() != SPIRV::OpTypePointer)
     return;
-  SPIRVType *ElemType = GR.getSPIRVTypeForVReg(OpType->getOperand(2).getReg());
+  SPIRVTypeInst ElemType =
+      GR.getSPIRVTypeForVReg(OpType->getOperand(2).getReg());
   if (!ElemType || ElemType->getOpcode() == SPIRV::OpTypeEvent)
     return;
   // Insert a bitcast before the instruction to keep SPIR-V code valid.
   LLVMContext &Context = MF->getFunction().getContext();
-  SPIRVType *NewPtrType =
+  SPIRVTypeInst NewPtrType =
       createNewPtrType(GR, I, OpType, false, nullptr,
                        TargetExtType::get(Context, "spirv.Event"));
   doInsertBitcast(STI, MRI, GR, I, OpReg, OpIdx, NewPtrType);
@@ -250,8 +253,8 @@ static void validateLifetimeStart(const SPIRVSubtarget &STI,
   Register PtrReg = I.getOperand(0).getReg();
   MachineFunction *MF = I.getParent()->getParent();
   Register PtrTypeReg = getTypeReg(MRI, PtrReg);
-  SPIRVType *PtrType = GR.getSPIRVTypeForVReg(PtrTypeReg, MF);
-  SPIRVType *PonteeElemType = PtrType ? GR.getPointeeType(PtrType) : nullptr;
+  SPIRVTypeInst PtrType = GR.getSPIRVTypeForVReg(PtrTypeReg, MF);
+  SPIRVTypeInst PonteeElemType = PtrType ? GR.getPointeeType(PtrType) : nullptr;
   if (!PonteeElemType || PonteeElemType->getOpcode() == SPIRV::OpTypeVoid ||
       (PonteeElemType->getOpcode() == SPIRV::OpTypeInt &&
        PonteeElemType->getOperand(1).getImm() == 8))
@@ -262,7 +265,7 @@ static void validateLifetimeStart(const SPIRVSubtarget &STI,
           PtrType->getOperand(1).getImm());
   MachineIRBuilder MIB(I);
   LLVMContext &Context = MF->getFunction().getContext();
-  SPIRVType *NewPtrType =
+  SPIRVTypeInst NewPtrType =
       GR.getOrCreateSPIRVPointerType(IntegerType::getInt8Ty(Context), MIB, SC);
   doInsertBitcast(STI, MRI, GR, I, PtrReg, 0, NewPtrType);
 }
@@ -274,15 +277,16 @@ static void validatePtrUnwrapStructField(const SPIRVSubtarget &STI,
   MachineFunction *MF = I.getParent()->getParent();
   Register OpReg = I.getOperand(OpIdx).getReg();
   Register OpTypeReg = getTypeReg(MRI, OpReg);
-  SPIRVType *OpType = GR.getSPIRVTypeForVReg(OpTypeReg, MF);
+  SPIRVTypeInst OpType = GR.getSPIRVTypeForVReg(OpTypeReg, MF);
   if (!OpType || OpType->getOpcode() != SPIRV::OpTypePointer)
     return;
-  SPIRVType *ElemType = GR.getSPIRVTypeForVReg(OpType->getOperand(2).getReg());
+  SPIRVTypeInst ElemType =
+      GR.getSPIRVTypeForVReg(OpType->getOperand(2).getReg());
   if (!ElemType || ElemType->getOpcode() != SPIRV::OpTypeStruct ||
       ElemType->getNumOperands() != 2)
     return;
   // It's a structure-wrapper around another type with a single member field.
-  SPIRVType *MemberType =
+  SPIRVTypeInst MemberType =
       GR.getSPIRVTypeForVReg(ElemType->getOperand(1).getReg());
   if (!MemberType)
     return;
@@ -296,7 +300,8 @@ static void validatePtrUnwrapStructField(const SPIRVSubtarget &STI,
       static_cast<SPIRV::StorageClass::StorageClass>(
           OpType->getOperand(1).getImm());
   MachineIRBuilder MIB(I);
-  SPIRVType *NewPtrType = GR.getOrCreateSPIRVPointerType(MemberType, MIB, SC);
+  SPIRVTypeInst NewPtrType =
+      GR.getOrCreateSPIRVPointerType(MemberType, MIB, SC);
   doInsertBitcast(STI, MRI, GR, I, OpReg, OpIdx, NewPtrType);
 }
 
@@ -320,8 +325,9 @@ void validateFunCallMachineDef(const SPIRVSubtarget &STI,
        FunDef && FunDef->getOpcode() == SPIRV::OpFunctionParameter &&
        OpIdx < FunCall.getNumOperands();
        FunDef = FunDef->getNextNode(), OpIdx++) {
-    SPIRVType *DefPtrType = DefMRI->getVRegDef(FunDef->getOperand(1).getReg());
-    SPIRVType *DefElemType =
+    SPIRVTypeInst DefPtrType =
+        DefMRI->getVRegDef(FunDef->getOperand(1).getReg());
+    SPIRVTypeInst DefElemType =
         DefPtrType && DefPtrType->getOpcode() == SPIRV::OpTypePointer
             ? GR.getSPIRVTypeForVReg(DefPtrType->getOperand(2).getReg(),
                                      DefPtrType->getParent()->getParent())
@@ -376,9 +382,9 @@ void validateForwardCalls(const SPIRVSubtarget &STI,
 // Validation of an access chain.
 void validateAccessChain(const SPIRVSubtarget &STI, MachineRegisterInfo *MRI,
                          SPIRVGlobalRegistry &GR, MachineInstr &I) {
-  SPIRVType *BaseTypeInst = GR.getSPIRVTypeForVReg(I.getOperand(0).getReg());
+  SPIRVTypeInst BaseTypeInst = GR.getSPIRVTypeForVReg(I.getOperand(0).getReg());
   if (BaseTypeInst && BaseTypeInst->getOpcode() == SPIRV::OpTypePointer) {
-    SPIRVType *BaseElemType =
+    SPIRVTypeInst BaseElemType =
         GR.getSPIRVTypeForVReg(BaseTypeInst->getOperand(2).getReg());
     validatePtrTypes(STI, MRI, GR, I, 2, BaseElemType);
   }
@@ -508,7 +514,7 @@ void SPIRVTargetLowering::finalizeLowering(MachineFunction &MF) const {
         validateGroupWaitEventsPtr(STI, MRI, GR, MI);
         break;
       case SPIRV::OpConstantI: {
-        SPIRVType *Type = GR.getSPIRVTypeForVReg(MI.getOperand(1).getReg());
+        SPIRVTypeInst Type = GR.getSPIRVTypeForVReg(MI.getOperand(1).getReg());
         if (Type->getOpcode() != SPIRV::OpTypeInt && MI.getOperand(2).isImm() &&
             MI.getOperand(2).getImm() == 0) {
           // Validate the null constant of a target extension type
@@ -523,9 +529,9 @@ void SPIRVTargetLowering::finalizeLowering(MachineFunction &MF) const {
         // doesn't dominate all uses. Let's place the type definition
         // instruction at the end of the predecessor.
         MachineBasicBlock *Curr = MI.getParent();
-        SPIRVType *Type = GR.getSPIRVTypeForVReg(MI.getOperand(1).getReg());
+        SPIRVTypeInst Type = GR.getSPIRVTypeForVReg(MI.getOperand(1).getReg());
         if (Type->getParent() == Curr && !Curr->pred_empty())
-          ToMove.insert(const_cast<MachineInstr *>(Type));
+          ToMove.insert(const_cast<MachineInstr *>(&*Type));
       } break;
       case SPIRV::OpExtInst: {
         // prefetch
@@ -539,8 +545,8 @@ void SPIRVTargetLowering::finalizeLowering(MachineFunction &MF) const {
           // The last operand must be of a pointer to i32 or vector of i32
           // values.
           MachineIRBuilder MIB(MI);
-          SPIRVType *Int32Type = GR.getOrCreateSPIRVIntegerType(32, MIB);
-          SPIRVType *RetType = MRI->getVRegDef(MI.getOperand(1).getReg());
+          SPIRVTypeInst Int32Type = GR.getOrCreateSPIRVIntegerType(32, MIB);
+          SPIRVTypeInst RetType = MRI->getVRegDef(MI.getOperand(1).getReg());
           assert(RetType && "Expected return type");
           validatePtrTypes(STI, MRI, GR, MI, MI.getNumOperands() - 1,
                            RetType->getOpcode() != SPIRV::OpTypeVector
@@ -589,9 +595,9 @@ void SPIRVTargetLowering::finalizeLowering(MachineFunction &MF) const {
 bool SPIRVTargetLowering::enforcePtrTypeCompatibility(
     MachineInstr &I, unsigned int PtrOpIdx, unsigned int OpIdx) const {
   SPIRVGlobalRegistry &GR = *STI.getSPIRVGlobalRegistry();
-  SPIRVType *PtrType = GR.getResultType(I.getOperand(PtrOpIdx).getReg());
-  SPIRVType *PointeeType = GR.getPointeeType(PtrType);
-  SPIRVType *OpType = GR.getResultType(I.getOperand(OpIdx).getReg());
+  SPIRVTypeInst PtrType = GR.getResultType(I.getOperand(PtrOpIdx).getReg());
+  SPIRVTypeInst PointeeType = GR.getPointeeType(PtrType);
+  SPIRVTypeInst OpType = GR.getResultType(I.getOperand(OpIdx).getReg());
 
   if (PointeeType == OpType)
     return true;
@@ -611,7 +617,7 @@ bool SPIRVTargetLowering::enforcePtrTypeCompatibility(
 }
 
 bool SPIRVTargetLowering::insertLogicalCopyOnResult(
-    MachineInstr &I, SPIRVType *NewResultType) const {
+    MachineInstr &I, SPIRVTypeInst NewResultType) const {
   MachineRegisterInfo *MRI = &I.getMF()->getRegInfo();
   SPIRVGlobalRegistry &GR = *STI.getSPIRVGlobalRegistry();
 
diff --git a/llvm/lib/Target/SPIRV/SPIRVISelLowering.h b/llvm/lib/Target/SPIRV/SPIRVISelLowering.h
index 7390afc1223ea..fda3602bda24f 100644
--- a/llvm/lib/Target/SPIRV/SPIRVISelLowering.h
+++ b/llvm/lib/Target/SPIRV/SPIRVISelLowering.h
@@ -74,7 +74,7 @@ class SPIRVTargetLowering : public TargetLowering {
   bool enforcePtrTypeCompatibility(MachineInstr &I, unsigned PtrOpIdx,
                                    unsigned OpIdx) const;
   bool insertLogicalCopyOnResult(MachineInstr &I,
-                                 SPIRVType *NewResultType) const;
+                                 SPIRVTypeInst NewResultType) const;
 
   AtomicExpansionKind
   shouldExpandAtomicRMWInIR(const AtomicRMWInst *RMW) const override;
diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
index cd5d416c92b96..b649189c39ea0 100644
--- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
@@ -113,28 +113,28 @@ class SPIRVInstructionSelector : public InstructionSelector {
 
   // All instruction-specific selection that didn't happen in "select()".
   // Is basically a large Switch/Case delegating to all other select method.
-  bool spvSelect(Register ResVReg, const SPIRVType *ResType,
+  bool spvSelect(Register ResVReg, SPIRVTypeInst ResType,
                  MachineInstr &I) const;
 
-  bool selectFirstBitHigh(Register ResVReg, const SPIRVType *ResType,
+  bool selectFirstBitHigh(Register ResVReg, SPIRVTypeInst ResType,
                           MachineInstr &I, bool IsSigned) const;
 
-  bool selectFirstBitLow(Register ResVReg, const SPIRVType *ResType,
+  bool selectFirstBitLow(Register ResVReg, SPIRVTypeInst ResType,
                          MachineInstr &I) const;
 
-  bool selectFirstBitSet16(Register ResVReg, const SPIRVType *ResType,
+  bool selectFirstBitSet16(Register ResVReg, SPIRVTypeInst ResType,
                            MachineInstr &I, unsigned ExtendOpcode,
                            unsigned BitSetOpcode) const;
 
-  bool selectFirstBitSet32(Register ResVReg, const SPIRVType *ResType,
+  bool selectFirstBitSet32(Register ResVReg, SPIRVTypeInst ResType,
                            MachineInstr &I, Register SrcReg,
                            unsigned BitSetOpcode) const;
 
-  bool selectFirstBitSet64(Register ResVReg, const SPIRVType *ResType,
+  bool selectFirstBitSet64(Register ResVReg, SPIRVTypeInst ResType,
                            MachineInstr &I, Register SrcReg,
                            unsigned BitSetOpcode, bool SwapPrimarySide) const;
 
-  bool selectFirstBitSet64Overflow(Register ResVReg, const SPIRVType *ResType,
+  bool selectFirstBitSet64Overflow(Register ResVReg, SPIRVTypeInst ResType,
                                    MachineInstr &I, Register SrcReg,
                                    unsigned BitSetOpcode,
                                    bool SwapPrimarySide) const;
@@ -142,21 +142,21 @@ class SPIRVInstructionSelector : public InstructionSelector {
   bool selectGlobalValue(Register ResVReg, MachineInstr &I,
                          const MachineInstr *Init = nullptr) const;
 
-  bool selectOpWithSrcs(Register ResVReg, const SPIRVType *ResType,
+  bool selectOpWithSrcs(Register ResVReg, SPIRVTypeInst ResType,
                         MachineInstr &I, std::vector<Register> SrcRegs,
                         unsigned Opcode) const;
 
-  bool selectUnOp(Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
+  bool selectUnOp(Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
                   unsigned Opcode) const;
 
-  bool selectBitcast(Register ResVReg, const SPIRVType *ResType,
+  bool selectBitcast(Register ResVReg, SPIRVTypeInst ResType,
                      MachineInstr &I) const;
 
-  bool selectLoad(Register ResVReg, const SPIRVType *ResType,
+  bool selectLoad(Register ResVReg, SPIRVTypeInst ResType,
                   MachineInstr &I) const;
   bool selectStore(MachineInstr &I) const;
 
-  bool selectStackSave(Register ResVReg, const SPIRVType *ResType,
+  bool selectStackSave(Register ResVReg, SPIRVTypeInst ResType,
                        MachineInstr &I) const;
   bool selectStackRestore(MachineInstr &I) const;
 
@@ -165,229 +165,225 @@ class SPIRVInstructionSelector : public InstructionSelector {
   bool selectCopyMemory(MachineInstr &I, Register SrcReg) const;
   bool selectCopyMemorySized(MachineInstr &I, Register SrcReg) const;
 
-  bool selectAtomicRMW(Register ResVReg, const SPIRVType *ResType,
-                       MachineInstr &I, unsigned NewOpcode,
-                       unsigned NegateOpcode = 0) const;
+  bool selectAtomicRMW(Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
+                       unsigned NewOpcode, unsigned NegateOpcode = 0) const;
 
-  bool selectAtomicCmpXchg(Register ResVReg, const SPIRVType *ResType,
+  bool selectAtomicCmpXchg(Register ResVReg, SPIRVTypeInst ResType,
                            MachineInstr &I) const;
 
   bool selectFence(MachineInstr &I) const;
 
-  bool selectAddrSpaceCast(Register ResVReg, const SPIRVType *ResType,
+  bool selectAddrSpaceCast(Register ResVReg, SPIRVTypeInst ResType,
                            MachineInstr &I) const;
 
-  bool selectAnyOrAll(Register ResVReg, const SPIRVType *ResType,
-                      MachineInstr &I, unsigned OpType) const;
+  bool selectAnyOrAll(Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
+                      unsigned OpType) const;
 
-  bool selectAll(Register ResVReg, const SPIRVType *ResType,
+  bool selectAll(Register ResVReg, SPIRVTypeInst ResType,
                  MachineInstr &I) const;
 
-  bool selectAny(Register ResVReg, const SPIRVType *ResType,
+  bool selectAny(Register ResVReg, SPIRVTypeInst ResType,
                  MachineInstr &I) const;
 
-  bool selectBitreverse(Register ResVReg, const SPIRVType *ResType,
+  bool selectBitreverse(Register ResVReg, SPIRVTypeInst ResType,
                         MachineInstr &I) const;
 
-  bool selectBuildVector(Register ResVReg, const SPIRVType *ResType,
+  bool selectBuildVector(Register ResVReg, SPIRVTypeInst ResType,
                          MachineInstr &I) const;
-  bool selectSplatVector(Register ResVReg, const SPIRVType *ResType,
+  bool selectSplatVector(Register ResVReg, SPIRVTypeInst ResType,
                          MachineInstr &I) const;
 
-  bool selectCmp(Register ResVReg, const SPIRVType *ResType,
+  bool selectCmp(Register ResVReg, SPIRVTypeInst ResType,
                  unsigned comparisonOpcode, MachineInstr &I) const;
-  bool selectDiscard(Register ResVReg, const SPIRVType *ResType,
+  bool selectDiscard(Register ResVReg, SPIRVTypeInst ResType,
                      MachineInstr &I) const;
 
-  bool selectICmp(Register ResVReg, const SPIRVType *ResType,
+  bool selectICmp(Register ResVReg, SPIRVTypeInst ResType,
                   MachineInstr &I) const;
-  bool selectFCmp(Register ResVReg, const SPIRVType *ResType,
+  bool selectFCmp(Register ResVReg, SPIRVTypeInst ResType,
                   MachineInstr &I) const;
 
-  bool selectSign(Register ResVReg, const SPIRVType *ResType,
+  bool selectSign(Register ResVReg, SPIRVTypeInst ResType,
                   MachineInstr &I) const;
 
-  bool selectFloatDot(Register ResVReg, const SPIRVType *ResType,
+  bool selectFloatDot(Register ResVReg, SPIRVTypeInst ResType,
                       MachineInstr &I) const;
 
-  bool selectOverflowArith(Register ResVReg, const SPIRVType *ResType,
+  bool selectOverflowArith(Register ResVReg, SPIRVTypeInst ResType,
                            MachineInstr &I, unsigned Opcode) const;
-  bool selectDebugTrap(Register ResVReg, const SPIRVType *ResType,
+  bool selectDebugTrap(Register ResVReg, SPIRVTypeInst ResType,
                        MachineInstr &I) const;
 
-  bool selectIntegerDot(Register ResVReg, const SPIRVType *ResType,
+  bool selectIntegerDot(Register ResVReg, SPIRVTypeInst ResType,
                         MachineInstr &I, bool Signed) const;
 
-  bool selectIntegerDotExpansion(Register ResVReg, const SPIRVType *ResType,
+  bool selectIntegerDotExpansion(Register ResVReg, SPIRVTypeInst ResType,
                                  MachineInstr &I) const;
 
-  bool selectOpIsInf(Register ResVReg, const SPIRVType *ResType,
+  bool selectOpIsInf(Register ResVReg, SPIRVTypeInst ResType,
                      MachineInstr &I) const;
 
-  bool selectOpIsNan(Register ResVReg, const SPIRVType *ResType,
+  bool selectOpIsNan(Register ResVReg, SPIRVTypeInst ResType,
                      MachineInstr &I) const;
 
   template <bool Signed>
-  bool selectDot4AddPacked(Register ResVReg, const SPIRVType *ResType,
+  bool selectDot4AddPacked(Register ResVReg, SPIRVTypeInst ResType,
                            MachineInstr &I) const;
   template <bool Signed>
-  bool selectDot4AddPackedExpansion(Register ResVReg, const SPIRVType *ResType,
+  bool selectDot4AddPackedExpansion(Register ResVReg, SPIRVTypeInst ResType,
                                     MachineInstr &I) const;
 
-  bool selectWavePrefixBitCount(Register ResVReg, const SPIRVType *ResType,
+  bool selectWavePrefixBitCount(Register ResVReg, SPIRVTypeInst ResType,
                                 MachineInstr &I) const;
 
   template <typename PickOpcodeFn>
-  bool selectWaveReduce(Register ResVReg, const SPIRVType *ResType,
+  bool selectWaveReduce(Register ResVReg, SPIRVTypeInst ResType,
                         MachineInstr &I, bool IsUnsigned,
                         PickOpcodeFn &&PickOpcode) const;
 
-  bool selectWaveReduceMax(Register ResVReg, const SPIRVType *ResType,
+  bool selectWaveReduceMax(Register ResVReg, SPIRVTypeInst ResType,
                            MachineInstr &I, bool IsUnsigned) const;
 
-  bool selectWaveReduceMin(Register ResVReg, const SPIRVType *ResType,
+  bool selectWaveReduceMin(Register ResVReg, SPIRVTypeInst ResType,
                            MachineInstr &I, bool IsUnsigned) const;
 
-  bool selectWaveReduceSum(Register ResVReg, const SPIRVType *ResType,
+  bool selectWaveReduceSum(Register ResVReg, SPIRVTypeInst ResType,
                            MachineInstr &I) const;
 
   template <typename PickOpcodeFn>
-  bool selectWaveExclusiveScan(Register ResVReg, const SPIRVType *ResType,
+  bool selectWaveExclusiveScan(Register ResVReg, SPIRVTypeInst ResType,
                                MachineInstr &I, bool IsUnsigned,
                                PickOpcodeFn &&PickOpcode) const;
 
-  bool selectWaveExclusiveScanSum(Register ResVReg, const SPIRVType *ResType,
+  bool selectWaveExclusiveScanSum(Register ResVReg, SPIRVTypeInst ResType,
                                   MachineInstr &I) const;
 
-  bool selectConst(Register ResVReg, const SPIRVType *ResType,
+  bool selectConst(Register ResVReg, SPIRVTypeInst ResType,
                    MachineInstr &I) const;
 
-  bool selectSelect(Register ResVReg, const SPIRVType *ResType,
+  bool selectSelect(Register ResVReg, SPIRVTypeInst ResType,
                     MachineInstr &I) const;
-  bool selectSelectDefaultArgs(Register ResVReg, const SPIRVType *ResType,
+  bool selectSelectDefaultArgs(Register ResVReg, SPIRVTypeInst ResType,
                                MachineInstr &I, bool IsSigned) const;
-  bool selectIToF(Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
+  bool selectIToF(Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
                   bool IsSigned, unsigned Opcode) const;
-  bool selectExt(Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
+  bool selectExt(Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
                  bool IsSigned) const;
 
-  bool selectTrunc(Register ResVReg, const SPIRVType *ResType,
+  bool selectTrunc(Register ResVReg, SPIRVTypeInst ResType,
                    MachineInstr &I) const;
 
-  bool selectSUCmp(Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
+  bool selectSUCmp(Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
                    bool IsSigned) const;
 
   bool selectIntToBool(Register IntReg, Register ResVReg, MachineInstr &I,
-                       const SPIRVType *intTy, const SPIRVType *boolTy) const;
+                       SPIRVTypeInst intTy, SPIRVTypeInst boolTy) const;
 
-  bool selectOpUndef(Register ResVReg, const SPIRVType *ResType,
+  bool selectOpUndef(Register ResVReg, SPIRVTypeInst ResType,
                      MachineInstr &I) const;
-  bool selectFreeze(Register ResVReg, const SPIRVType *ResType,
+  bool selectFreeze(Register ResVReg, SPIRVTypeInst ResType,
                     MachineInstr &I) const;
-  bool selectIntrinsic(Register ResVReg, const SPIRVType *ResType,
+  bool selectIntrinsic(Register ResVReg, SPIRVTypeInst ResType,
                        MachineInstr &I) const;
-  bool selectExtractVal(Register ResVReg, const SPIRVType *ResType,
+  bool selectExtractVal(Register ResVReg, SPIRVTypeInst ResType,
                         MachineInstr &I) const;
-  bool selectInsertVal(Register ResVReg, const SPIRVType *ResType,
+  bool selectInsertVal(Register ResVReg, SPIRVTypeInst ResType,
                        MachineInstr &I) const;
-  bool selectExtractElt(Register ResVReg, const SPIRVType *ResType,
+  bool selectExtractElt(Register ResVReg, SPIRVTypeInst ResType,
                         MachineInstr &I) const;
-  bool selectInsertElt(Register ResVReg, const SPIRVType *ResType,
+  bool selectInsertElt(Register ResVReg, SPIRVTypeInst ResType,
                        MachineInstr &I) const;
-  bool selectGEP(Register ResVReg, const SPIRVType *ResType,
+  bool selectGEP(Register ResVReg, SPIRVTypeInst ResType,
                  MachineInstr &I) const;
 
-  bool selectFrameIndex(Register ResVReg, const SPIRVType *ResType,
+  bool selectFrameIndex(Register ResVReg, SPIRVTypeInst ResType,
                         MachineInstr &I) const;
-  bool selectAllocaArray(Register ResVReg, const SPIRVType *ResType,
+  bool selectAllocaArray(Register ResVReg, SPIRVTypeInst ResType,
                          MachineInstr &I) const;
 
   bool selectBranch(MachineInstr &I) const;
   bool selectBranchCond(MachineInstr &I) const;
 
-  bool selectPhi(Register ResVReg, const SPIRVType *ResType,
+  bool selectPhi(Register ResVReg, SPIRVTypeInst ResType,
                  MachineInstr &I) const;
 
-  bool selectExtInst(Register ResVReg, const SPIRVType *RestType,
-                     MachineInstr &I, GL::GLSLExtInst GLInst) const;
-  bool selectExtInst(Register ResVReg, const SPIRVType *ResType,
-                     MachineInstr &I, CL::OpenCLExtInst CLInst) const;
-  bool selectExtInst(Register ResVReg, const SPIRVType *ResType,
-                     MachineInstr &I, CL::OpenCLExtInst CLInst,
+  bool selectExtInst(Register ResVReg, SPIRVTypeInst RestType, MachineInstr &I,
                      GL::GLSLExtInst GLInst) const;
-  bool selectExtInst(Register ResVReg, const SPIRVType *ResType,
-                     MachineInstr &I, const ExtInstList &ExtInsts) const;
-  bool selectExtInstForLRound(Register ResVReg, const SPIRVType *ResType,
+  bool selectExtInst(Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
+                     CL::OpenCLExtInst CLInst) const;
+  bool selectExtInst(Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
+                     CL::OpenCLExtInst CLInst, GL::GLSLExtInst GLInst) const;
+  bool selectExtInst(Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
+                     const ExtInstList &ExtInsts) const;
+  bool selectExtInstForLRound(Register ResVReg, SPIRVTypeInst ResType,
                               MachineInstr &I, CL::OpenCLExtInst CLInst,
                               GL::GLSLExtInst GLInst) const;
-  bool selectExtInstForLRound(Register ResVReg, const SPIRVType *ResType,
+  bool selectExtInstForLRound(Register ResVReg, SPIRVTypeInst ResType,
                               MachineInstr &I,
                               const ExtInstList &ExtInsts) const;
 
-  bool selectLog10(Register ResVReg, const SPIRVType *ResType,
+  bool selectLog10(Register ResVReg, SPIRVTypeInst ResType,
                    MachineInstr &I) const;
 
-  bool selectSaturate(Register ResVReg, const SPIRVType *ResType,
+  bool selectSaturate(Register ResVReg, SPIRVTypeInst ResType,
                       MachineInstr &I) const;
 
-  bool selectWaveOpInst(Register ResVReg, const SPIRVType *ResType,
+  bool selectWaveOpInst(Register ResVReg, SPIRVTypeInst ResType,
                         MachineInstr &I, unsigned Opcode) const;
 
-  bool selectWaveActiveCountBits(Register ResVReg, const SPIRVType *ResType,
+  bool selectWaveActiveCountBits(Register ResVReg, SPIRVTypeInst ResType,
                                  MachineInstr &I) const;
 
   bool selectUnmergeValues(MachineInstr &I) const;
 
-  bool selectHandleFromBinding(Register &ResVReg, const SPIRVType *ResType,
+  bool selectHandleFromBinding(Register &ResVReg, SPIRVTypeInst ResType,
                                MachineInstr &I) const;
 
-  bool selectCounterHandleFromBinding(Register &ResVReg,
-                                      const SPIRVType *ResType,
+  bool selectCounterHandleFromBinding(Register &ResVReg, SPIRVTypeInst ResType,
                                       MachineInstr &I) const;
 
-  bool selectReadImageIntrinsic(Register &ResVReg, const SPIRVType *ResType,
+  bool selectReadImageIntrinsic(Register &ResVReg, SPIRVTypeInst ResType,
                                 MachineInstr &I) const;
-  bool selectSampleBasicIntrinsic(Register &ResVReg, const SPIRVType *ResType,
+  bool selectSampleBasicIntrinsic(Register &ResVReg, SPIRVTypeInst ResType,
                                   MachineInstr &I) const;
-  bool selectSampleBiasIntrinsic(Register &ResVReg, const SPIRVType *ResType,
+  bool selectSampleBiasIntrinsic(Register &ResVReg, SPIRVTypeInst ResType,
                                  MachineInstr &I) const;
-  bool selectSampleGradIntrinsic(Register &ResVReg, const SPIRVType *ResType,
+  bool selectSampleGradIntrinsic(Register &ResVReg, SPIRVTypeInst ResType,
                                  MachineInstr &I) const;
-  bool selectSampleLevelIntrinsic(Register &ResVReg, const SPIRVType *ResType,
+  bool selectSampleLevelIntrinsic(Register &ResVReg, SPIRVTypeInst ResType,
                                   MachineInstr &I) const;
-  bool selectSampleCmpIntrinsic(Register &ResVReg, const SPIRVType *ResType,
+  bool selectSampleCmpIntrinsic(Register &ResVReg, SPIRVTypeInst ResType,
                                 MachineInstr &I) const;
   bool selectSampleCmpLevelZeroIntrinsic(Register &ResVReg,
-                                         const SPIRVType *ResType,
+                                         SPIRVTypeInst ResType,
                                          MachineInstr &I) const;
   bool selectImageWriteIntrinsic(MachineInstr &I) const;
-  bool selectResourceGetPointer(Register &ResVReg, const SPIRVType *ResType,
+  bool selectResourceGetPointer(Register &ResVReg, SPIRVTypeInst ResType,
                                 MachineInstr &I) const;
-  bool selectPushConstantGetPointer(Register &ResVReg, const SPIRVType *ResType,
+  bool selectPushConstantGetPointer(Register &ResVReg, SPIRVTypeInst ResType,
                                     MachineInstr &I) const;
-  bool selectResourceNonUniformIndex(Register &ResVReg,
-                                     const SPIRVType *ResType,
+  bool selectResourceNonUniformIndex(Register &ResVReg, SPIRVTypeInst ResType,
                                      MachineInstr &I) const;
-  bool selectModf(Register ResVReg, const SPIRVType *ResType,
+  bool selectModf(Register ResVReg, SPIRVTypeInst ResType,
                   MachineInstr &I) const;
-  bool selectUpdateCounter(Register &ResVReg, const SPIRVType *ResType,
+  bool selectUpdateCounter(Register &ResVReg, SPIRVTypeInst ResType,
                            MachineInstr &I) const;
-  bool selectFrexp(Register ResVReg, const SPIRVType *ResType,
+  bool selectFrexp(Register ResVReg, SPIRVTypeInst ResType,
                    MachineInstr &I) const;
-  bool selectSincos(Register ResVReg, const SPIRVType *ResType,
+  bool selectSincos(Register ResVReg, SPIRVTypeInst ResType,
                     MachineInstr &I) const;
-  bool selectDerivativeInst(Register ResVReg, const SPIRVType *ResType,
+  bool selectDerivativeInst(Register ResVReg, SPIRVTypeInst ResType,
                             MachineInstr &I, const unsigned DPdOpCode) const;
   // Utilities
   Register buildI32Constant(uint32_t Val, MachineInstr &I,
-                            const SPIRVType *ResType = nullptr) const;
+                            SPIRVTypeInst ResType = nullptr) const;
 
-  Register buildZerosVal(const SPIRVType *ResType, MachineInstr &I) const;
+  Register buildZerosVal(SPIRVTypeInst ResType, MachineInstr &I) const;
   bool isScalarOrVectorIntConstantZero(Register Reg) const;
-  Register buildZerosValF(const SPIRVType *ResType, MachineInstr &I) const;
-  Register buildOnesVal(bool AllOnes, const SPIRVType *ResType,
+  Register buildZerosValF(SPIRVTypeInst ResType, MachineInstr &I) const;
+  Register buildOnesVal(bool AllOnes, SPIRVTypeInst ResType,
                         MachineInstr &I) const;
-  Register buildOnesValF(const SPIRVType *ResType, MachineInstr &I) const;
+  Register buildOnesValF(SPIRVTypeInst ResType, MachineInstr &I) const;
 
   bool wrapIntoSpecConstantOp(MachineInstr &I,
                               SmallVector<Register> &CompositeArgs) const;
@@ -398,31 +394,31 @@ class SPIRVInstructionSelector : public InstructionSelector {
                                           Register Src, Register DestType,
                                           uint32_t Opcode) const;
   MachineInstrBuilder buildConstGenericPtr(MachineInstr &I, Register SrcPtr,
-                                           SPIRVType *SrcPtrTy) const;
-  Register buildPointerToResource(const SPIRVType *ResType,
+                                           SPIRVTypeInst SrcPtrTy) const;
+  Register buildPointerToResource(SPIRVTypeInst ResType,
                                   SPIRV::StorageClass::StorageClass SC,
                                   uint32_t Set, uint32_t Binding,
                                   uint32_t ArraySize, Register IndexReg,
                                   StringRef Name,
                                   MachineIRBuilder MIRBuilder) const;
-  SPIRVType *widenTypeToVec4(const SPIRVType *Type, MachineInstr &I) const;
-  bool extractSubvector(Register &ResVReg, const SPIRVType *ResType,
+  SPIRVTypeInst widenTypeToVec4(SPIRVTypeInst Type, MachineInstr &I) const;
+  bool extractSubvector(Register &ResVReg, SPIRVTypeInst ResType,
                         Register &ReadReg, MachineInstr &InsertionPoint) const;
-  bool generateImageReadOrFetch(Register &ResVReg, const SPIRVType *ResType,
+  bool generateImageReadOrFetch(Register &ResVReg, SPIRVTypeInst ResType,
                                 Register ImageReg, Register IdxReg,
                                 DebugLoc Loc, MachineInstr &Pos) const;
-  bool generateSampleImage(Register ResVReg, const SPIRVType *ResType,
+  bool generateSampleImage(Register ResVReg, SPIRVTypeInst ResType,
                            Register ImageReg, Register SamplerReg,
                            Register CoordinateReg, const ImageOperands &ImOps,
                            DebugLoc Loc, MachineInstr &I) const;
   bool BuildCOPY(Register DestReg, Register SrcReg, MachineInstr &I) const;
   bool loadVec3BuiltinInputID(SPIRV::BuiltIn::BuiltIn BuiltInValue,
-                              Register ResVReg, const SPIRVType *ResType,
+                              Register ResVReg, SPIRVTypeInst ResType,
                               MachineInstr &I) const;
   bool loadBuiltinInputID(SPIRV::BuiltIn::BuiltIn BuiltInValue,
-                          Register ResVReg, const SPIRVType *ResType,
+                          Register ResVReg, SPIRVTypeInst ResType,
                           MachineInstr &I) const;
-  bool loadHandleBeforePosition(Register &HandleReg, const SPIRVType *ResType,
+  bool loadHandleBeforePosition(Register &HandleReg, SPIRVTypeInst ResType,
                                 GIntrinsic &HandleDef, MachineInstr &Pos) const;
   void decorateUsesAsNonUniform(Register &NonUniformReg) const;
   void errorIfInstrOutsideShader(MachineInstr &I) const;
@@ -839,7 +835,7 @@ bool SPIRVInstructionSelector::select(MachineInstr &I) {
   // from parent occurs here. Instr-specific selection happens in spvSelect().
   bool HasDefs = I.getNumDefs() > 0;
   Register ResVReg = HasDefs ? I.getOperand(0).getReg() : Register(0);
-  SPIRVType *ResType = HasDefs ? GR.getSPIRVTypeForVReg(ResVReg) : nullptr;
+  SPIRVTypeInst ResType = HasDefs ? GR.getSPIRVTypeForVReg(ResVReg) : nullptr;
   assert(!HasDefs || ResType || I.getOpcode() == TargetOpcode::G_GLOBAL_VALUE ||
          I.getOpcode() == TargetOpcode::G_IMPLICIT_DEF);
   if (spvSelect(ResVReg, ResType, I)) {
@@ -879,7 +875,7 @@ bool SPIRVInstructionSelector::BuildCOPY(Register DestReg, Register SrcReg,
 }
 
 bool SPIRVInstructionSelector::spvSelect(Register ResVReg,
-                                         const SPIRVType *ResType,
+                                         SPIRVTypeInst ResType,
                                          MachineInstr &I) const {
   const unsigned Opcode = I.getOpcode();
   if (mayApplyGenericSelection(Opcode))
@@ -1173,9 +1169,9 @@ bool SPIRVInstructionSelector::spvSelect(Register ResVReg,
     }
     MachineBasicBlock &BB = *I.getParent();
     if (!IsGVInit) {
-      SPIRVType *GVType = GR.getSPIRVTypeForVReg(GV);
-      SPIRVType *GVPointeeType = GR.getPointeeType(GVType);
-      SPIRVType *ResPointeeType = GR.getPointeeType(ResType);
+      SPIRVTypeInst GVType = GR.getSPIRVTypeForVReg(GV);
+      SPIRVTypeInst GVPointeeType = GR.getPointeeType(GVType);
+      SPIRVTypeInst ResPointeeType = GR.getPointeeType(ResType);
       if (GVPointeeType && ResPointeeType && GVPointeeType != ResPointeeType) {
         // Build a new virtual register that is associated with the required
         // data type.
@@ -1296,7 +1292,7 @@ bool SPIRVInstructionSelector::spvSelect(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectDebugTrap(Register ResVReg,
-                                               const SPIRVType *ResType,
+                                               SPIRVTypeInst ResType,
                                                MachineInstr &I) const {
   unsigned Opcode = SPIRV::OpNop;
   MachineBasicBlock &BB = *I.getParent();
@@ -1306,7 +1302,7 @@ bool SPIRVInstructionSelector::selectDebugTrap(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectExtInst(Register ResVReg,
-                                             const SPIRVType *ResType,
+                                             SPIRVTypeInst ResType,
                                              MachineInstr &I,
                                              GL::GLSLExtInst GLInst) const {
   if (!STI.canUseExtInstSet(
@@ -1322,7 +1318,7 @@ bool SPIRVInstructionSelector::selectExtInst(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectExtInst(Register ResVReg,
-                                             const SPIRVType *ResType,
+                                             SPIRVTypeInst ResType,
                                              MachineInstr &I,
                                              CL::OpenCLExtInst CLInst) const {
   return selectExtInst(ResVReg, ResType, I,
@@ -1330,7 +1326,7 @@ bool SPIRVInstructionSelector::selectExtInst(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectExtInst(Register ResVReg,
-                                             const SPIRVType *ResType,
+                                             SPIRVTypeInst ResType,
                                              MachineInstr &I,
                                              CL::OpenCLExtInst CLInst,
                                              GL::GLSLExtInst GLInst) const {
@@ -1340,7 +1336,7 @@ bool SPIRVInstructionSelector::selectExtInst(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectExtInst(Register ResVReg,
-                                             const SPIRVType *ResType,
+                                             SPIRVTypeInst ResType,
                                              MachineInstr &I,
                                              const ExtInstList &Insts) const {
 
@@ -1370,7 +1366,7 @@ bool SPIRVInstructionSelector::selectExtInst(Register ResVReg,
   return false;
 }
 bool SPIRVInstructionSelector::selectExtInstForLRound(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
     CL::OpenCLExtInst CLInst, GL::GLSLExtInst GLInst) const {
   ExtInstList ExtInsts = {{SPIRV::InstructionSet::OpenCL_std, CLInst},
                           {SPIRV::InstructionSet::GLSL_std_450, GLInst}};
@@ -1378,7 +1374,7 @@ bool SPIRVInstructionSelector::selectExtInstForLRound(
 }
 
 bool SPIRVInstructionSelector::selectExtInstForLRound(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
     const ExtInstList &Insts) const {
   for (const auto &Ex : Insts) {
     SPIRV::InstructionSet::InstructionSet Set = Ex.first;
@@ -1406,7 +1402,7 @@ bool SPIRVInstructionSelector::selectExtInstForLRound(
 }
 
 bool SPIRVInstructionSelector::selectFrexp(Register ResVReg,
-                                           const SPIRVType *ResType,
+                                           SPIRVTypeInst ResType,
                                            MachineInstr &I) const {
   ExtInstList ExtInsts = {{SPIRV::InstructionSet::OpenCL_std, CL::frexp},
                           {SPIRV::InstructionSet::GLSL_std_450, GL::Frexp}};
@@ -1417,8 +1413,8 @@ bool SPIRVInstructionSelector::selectFrexp(Register ResVReg,
       continue;
 
     MachineIRBuilder MIRBuilder(I);
-    SPIRVType *PointeeTy = GR.getSPIRVTypeForVReg(I.getOperand(1).getReg());
-    const SPIRVType *PointerType = GR.getOrCreateSPIRVPointerType(
+    SPIRVTypeInst PointeeTy = GR.getSPIRVTypeForVReg(I.getOperand(1).getReg());
+    const SPIRVTypeInst PointerType = GR.getOrCreateSPIRVPointerType(
         PointeeTy, MIRBuilder, SPIRV::StorageClass::Function);
     Register PointerVReg =
         createVirtualRegister(PointerType, &GR, MRI, MRI->getMF());
@@ -1450,7 +1446,7 @@ bool SPIRVInstructionSelector::selectFrexp(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectSincos(Register ResVReg,
-                                            const SPIRVType *ResType,
+                                            SPIRVTypeInst ResType,
                                             MachineInstr &I) const {
   Register CosResVReg = I.getOperand(1).getReg();
   unsigned SrcIdx = I.getNumExplicitDefs();
@@ -1459,7 +1455,7 @@ bool SPIRVInstructionSelector::selectSincos(Register ResVReg,
   if (STI.canUseExtInstSet(SPIRV::InstructionSet::OpenCL_std)) {
     // OpenCL.std sincos(x, cosval*) -> returns sin(x), writes cos(x) to ptr.
     MachineIRBuilder MIRBuilder(I);
-    const SPIRVType *PointerType = GR.getOrCreateSPIRVPointerType(
+    const SPIRVTypeInst PointerType = GR.getOrCreateSPIRVPointerType(
         ResType, MIRBuilder, SPIRV::StorageClass::Function);
     Register PointerVReg =
         createVirtualRegister(PointerType, &GR, MRI, MRI->getMF());
@@ -1506,7 +1502,7 @@ bool SPIRVInstructionSelector::selectSincos(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectOpWithSrcs(Register ResVReg,
-                                                const SPIRVType *ResType,
+                                                SPIRVTypeInst ResType,
                                                 MachineInstr &I,
                                                 std::vector<Register> Srcs,
                                                 unsigned Opcode) const {
@@ -1521,7 +1517,7 @@ bool SPIRVInstructionSelector::selectOpWithSrcs(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectUnOp(Register ResVReg,
-                                          const SPIRVType *ResType,
+                                          SPIRVTypeInst ResType,
                                           MachineInstr &I,
                                           unsigned Opcode) const {
   if (STI.isPhysicalSPIRV() && I.getOperand(1).isReg()) {
@@ -1571,10 +1567,11 @@ bool SPIRVInstructionSelector::selectUnOp(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectBitcast(Register ResVReg,
-                                             const SPIRVType *ResType,
+                                             SPIRVTypeInst ResType,
                                              MachineInstr &I) const {
   Register OpReg = I.getOperand(1).getReg();
-  SPIRVType *OpType = OpReg.isValid() ? GR.getSPIRVTypeForVReg(OpReg) : nullptr;
+  SPIRVTypeInst OpType =
+      OpReg.isValid() ? GR.getSPIRVTypeForVReg(OpReg) : nullptr;
   if (!GR.isBitcastCompatible(ResType, OpType))
     report_fatal_error("incompatible result and operand types in a bitcast");
   return selectUnOp(ResVReg, ResType, I, SPIRV::OpBitcast);
@@ -1634,7 +1631,7 @@ static void addMemoryOperands(uint64_t Flags, MachineInstrBuilder &MIB) {
 }
 
 bool SPIRVInstructionSelector::selectLoad(Register ResVReg,
-                                          const SPIRVType *ResType,
+                                          SPIRVTypeInst ResType,
                                           MachineInstr &I) const {
   unsigned OpOffset = isa<GIntrinsic>(I) ? 1 : 0;
   Register Ptr = I.getOperand(1 + OpOffset).getReg();
@@ -1644,7 +1641,7 @@ bool SPIRVInstructionSelector::selectLoad(Register ResVReg,
   if (IntPtrDef &&
       IntPtrDef->getIntrinsicID() == Intrinsic::spv_resource_getpointer) {
     Register HandleReg = IntPtrDef->getOperand(2).getReg();
-    SPIRVType *HandleType = GR.getSPIRVTypeForVReg(HandleReg);
+    SPIRVTypeInst HandleType = GR.getSPIRVTypeForVReg(HandleReg);
     if (HandleType->getOpcode() == SPIRV::OpTypeImage) {
       Register NewHandleReg =
           MRI->createVirtualRegister(MRI->getRegClass(HandleReg));
@@ -1689,7 +1686,7 @@ bool SPIRVInstructionSelector::selectStore(MachineInstr &I) const {
     Register NewHandleReg =
         MRI->createVirtualRegister(MRI->getRegClass(HandleReg));
     auto *HandleDef = cast<GIntrinsic>(getVRegDef(*MRI, HandleReg));
-    SPIRVType *HandleType = GR.getSPIRVTypeForVReg(HandleReg);
+    SPIRVTypeInst HandleType = GR.getSPIRVTypeForVReg(HandleReg);
     if (!loadHandleBeforePosition(NewHandleReg, HandleType, *HandleDef, I)) {
       return false;
     }
@@ -1729,7 +1726,7 @@ bool SPIRVInstructionSelector::selectStore(MachineInstr &I) const {
 }
 
 bool SPIRVInstructionSelector::selectStackSave(Register ResVReg,
-                                               const SPIRVType *ResType,
+                                               SPIRVTypeInst ResType,
                                                MachineInstr &I) const {
   if (!STI.canUseExtension(SPIRV::Extension::SPV_INTEL_variable_length_array))
     report_fatal_error(
@@ -1775,10 +1772,10 @@ SPIRVInstructionSelector::getOrCreateMemSetGlobal(MachineInstr &I) const {
 
   Type *ValTy = Type::getInt8Ty(I.getMF()->getFunction().getContext());
   Type *ArrTy = ArrayType::get(ValTy, Num);
-  SPIRVType *VarTy = GR.getOrCreateSPIRVPointerType(
+  SPIRVTypeInst VarTy = GR.getOrCreateSPIRVPointerType(
       ArrTy, MIRBuilder, SPIRV::StorageClass::UniformConstant);
 
-  SPIRVType *SpvArrTy = GR.getOrCreateSPIRVType(
+  SPIRVTypeInst SpvArrTy = GR.getOrCreateSPIRVType(
       ArrTy, MIRBuilder, SPIRV::AccessQualifier::None, false);
 
   unsigned Val = getIConstVal(I.getOperand(1).getReg(), MRI);
@@ -1804,12 +1801,12 @@ bool SPIRVInstructionSelector::selectCopyMemory(MachineInstr &I,
                                                 Register SrcReg) const {
   MachineBasicBlock &BB = *I.getParent();
   Register DstReg = I.getOperand(0).getReg();
-  SPIRVType *DstTy = GR.getSPIRVTypeForVReg(DstReg);
-  SPIRVType *SrcTy = GR.getSPIRVTypeForVReg(SrcReg);
+  SPIRVTypeInst DstTy = GR.getSPIRVTypeForVReg(DstReg);
+  SPIRVTypeInst SrcTy = GR.getSPIRVTypeForVReg(SrcReg);
   if (GR.getPointeeType(DstTy) != GR.getPointeeType(SrcTy))
     report_fatal_error("OpCopyMemory requires operands to have the same type");
   uint64_t CopySize = getIConstVal(I.getOperand(2).getReg(), MRI);
-  SPIRVType *PointeeTy = GR.getPointeeType(DstTy);
+  SPIRVTypeInst PointeeTy = GR.getPointeeType(DstTy);
   const Type *LLVMPointeeTy = GR.getTypeForSPIRVType(PointeeTy);
   if (!LLVMPointeeTy)
     report_fatal_error(
@@ -1852,7 +1849,7 @@ bool SPIRVInstructionSelector::selectMemOperation(Register ResVReg,
     if (!VarReg.isValid())
       return false;
     Type *ValTy = Type::getInt8Ty(I.getMF()->getFunction().getContext());
-    SPIRVType *SourceTy = GR.getOrCreateSPIRVPointerType(
+    SPIRVTypeInst SourceTy = GR.getOrCreateSPIRVPointerType(
         ValTy, I, SPIRV::StorageClass::UniformConstant);
     SrcReg = MRI->createGenericVirtualRegister(LLT::scalar(64));
     if (!selectOpWithSrcs(SrcReg, SourceTy, I, {VarReg}, SPIRV::OpBitcast))
@@ -1872,7 +1869,7 @@ bool SPIRVInstructionSelector::selectMemOperation(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectAtomicRMW(Register ResVReg,
-                                               const SPIRVType *ResType,
+                                               SPIRVTypeInst ResType,
                                                MachineInstr &I,
                                                unsigned NewOpcode,
                                                unsigned NegateOpcode) const {
@@ -1914,19 +1911,19 @@ bool SPIRVInstructionSelector::selectUnmergeValues(MachineInstr &I) const {
   unsigned ArgI = I.getNumOperands() - 1;
   Register SrcReg =
       I.getOperand(ArgI).isReg() ? I.getOperand(ArgI).getReg() : Register(0);
-  SPIRVType *SrcType =
+  SPIRVTypeInst SrcType =
       SrcReg.isValid() ? GR.getSPIRVTypeForVReg(SrcReg) : nullptr;
   if (!SrcType || SrcType->getOpcode() != SPIRV::OpTypeVector)
     report_fatal_error(
         "cannot select G_UNMERGE_VALUES with a non-vector argument");
 
-  SPIRVType *ScalarType =
+  SPIRVTypeInst ScalarType =
       GR.getSPIRVTypeForVReg(SrcType->getOperand(1).getReg());
   MachineBasicBlock &BB = *I.getParent();
   unsigned CurrentIndex = 0;
   for (unsigned i = 0; i < I.getNumDefs(); ++i) {
     Register ResVReg = I.getOperand(i).getReg();
-    SPIRVType *ResType = GR.getSPIRVTypeForVReg(ResVReg);
+    SPIRVTypeInst ResType = GR.getSPIRVTypeForVReg(ResVReg);
     if (!ResType) {
       LLT ResLLT = MRI->getType(ResVReg);
       assert(ResLLT.isValid());
@@ -1985,7 +1982,7 @@ bool SPIRVInstructionSelector::selectFence(MachineInstr &I) const {
 }
 
 bool SPIRVInstructionSelector::selectOverflowArith(Register ResVReg,
-                                                   const SPIRVType *ResType,
+                                                   SPIRVTypeInst ResType,
                                                    MachineInstr &I,
                                                    unsigned Opcode) const {
   Type *ResTy = nullptr;
@@ -2002,10 +1999,10 @@ bool SPIRVInstructionSelector::selectOverflowArith(Register ResVReg,
   ResTy = StructType::get(ResElemTy, ResElemTy);
   // Build SPIR-V types and constant(s) if needed.
   MachineIRBuilder MIRBuilder(I);
-  SPIRVType *StructType = GR.getOrCreateSPIRVType(
+  SPIRVTypeInst StructType = GR.getOrCreateSPIRVType(
       ResTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, false);
   assert(I.getNumDefs() > 1 && "Not enought operands");
-  SPIRVType *BoolType = GR.getOrCreateSPIRVBoolType(I, TII);
+  SPIRVTypeInst BoolType = GR.getOrCreateSPIRVBoolType(I, TII);
   unsigned N = GR.getScalarOrVectorComponentCount(ResType);
   if (N > 1)
     BoolType = GR.getOrCreateSPIRVVectorType(BoolType, N, I, TII);
@@ -2050,7 +2047,7 @@ bool SPIRVInstructionSelector::selectOverflowArith(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectAtomicCmpXchg(Register ResVReg,
-                                                   const SPIRVType *ResType,
+                                                   SPIRVTypeInst ResType,
                                                    MachineInstr &I) const {
   Register ScopeReg;
   Register MemSemEqReg;
@@ -2083,7 +2080,7 @@ bool SPIRVInstructionSelector::selectAtomicCmpXchg(Register ResVReg,
 
   Register Cmp = I.getOperand(3).getReg();
   Register Val = I.getOperand(4).getReg();
-  SPIRVType *SpvValTy = GR.getSPIRVTypeForVReg(Val);
+  SPIRVTypeInst SpvValTy = GR.getSPIRVTypeForVReg(Val);
   Register ACmpRes = createVirtualRegister(SpvValTy, &GR, MRI, *I.getMF());
   const DebugLoc &DL = I.getDebugLoc();
   BuildMI(*I.getParent(), I, DL, TII.get(SPIRV::OpAtomicCompareExchange))
@@ -2096,7 +2093,7 @@ bool SPIRVInstructionSelector::selectAtomicCmpXchg(Register ResVReg,
       .addUse(Val)
       .addUse(Cmp)
       .constrainAllUses(TII, TRI, RBI);
-  SPIRVType *BoolTy = GR.getOrCreateSPIRVBoolType(I, TII);
+  SPIRVTypeInst BoolTy = GR.getOrCreateSPIRVBoolType(I, TII);
   Register CmpSuccReg = createVirtualRegister(BoolTy, &GR, MRI, *I.getMF());
   BuildMI(*I.getParent(), I, DL, TII.get(SPIRV::OpIEqual))
       .addDef(CmpSuccReg)
@@ -2167,8 +2164,8 @@ SPIRVInstructionSelector::buildSpecConstantOp(MachineInstr &I, Register Dest,
 
 MachineInstrBuilder
 SPIRVInstructionSelector::buildConstGenericPtr(MachineInstr &I, Register SrcPtr,
-                                               SPIRVType *SrcPtrTy) const {
-  SPIRVType *GenericPtrTy =
+                                               SPIRVTypeInst SrcPtrTy) const {
+  SPIRVTypeInst GenericPtrTy =
       GR.changePointerStorageClass(SrcPtrTy, SPIRV::StorageClass::Generic, I);
   Register Tmp = MRI->createVirtualRegister(&SPIRV::pIDRegClass);
   MRI->setType(Tmp, LLT::pointer(storageClassToAddressSpace(
@@ -2189,13 +2186,13 @@ SPIRVInstructionSelector::buildConstGenericPtr(MachineInstr &I, Register SrcPtr,
 // Workgroup to Function by going via a Generic pointer as an intermediary. All
 // other combinations can only be done by a bitcast, and are probably not safe.
 bool SPIRVInstructionSelector::selectAddrSpaceCast(Register ResVReg,
-                                                   const SPIRVType *ResType,
+                                                   SPIRVTypeInst ResType,
                                                    MachineInstr &I) const {
   MachineBasicBlock &BB = *I.getParent();
   const DebugLoc &DL = I.getDebugLoc();
 
   Register SrcPtr = I.getOperand(1).getReg();
-  SPIRVType *SrcPtrTy = GR.getSPIRVTypeForVReg(SrcPtr);
+  SPIRVTypeInst SrcPtrTy = GR.getSPIRVTypeForVReg(SrcPtr);
 
   // don't generate a cast for a null that may be represented by OpTypeInt
   if (SrcPtrTy->getOpcode() != SPIRV::OpTypePointer ||
@@ -2254,7 +2251,7 @@ bool SPIRVInstructionSelector::selectAddrSpaceCast(Register ResVReg,
     return selectUnOp(ResVReg, ResType, I, SPIRV::OpGenericCastToPtr);
   // Casting between 2 eligible pointers using Generic as an intermediary.
   if (isGenericCastablePtr(SrcSC) && isGenericCastablePtr(DstSC)) {
-    SPIRVType *GenericPtrTy =
+    SPIRVTypeInst GenericPtrTy =
         GR.changePointerStorageClass(SrcPtrTy, SPIRV::StorageClass::Generic, I);
     Register Tmp = createVirtualRegister(GenericPtrTy, &GR, MRI, MRI->getMF());
     BuildMI(BB, I, DL, TII.get(SPIRV::OpPtrCastToGeneric))
@@ -2404,14 +2401,14 @@ static APFloat getOneFP(const Type *LLVMFloatTy) {
 }
 
 bool SPIRVInstructionSelector::selectAnyOrAll(Register ResVReg,
-                                              const SPIRVType *ResType,
+                                              SPIRVTypeInst ResType,
                                               MachineInstr &I,
                                               unsigned OpAnyOrAll) const {
   assert(I.getNumOperands() == 3);
   assert(I.getOperand(2).isReg());
   MachineBasicBlock &BB = *I.getParent();
   Register InputRegister = I.getOperand(2).getReg();
-  SPIRVType *InputType = GR.getSPIRVTypeForVReg(InputRegister);
+  SPIRVTypeInst InputType = GR.getSPIRVTypeForVReg(InputRegister);
 
   if (!InputType)
     report_fatal_error("Input Type could not be determined.");
@@ -2426,8 +2423,8 @@ bool SPIRVInstructionSelector::selectAnyOrAll(Register ResVReg,
   bool IsFloatTy = GR.isScalarOrVectorOfType(InputRegister, SPIRV::OpTypeFloat);
   unsigned SpirvNotEqualId =
       IsFloatTy ? SPIRV::OpFOrdNotEqual : SPIRV::OpINotEqual;
-  SPIRVType *SpvBoolScalarTy = GR.getOrCreateSPIRVBoolType(I, TII);
-  SPIRVType *SpvBoolTy = SpvBoolScalarTy;
+  SPIRVTypeInst SpvBoolScalarTy = GR.getOrCreateSPIRVBoolType(I, TII);
+  SPIRVTypeInst SpvBoolTy = SpvBoolScalarTy;
   Register NotEqualReg = ResVReg;
 
   if (IsVectorTy) {
@@ -2460,33 +2457,33 @@ bool SPIRVInstructionSelector::selectAnyOrAll(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectAll(Register ResVReg,
-                                         const SPIRVType *ResType,
+                                         SPIRVTypeInst ResType,
                                          MachineInstr &I) const {
   return selectAnyOrAll(ResVReg, ResType, I, SPIRV::OpAll);
 }
 
 bool SPIRVInstructionSelector::selectAny(Register ResVReg,
-                                         const SPIRVType *ResType,
+                                         SPIRVTypeInst ResType,
                                          MachineInstr &I) const {
   return selectAnyOrAll(ResVReg, ResType, I, SPIRV::OpAny);
 }
 
 // Select the OpDot instruction for the given float dot
 bool SPIRVInstructionSelector::selectFloatDot(Register ResVReg,
-                                              const SPIRVType *ResType,
+                                              SPIRVTypeInst ResType,
                                               MachineInstr &I) const {
   assert(I.getNumOperands() == 4);
   assert(I.getOperand(2).isReg());
   assert(I.getOperand(3).isReg());
 
-  [[maybe_unused]] SPIRVType *VecType =
+  [[maybe_unused]] SPIRVTypeInst VecType =
       GR.getSPIRVTypeForVReg(I.getOperand(2).getReg());
 
   assert(VecType->getOpcode() == SPIRV::OpTypeVector &&
          GR.getScalarOrVectorComponentCount(VecType) > 1 &&
          "dot product requires a vector of at least 2 components");
 
-  [[maybe_unused]] SPIRVType *EltType =
+  [[maybe_unused]] SPIRVTypeInst EltType =
       GR.getSPIRVTypeForVReg(VecType->getOperand(1).getReg());
 
   assert(EltType->getOpcode() == SPIRV::OpTypeFloat);
@@ -2502,7 +2499,7 @@ bool SPIRVInstructionSelector::selectFloatDot(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectIntegerDot(Register ResVReg,
-                                                const SPIRVType *ResType,
+                                                SPIRVTypeInst ResType,
                                                 MachineInstr &I,
                                                 bool Signed) const {
   assert(I.getNumOperands() == 4);
@@ -2523,7 +2520,7 @@ bool SPIRVInstructionSelector::selectIntegerDot(Register ResVReg,
 // Since pre-1.6 SPIRV has no integer dot implementation,
 // expand by piecewise multiplying and adding the results
 bool SPIRVInstructionSelector::selectIntegerDotExpansion(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
   assert(I.getNumOperands() == 4);
   assert(I.getOperand(2).isReg());
   assert(I.getOperand(3).isReg());
@@ -2533,7 +2530,7 @@ bool SPIRVInstructionSelector::selectIntegerDotExpansion(
   Register Vec0 = I.getOperand(2).getReg();
   Register Vec1 = I.getOperand(3).getReg();
   Register TmpVec = MRI->createVirtualRegister(GR.getRegClass(ResType));
-  SPIRVType *VecType = GR.getSPIRVTypeForVReg(Vec0);
+  SPIRVTypeInst VecType = GR.getSPIRVTypeForVReg(Vec0);
 
   BuildMI(BB, I, I.getDebugLoc(), TII.get(SPIRV::OpIMulV))
       .addDef(TmpVec)
@@ -2581,7 +2578,7 @@ bool SPIRVInstructionSelector::selectIntegerDotExpansion(
 }
 
 bool SPIRVInstructionSelector::selectOpIsInf(Register ResVReg,
-                                             const SPIRVType *ResType,
+                                             SPIRVTypeInst ResType,
                                              MachineInstr &I) const {
   MachineBasicBlock &BB = *I.getParent();
   BuildMI(BB, I, I.getDebugLoc(), TII.get(SPIRV::OpIsInf))
@@ -2593,7 +2590,7 @@ bool SPIRVInstructionSelector::selectOpIsInf(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectOpIsNan(Register ResVReg,
-                                             const SPIRVType *ResType,
+                                             SPIRVTypeInst ResType,
                                              MachineInstr &I) const {
   MachineBasicBlock &BB = *I.getParent();
   BuildMI(BB, I, I.getDebugLoc(), TII.get(SPIRV::OpIsNan))
@@ -2606,7 +2603,7 @@ bool SPIRVInstructionSelector::selectOpIsNan(Register ResVReg,
 
 template <bool Signed>
 bool SPIRVInstructionSelector::selectDot4AddPacked(Register ResVReg,
-                                                   const SPIRVType *ResType,
+                                                   SPIRVTypeInst ResType,
                                                    MachineInstr &I) const {
   assert(I.getNumOperands() == 5);
   assert(I.getOperand(2).isReg());
@@ -2642,7 +2639,7 @@ bool SPIRVInstructionSelector::selectDot4AddPacked(Register ResVReg,
 // to the accumulator.
 template <bool Signed>
 bool SPIRVInstructionSelector::selectDot4AddPackedExpansion(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
   assert(I.getNumOperands() == 5);
   assert(I.getOperand(2).isReg());
   assert(I.getOperand(3).isReg());
@@ -2653,7 +2650,7 @@ bool SPIRVInstructionSelector::selectDot4AddPackedExpansion(
   Register X = I.getOperand(3).getReg();
   Register Y = I.getOperand(4).getReg();
 
-  SPIRVType *EltType = GR.getOrCreateSPIRVIntegerType(8, I, TII);
+  SPIRVTypeInst EltType = GR.getOrCreateSPIRVIntegerType(8, I, TII);
   auto ExtractOp =
       Signed ? SPIRV::OpBitFieldSExtract : SPIRV::OpBitFieldUExtract;
 
@@ -2718,7 +2715,7 @@ bool SPIRVInstructionSelector::selectDot4AddPackedExpansion(
 /// Transform saturate(x) to clamp(x, 0.0f, 1.0f) as SPIRV
 /// does not have a saturate builtin.
 bool SPIRVInstructionSelector::selectSaturate(Register ResVReg,
-                                              const SPIRVType *ResType,
+                                              SPIRVTypeInst ResType,
                                               MachineInstr &I) const {
   assert(I.getNumOperands() == 3);
   assert(I.getOperand(2).isReg());
@@ -2739,13 +2736,13 @@ bool SPIRVInstructionSelector::selectSaturate(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectSign(Register ResVReg,
-                                          const SPIRVType *ResType,
+                                          SPIRVTypeInst ResType,
                                           MachineInstr &I) const {
   assert(I.getNumOperands() == 3);
   assert(I.getOperand(2).isReg());
   MachineBasicBlock &BB = *I.getParent();
   Register InputRegister = I.getOperand(2).getReg();
-  SPIRVType *InputType = GR.getSPIRVTypeForVReg(InputRegister);
+  SPIRVTypeInst InputType = GR.getSPIRVTypeForVReg(InputRegister);
   auto &DL = I.getDebugLoc();
 
   if (!InputType)
@@ -2784,11 +2781,11 @@ bool SPIRVInstructionSelector::selectSign(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectWaveOpInst(Register ResVReg,
-                                                const SPIRVType *ResType,
+                                                SPIRVTypeInst ResType,
                                                 MachineInstr &I,
                                                 unsigned Opcode) const {
   MachineBasicBlock &BB = *I.getParent();
-  SPIRVType *IntTy = GR.getOrCreateSPIRVIntegerType(32, I, TII);
+  SPIRVTypeInst IntTy = GR.getOrCreateSPIRVIntegerType(32, I, TII);
 
   auto BMI = BuildMI(BB, I, I.getDebugLoc(), TII.get(Opcode))
                  .addDef(ResVReg)
@@ -2805,10 +2802,10 @@ bool SPIRVInstructionSelector::selectWaveOpInst(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectWaveActiveCountBits(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
 
-  SPIRVType *IntTy = GR.getOrCreateSPIRVIntegerType(32, I, TII);
-  SPIRVType *BallotType = GR.getOrCreateSPIRVVectorType(IntTy, 4, I, TII);
+  SPIRVTypeInst IntTy = GR.getOrCreateSPIRVIntegerType(32, I, TII);
+  SPIRVTypeInst BallotType = GR.getOrCreateSPIRVVectorType(IntTy, 4, I, TII);
   Register BallotReg = MRI->createVirtualRegister(GR.getRegClass(BallotType));
   if (!selectWaveOpInst(BallotReg, BallotType, I,
                         SPIRV::OpGroupNonUniformBallot))
@@ -2828,8 +2825,9 @@ bool SPIRVInstructionSelector::selectWaveActiveCountBits(
   return true;
 }
 
-bool SPIRVInstructionSelector::selectWavePrefixBitCount(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+bool SPIRVInstructionSelector::selectWavePrefixBitCount(Register ResVReg,
+                                                        SPIRVTypeInst ResType,
+                                                        MachineInstr &I) const {
 
   assert(I.getNumOperands() == 3);
 
@@ -2840,7 +2838,7 @@ bool SPIRVInstructionSelector::selectWavePrefixBitCount(
   DebugLoc DL = I.getDebugLoc();
 
   Register InputRegister = Op.getReg();
-  SPIRVType *InputType = GR.getSPIRVTypeForVReg(InputRegister);
+  SPIRVTypeInst InputType = GR.getSPIRVTypeForVReg(InputRegister);
 
   if (!InputType)
     report_fatal_error("Input Type could not be determined.");
@@ -2849,11 +2847,11 @@ bool SPIRVInstructionSelector::selectWavePrefixBitCount(
     report_fatal_error("WavePrefixBitCount requires boolean input");
 
   // Types
-  SPIRVType *Int32Ty = GR.getOrCreateSPIRVIntegerType(32, I, TII);
+  SPIRVTypeInst Int32Ty = GR.getOrCreateSPIRVIntegerType(32, I, TII);
 
   // Ballot result type: vector<uint32>
   // Match DXC: %v4uint for Subgroup size
-  SPIRVType *BallotTy = GR.getOrCreateSPIRVVectorType(Int32Ty, 4, I, TII);
+  SPIRVTypeInst BallotTy = GR.getOrCreateSPIRVVectorType(Int32Ty, 4, I, TII);
 
   // Create a vreg for the ballot result
   Register BallotVReg = MRI->createVirtualRegister(&SPIRV::IDRegClass);
@@ -2879,7 +2877,7 @@ bool SPIRVInstructionSelector::selectWavePrefixBitCount(
 }
 
 bool SPIRVInstructionSelector::selectWaveReduceMax(Register ResVReg,
-                                                   const SPIRVType *ResType,
+                                                   SPIRVTypeInst ResType,
                                                    MachineInstr &I,
                                                    bool IsUnsigned) const {
   return selectWaveReduce(
@@ -2894,7 +2892,7 @@ bool SPIRVInstructionSelector::selectWaveReduceMax(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectWaveReduceMin(Register ResVReg,
-                                                   const SPIRVType *ResType,
+                                                   SPIRVTypeInst ResType,
                                                    MachineInstr &I,
                                                    bool IsUnsigned) const {
   return selectWaveReduce(
@@ -2909,7 +2907,7 @@ bool SPIRVInstructionSelector::selectWaveReduceMin(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectWaveReduceSum(Register ResVReg,
-                                                   const SPIRVType *ResType,
+                                                   SPIRVTypeInst ResType,
                                                    MachineInstr &I) const {
   return selectWaveReduce(ResVReg, ResType, I, /*IsUnsigned*/ false,
                           [&](Register InputRegister, bool IsUnsigned) {
@@ -2922,18 +2920,18 @@ bool SPIRVInstructionSelector::selectWaveReduceSum(Register ResVReg,
 
 template <typename PickOpcodeFn>
 bool SPIRVInstructionSelector::selectWaveReduce(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
-    bool IsUnsigned, PickOpcodeFn &&PickOpcode) const {
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I, bool IsUnsigned,
+    PickOpcodeFn &&PickOpcode) const {
   assert(I.getNumOperands() == 3);
   assert(I.getOperand(2).isReg());
   MachineBasicBlock &BB = *I.getParent();
   Register InputRegister = I.getOperand(2).getReg();
-  SPIRVType *InputType = GR.getSPIRVTypeForVReg(InputRegister);
+  SPIRVTypeInst InputType = GR.getSPIRVTypeForVReg(InputRegister);
 
   if (!InputType)
     report_fatal_error("Input Type could not be determined.");
 
-  SPIRVType *IntTy = GR.getOrCreateSPIRVIntegerType(32, I, TII);
+  SPIRVTypeInst IntTy = GR.getOrCreateSPIRVIntegerType(32, I, TII);
   const unsigned Opcode = PickOpcode(InputRegister, IsUnsigned);
   BuildMI(BB, I, I.getDebugLoc(), TII.get(Opcode))
       .addDef(ResVReg)
@@ -2947,7 +2945,7 @@ bool SPIRVInstructionSelector::selectWaveReduce(
 }
 
 bool SPIRVInstructionSelector::selectWaveExclusiveScanSum(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
   return selectWaveExclusiveScan(ResVReg, ResType, I, /*IsUnsigned*/ false,
                                  [&](Register InputRegister, bool IsUnsigned) {
                                    bool IsFloatTy = GR.isScalarOrVectorOfType(
@@ -2960,18 +2958,18 @@ bool SPIRVInstructionSelector::selectWaveExclusiveScanSum(
 
 template <typename PickOpcodeFn>
 bool SPIRVInstructionSelector::selectWaveExclusiveScan(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
-    bool IsUnsigned, PickOpcodeFn &&PickOpcode) const {
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I, bool IsUnsigned,
+    PickOpcodeFn &&PickOpcode) const {
   assert(I.getNumOperands() == 3);
   assert(I.getOperand(2).isReg());
   MachineBasicBlock &BB = *I.getParent();
   Register InputRegister = I.getOperand(2).getReg();
-  SPIRVType *InputType = GR.getSPIRVTypeForVReg(InputRegister);
+  SPIRVTypeInst InputType = GR.getSPIRVTypeForVReg(InputRegister);
 
   if (!InputType)
     report_fatal_error("Input Type could not be determined.");
 
-  SPIRVType *IntTy = GR.getOrCreateSPIRVIntegerType(32, I, TII);
+  SPIRVTypeInst IntTy = GR.getOrCreateSPIRVIntegerType(32, I, TII);
   const unsigned Opcode = PickOpcode(InputRegister, IsUnsigned);
   BuildMI(BB, I, I.getDebugLoc(), TII.get(Opcode))
       .addDef(ResVReg)
@@ -2985,7 +2983,7 @@ bool SPIRVInstructionSelector::selectWaveExclusiveScan(
 }
 
 bool SPIRVInstructionSelector::selectBitreverse(Register ResVReg,
-                                                const SPIRVType *ResType,
+                                                SPIRVTypeInst ResType,
                                                 MachineInstr &I) const {
   MachineBasicBlock &BB = *I.getParent();
   BuildMI(BB, I, I.getDebugLoc(), TII.get(SPIRV::OpBitReverse))
@@ -2997,7 +2995,7 @@ bool SPIRVInstructionSelector::selectBitreverse(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectFreeze(Register ResVReg,
-                                            const SPIRVType *ResType,
+                                            SPIRVTypeInst ResType,
                                             MachineInstr &I) const {
   // There is no way to implement `freeze` correctly without support on SPIR-V
   // standard side, but we may at least address a simple (static) case when
@@ -3040,7 +3038,7 @@ bool SPIRVInstructionSelector::selectFreeze(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectBuildVector(Register ResVReg,
-                                                 const SPIRVType *ResType,
+                                                 SPIRVTypeInst ResType,
                                                  MachineInstr &I) const {
   unsigned N = 0;
   if (ResType->getOpcode() == SPIRV::OpTypeVector)
@@ -3076,7 +3074,7 @@ bool SPIRVInstructionSelector::selectBuildVector(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectSplatVector(Register ResVReg,
-                                                 const SPIRVType *ResType,
+                                                 SPIRVTypeInst ResType,
                                                  MachineInstr &I) const {
   unsigned N = 0;
   if (ResType->getOpcode() == SPIRV::OpTypeVector)
@@ -3111,7 +3109,7 @@ bool SPIRVInstructionSelector::selectSplatVector(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectDiscard(Register ResVReg,
-                                             const SPIRVType *ResType,
+                                             SPIRVTypeInst ResType,
                                              MachineInstr &I) const {
 
   unsigned Opcode;
@@ -3136,8 +3134,7 @@ bool SPIRVInstructionSelector::selectDiscard(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectCmp(Register ResVReg,
-                                         const SPIRVType *ResType,
-                                         unsigned CmpOpc,
+                                         SPIRVTypeInst ResType, unsigned CmpOpc,
                                          MachineInstr &I) const {
   Register Cmp0 = I.getOperand(2).getReg();
   Register Cmp1 = I.getOperand(3).getReg();
@@ -3155,7 +3152,7 @@ bool SPIRVInstructionSelector::selectCmp(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectICmp(Register ResVReg,
-                                          const SPIRVType *ResType,
+                                          SPIRVTypeInst ResType,
                                           MachineInstr &I) const {
   auto Pred = I.getOperand(1).getPredicate();
   unsigned CmpOpc;
@@ -3172,9 +3169,9 @@ bool SPIRVInstructionSelector::selectICmp(Register ResVReg,
 
 Register
 SPIRVInstructionSelector::buildI32Constant(uint32_t Val, MachineInstr &I,
-                                           const SPIRVType *ResType) const {
+                                           SPIRVTypeInst ResType) const {
   Type *LLVMTy = IntegerType::get(GR.CurMF->getFunction().getContext(), 32);
-  const SPIRVType *SpvI32Ty =
+  SPIRVTypeInst SpvI32Ty =
       ResType ? ResType : GR.getOrCreateSPIRVIntegerType(32, I, TII);
   // Find a constant in DT or build a new one.
   auto ConstInt = ConstantInt::get(LLVMTy, Val);
@@ -3198,13 +3195,13 @@ SPIRVInstructionSelector::buildI32Constant(uint32_t Val, MachineInstr &I,
 }
 
 bool SPIRVInstructionSelector::selectFCmp(Register ResVReg,
-                                          const SPIRVType *ResType,
+                                          SPIRVTypeInst ResType,
                                           MachineInstr &I) const {
   unsigned CmpOp = getFCmpOpcode(I.getOperand(1).getPredicate());
   return selectCmp(ResVReg, ResType, CmpOp, I);
 }
 
-Register SPIRVInstructionSelector::buildZerosVal(const SPIRVType *ResType,
+Register SPIRVInstructionSelector::buildZerosVal(SPIRVTypeInst ResType,
                                                  MachineInstr &I) const {
   // OpenCL uses nulls for Zero. In HLSL we don't use null constants.
   bool ZeroAsNull = !STI.isShader();
@@ -3215,10 +3212,10 @@ Register SPIRVInstructionSelector::buildZerosVal(const SPIRVType *ResType,
 
 bool SPIRVInstructionSelector::isScalarOrVectorIntConstantZero(
     Register Reg) const {
-  SPIRVType *Type = GR.getSPIRVTypeForVReg(Reg);
+  SPIRVTypeInst Type = GR.getSPIRVTypeForVReg(Reg);
   if (!Type)
     return false;
-  SPIRVType *CompType = GR.getScalarOrVectorComponentType(Type);
+  SPIRVTypeInst CompType = GR.getScalarOrVectorComponentType(Type);
   if (!CompType || CompType->getOpcode() != SPIRV::OpTypeInt)
     return false;
 
@@ -3259,7 +3256,7 @@ bool SPIRVInstructionSelector::isScalarOrVectorIntConstantZero(
   return false;
 }
 
-Register SPIRVInstructionSelector::buildZerosValF(const SPIRVType *ResType,
+Register SPIRVInstructionSelector::buildZerosValF(SPIRVTypeInst ResType,
                                                   MachineInstr &I) const {
   // OpenCL uses nulls for Zero. In HLSL we don't use null constants.
   bool ZeroAsNull = !STI.isShader();
@@ -3269,7 +3266,7 @@ Register SPIRVInstructionSelector::buildZerosValF(const SPIRVType *ResType,
   return GR.getOrCreateConstFP(VZero, I, ResType, TII, ZeroAsNull);
 }
 
-Register SPIRVInstructionSelector::buildOnesValF(const SPIRVType *ResType,
+Register SPIRVInstructionSelector::buildOnesValF(SPIRVTypeInst ResType,
                                                  MachineInstr &I) const {
   // OpenCL uses nulls for Zero. In HLSL we don't use null constants.
   bool ZeroAsNull = !STI.isShader();
@@ -3280,7 +3277,7 @@ Register SPIRVInstructionSelector::buildOnesValF(const SPIRVType *ResType,
 }
 
 Register SPIRVInstructionSelector::buildOnesVal(bool AllOnes,
-                                                const SPIRVType *ResType,
+                                                SPIRVTypeInst ResType,
                                                 MachineInstr &I) const {
   unsigned BitWidth = GR.getScalarOrVectorBitWidth(ResType);
   APInt One =
@@ -3291,7 +3288,7 @@ Register SPIRVInstructionSelector::buildOnesVal(bool AllOnes,
 }
 
 bool SPIRVInstructionSelector::selectSelect(Register ResVReg,
-                                            const SPIRVType *ResType,
+                                            SPIRVTypeInst ResType,
                                             MachineInstr &I) const {
   Register SelectFirstArg = I.getOperand(2).getReg();
   Register SelectSecondArg = I.getOperand(3).getReg();
@@ -3336,7 +3333,7 @@ bool SPIRVInstructionSelector::selectSelect(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectSelectDefaultArgs(Register ResVReg,
-                                                       const SPIRVType *ResType,
+                                                       SPIRVTypeInst ResType,
                                                        MachineInstr &I,
                                                        bool IsSigned) const {
   // To extend a bool, we need to use OpSelect between constants.
@@ -3357,7 +3354,7 @@ bool SPIRVInstructionSelector::selectSelectDefaultArgs(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectIToF(Register ResVReg,
-                                          const SPIRVType *ResType,
+                                          SPIRVTypeInst ResType,
                                           MachineInstr &I, bool IsSigned,
                                           unsigned Opcode) const {
   Register SrcReg = I.getOperand(1).getReg();
@@ -3365,7 +3362,7 @@ bool SPIRVInstructionSelector::selectIToF(Register ResVReg,
   // however the translator generates OpSelect+OpConvert*ToF, so we do the same.
   if (GR.isScalarOrVectorOfType(I.getOperand(1).getReg(), SPIRV::OpTypeBool)) {
     unsigned BitWidth = GR.getScalarOrVectorBitWidth(ResType);
-    SPIRVType *TmpType = GR.getOrCreateSPIRVIntegerType(BitWidth, I, TII);
+    SPIRVTypeInst TmpType = GR.getOrCreateSPIRVIntegerType(BitWidth, I, TII);
     if (ResType->getOpcode() == SPIRV::OpTypeVector) {
       const unsigned NumElts = ResType->getOperand(2).getImm();
       TmpType = GR.getOrCreateSPIRVVectorType(TmpType, NumElts, I, TII);
@@ -3377,14 +3374,14 @@ bool SPIRVInstructionSelector::selectIToF(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectExt(Register ResVReg,
-                                         const SPIRVType *ResType,
-                                         MachineInstr &I, bool IsSigned) const {
+                                         SPIRVTypeInst ResType, MachineInstr &I,
+                                         bool IsSigned) const {
   Register SrcReg = I.getOperand(1).getReg();
   if (GR.isScalarOrVectorOfType(SrcReg, SPIRV::OpTypeBool))
     return selectSelectDefaultArgs(ResVReg, ResType, I, IsSigned);
 
-  SPIRVType *SrcType = GR.getSPIRVTypeForVReg(SrcReg);
-  if (SrcType == ResType)
+  SPIRVTypeInst SrcType = GR.getSPIRVTypeForVReg(SrcReg);
+  if (ResType == SrcType)
     return BuildCOPY(ResVReg, SrcReg, I);
 
   unsigned Opcode = IsSigned ? SPIRV::OpSConvert : SPIRV::OpUConvert;
@@ -3392,14 +3389,14 @@ bool SPIRVInstructionSelector::selectExt(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectSUCmp(Register ResVReg,
-                                           const SPIRVType *ResType,
+                                           SPIRVTypeInst ResType,
                                            MachineInstr &I,
                                            bool IsSigned) const {
   MachineIRBuilder MIRBuilder(I);
   MachineRegisterInfo *MRI = MIRBuilder.getMRI();
   MachineBasicBlock &BB = *I.getParent();
   // Ensure we have bool.
-  SPIRVType *BoolType = GR.getOrCreateSPIRVBoolType(I, TII);
+  SPIRVTypeInst BoolType = GR.getOrCreateSPIRVBoolType(I, TII);
   unsigned N = GR.getScalarOrVectorComponentCount(ResType);
   if (N > 1)
     BoolType = GR.getOrCreateSPIRVVectorType(BoolType, N, I, TII);
@@ -3455,8 +3452,8 @@ bool SPIRVInstructionSelector::selectSUCmp(Register ResVReg,
 bool SPIRVInstructionSelector::selectIntToBool(Register IntReg,
                                                Register ResVReg,
                                                MachineInstr &I,
-                                               const SPIRVType *IntTy,
-                                               const SPIRVType *BoolTy) const {
+                                               SPIRVTypeInst IntTy,
+                                               SPIRVTypeInst BoolTy) const {
   // To truncate to a bool, we use OpBitwiseAnd 1 and OpINotEqual to zero.
   Register BitIntReg = createVirtualRegister(IntTy, &GR, MRI, MRI->getMF());
   bool IsVectorTy = IntTy->getOpcode() == SPIRV::OpTypeVector;
@@ -3480,10 +3477,10 @@ bool SPIRVInstructionSelector::selectIntToBool(Register IntReg,
 }
 
 bool SPIRVInstructionSelector::selectTrunc(Register ResVReg,
-                                           const SPIRVType *ResType,
+                                           SPIRVTypeInst ResType,
                                            MachineInstr &I) const {
   Register IntReg = I.getOperand(1).getReg();
-  const SPIRVType *ArgType = GR.getSPIRVTypeForVReg(IntReg);
+  const SPIRVTypeInst ArgType = GR.getSPIRVTypeForVReg(IntReg);
   if (GR.isScalarOrVectorOfType(ResVReg, SPIRV::OpTypeBool))
     return selectIntToBool(IntReg, ResVReg, I, ArgType, ResType);
   if (ArgType == ResType)
@@ -3494,7 +3491,7 @@ bool SPIRVInstructionSelector::selectTrunc(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectConst(Register ResVReg,
-                                           const SPIRVType *ResType,
+                                           SPIRVTypeInst ResType,
                                            MachineInstr &I) const {
   unsigned Opcode = I.getOpcode();
   unsigned TpOpcode = ResType->getOpcode();
@@ -3516,7 +3513,7 @@ bool SPIRVInstructionSelector::selectConst(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectOpUndef(Register ResVReg,
-                                             const SPIRVType *ResType,
+                                             SPIRVTypeInst ResType,
                                              MachineInstr &I) const {
   BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpUndef))
       .addDef(ResVReg)
@@ -3526,7 +3523,7 @@ bool SPIRVInstructionSelector::selectOpUndef(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectInsertVal(Register ResVReg,
-                                               const SPIRVType *ResType,
+                                               SPIRVTypeInst ResType,
                                                MachineInstr &I) const {
   MachineBasicBlock &BB = *I.getParent();
   auto MIB = BuildMI(BB, I, I.getDebugLoc(), TII.get(SPIRV::OpCompositeInsert))
@@ -3543,7 +3540,7 @@ bool SPIRVInstructionSelector::selectInsertVal(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectExtractVal(Register ResVReg,
-                                                const SPIRVType *ResType,
+                                                SPIRVTypeInst ResType,
                                                 MachineInstr &I) const {
   Type *MaybeResTy = nullptr;
   StringRef ResName;
@@ -3567,7 +3564,7 @@ bool SPIRVInstructionSelector::selectExtractVal(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectInsertElt(Register ResVReg,
-                                               const SPIRVType *ResType,
+                                               SPIRVTypeInst ResType,
                                                MachineInstr &I) const {
   if (getImm(I.getOperand(4), MRI))
     return selectInsertVal(ResVReg, ResType, I);
@@ -3583,7 +3580,7 @@ bool SPIRVInstructionSelector::selectInsertElt(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectExtractElt(Register ResVReg,
-                                                const SPIRVType *ResType,
+                                                SPIRVTypeInst ResType,
                                                 MachineInstr &I) const {
   if (getImm(I.getOperand(3), MRI))
     return selectExtractVal(ResVReg, ResType, I);
@@ -3598,7 +3595,7 @@ bool SPIRVInstructionSelector::selectExtractElt(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectGEP(Register ResVReg,
-                                         const SPIRVType *ResType,
+                                         SPIRVTypeInst ResType,
                                          MachineInstr &I) const {
   const bool IsGEPInBounds = I.getOperand(2).getImm();
 
@@ -3640,7 +3637,7 @@ bool SPIRVInstructionSelector::wrapIntoSpecConstantOp(
   for (unsigned i = I.getNumExplicitDefs() + 1; i < Lim; ++i) {
     Register OpReg = I.getOperand(i).getReg();
     MachineInstr *OpDefine = MRI->getVRegDef(OpReg);
-    SPIRVType *OpType = GR.getSPIRVTypeForVReg(OpReg);
+    SPIRVTypeInst OpType = GR.getSPIRVTypeForVReg(OpReg);
     SmallPtrSet<SPIRVType *, 4> Visited;
     if (!OpDefine || !OpType || isConstReg(MRI, OpDefine, Visited) ||
         OpDefine->getOpcode() == TargetOpcode::G_ADDRSPACE_CAST ||
@@ -3676,7 +3673,7 @@ bool SPIRVInstructionSelector::wrapIntoSpecConstantOp(
 }
 
 bool SPIRVInstructionSelector::selectDerivativeInst(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
     const unsigned DPdOpCode) const {
   // TODO: This should check specifically for Fragment Execution Model, but STI
   // doesn't provide that information yet. See #167562
@@ -3686,7 +3683,7 @@ bool SPIRVInstructionSelector::selectDerivativeInst(
   // conversions to float
   // This case occurs because a half arg/result is legal in HLSL but not spirv.
   Register SrcReg = I.getOperand(2).getReg();
-  SPIRVType *SrcType = GR.getSPIRVTypeForVReg(SrcReg);
+  SPIRVTypeInst SrcType = GR.getSPIRVTypeForVReg(SrcReg);
   unsigned BitWidth = std::min(GR.getScalarOrVectorBitWidth(SrcType),
                                GR.getScalarOrVectorBitWidth(ResType));
   if (BitWidth == 32)
@@ -3697,7 +3694,7 @@ bool SPIRVInstructionSelector::selectDerivativeInst(
 
   MachineIRBuilder MIRBuilder(I);
   unsigned componentCount = GR.getScalarOrVectorComponentCount(SrcType);
-  SPIRVType *F32ConvertTy = GR.getOrCreateSPIRVFloatType(32, I, TII);
+  SPIRVTypeInst F32ConvertTy = GR.getOrCreateSPIRVFloatType(32, I, TII);
   if (componentCount != 1)
     F32ConvertTy = GR.getOrCreateSPIRVVectorType(F32ConvertTy, componentCount,
                                                  MIRBuilder, false);
@@ -3725,7 +3722,7 @@ bool SPIRVInstructionSelector::selectDerivativeInst(
 }
 
 bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
-                                               const SPIRVType *ResType,
+                                               SPIRVTypeInst ResType,
                                                MachineInstr &I) const {
   MachineBasicBlock &BB = *I.getParent();
   Intrinsic::ID IID = cast<GIntrinsic>(I).getIntrinsicID();
@@ -3746,7 +3743,7 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
     return selectGEP(ResVReg, ResType, I);
   case Intrinsic::spv_bitcast: {
     Register OpReg = I.getOperand(2).getReg();
-    SPIRVType *OpType =
+    SPIRVTypeInst OpType =
         OpReg.isValid() ? GR.getSPIRVTypeForVReg(OpReg) : nullptr;
     if (!GR.isBitcastCompatible(ResType, OpType))
       report_fatal_error("incompatible result and operand types in a bitcast");
@@ -4182,7 +4179,7 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectHandleFromBinding(Register &ResVReg,
-                                                       const SPIRVType *ResType,
+                                                       SPIRVTypeInst ResType,
                                                        MachineInstr &I) const {
   // The images need to be loaded in the same basic block as their use. We defer
   // loading the image to the intrinsic that uses it.
@@ -4194,7 +4191,7 @@ bool SPIRVInstructionSelector::selectHandleFromBinding(Register &ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectCounterHandleFromBinding(
-    Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register &ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
   auto &Intr = cast<GIntrinsic>(I);
   assert(Intr.getIntrinsicID() ==
          Intrinsic::spv_resource_counterhandlefrombinding);
@@ -4215,15 +4212,16 @@ bool SPIRVInstructionSelector::selectCounterHandleFromBinding(
 
   // Create the counter variable.
   MachineIRBuilder MIRBuilder(I);
-  Register CounterVarReg = buildPointerToResource(
-      GR.getPointeeType(ResType), GR.getPointerStorageClass(ResType), Set,
-      Binding, ArraySize, IndexReg, CounterName, MIRBuilder);
+  Register CounterVarReg =
+      buildPointerToResource(SPIRVTypeInst(GR.getPointeeType(ResType)),
+                             GR.getPointerStorageClass(ResType), Set, Binding,
+                             ArraySize, IndexReg, CounterName, MIRBuilder);
 
   return BuildCOPY(ResVReg, CounterVarReg, I);
 }
 
 bool SPIRVInstructionSelector::selectUpdateCounter(Register &ResVReg,
-                                                   const SPIRVType *ResType,
+                                                   SPIRVTypeInst ResType,
                                                    MachineInstr &I) const {
   auto &Intr = cast<GIntrinsic>(I);
   assert(Intr.getIntrinsicID() == Intrinsic::spv_resource_updatecounter);
@@ -4235,8 +4233,8 @@ bool SPIRVInstructionSelector::selectUpdateCounter(Register &ResVReg,
   // containing an i32). We need to get a pointer to that i32 member to do the
   // atomic operation.
 #ifndef NDEBUG
-  SPIRVType *CounterVarType = GR.getSPIRVTypeForVReg(CounterHandleReg);
-  SPIRVType *CounterVarPointeeType = GR.getPointeeType(CounterVarType);
+  SPIRVTypeInst CounterVarType = GR.getSPIRVTypeForVReg(CounterHandleReg);
+  SPIRVTypeInst CounterVarPointeeType = GR.getPointeeType(CounterVarType);
   assert(CounterVarPointeeType &&
          CounterVarPointeeType->getOpcode() == SPIRV::OpTypeStruct &&
          "Counter variable must be a struct");
@@ -4245,7 +4243,7 @@ bool SPIRVInstructionSelector::selectUpdateCounter(Register &ResVReg,
          "Counter variable must be in the storage buffer storage class");
   assert(CounterVarPointeeType->getNumOperands() == 2 &&
          "Counter variable must have exactly 1 member in the struct");
-  const SPIRVType *MemberType =
+  const SPIRVTypeInst MemberType =
       GR.getSPIRVTypeForVReg(CounterVarPointeeType->getOperand(1).getReg());
   assert(MemberType->getOpcode() == SPIRV::OpTypeInt &&
          "Counter variable struct must have a single i32 member");
@@ -4256,7 +4254,7 @@ bool SPIRVInstructionSelector::selectUpdateCounter(Register &ResVReg,
   const Type *LLVMIntType =
       Type::getInt32Ty(I.getMF()->getFunction().getContext());
 
-  SPIRVType *IntPtrType = GR.getOrCreateSPIRVPointerType(
+  SPIRVTypeInst IntPtrType = GR.getOrCreateSPIRVPointerType(
       LLVMIntType, MIRBuilder, SPIRV::StorageClass::StorageBuffer);
 
   Register Zero = buildI32Constant(0, I);
@@ -4304,8 +4302,9 @@ bool SPIRVInstructionSelector::selectUpdateCounter(Register &ResVReg,
       .constrainAllUses(TII, TRI, RBI);
   return true;
 }
-bool SPIRVInstructionSelector::selectReadImageIntrinsic(
-    Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+bool SPIRVInstructionSelector::selectReadImageIntrinsic(Register &ResVReg,
+                                                        SPIRVTypeInst ResType,
+                                                        MachineInstr &I) const {
 
   // If the load of the image is in a different basic block, then
   // this will generate invalid code. A proper solution is to move
@@ -4330,7 +4329,7 @@ bool SPIRVInstructionSelector::selectReadImageIntrinsic(
 }
 
 bool SPIRVInstructionSelector::generateSampleImage(
-    Register ResVReg, const SPIRVType *ResType, Register ImageReg,
+    Register ResVReg, SPIRVTypeInst ResType, Register ImageReg,
     Register SamplerReg, Register CoordinateReg, const ImageOperands &ImOps,
     DebugLoc Loc, MachineInstr &Pos) const {
   auto *ImageDef = cast<GIntrinsic>(getVRegDef(*MRI, ImageReg));
@@ -4350,7 +4349,7 @@ bool SPIRVInstructionSelector::generateSampleImage(
   }
 
   MachineIRBuilder MIRBuilder(Pos);
-  SPIRVType *SampledImageType = GR.getOrCreateOpTypeSampledImage(
+  SPIRVTypeInst SampledImageType = GR.getOrCreateOpTypeSampledImage(
       GR.getSPIRVTypeForVReg(ImageReg), MIRBuilder);
   Register SampledImageReg =
       MRI->createVirtualRegister(GR.getRegClass(SampledImageType));
@@ -4419,7 +4418,7 @@ bool SPIRVInstructionSelector::generateSampleImage(
 }
 
 bool SPIRVInstructionSelector::selectSampleBasicIntrinsic(
-    Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register &ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
   Register ImageReg = I.getOperand(2).getReg();
   Register SamplerReg = I.getOperand(3).getReg();
   Register CoordinateReg = I.getOperand(4).getReg();
@@ -4433,7 +4432,7 @@ bool SPIRVInstructionSelector::selectSampleBasicIntrinsic(
 }
 
 bool SPIRVInstructionSelector::selectSampleBiasIntrinsic(
-    Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register &ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
   Register ImageReg = I.getOperand(2).getReg();
   Register SamplerReg = I.getOperand(3).getReg();
   Register CoordinateReg = I.getOperand(4).getReg();
@@ -4448,7 +4447,7 @@ bool SPIRVInstructionSelector::selectSampleBiasIntrinsic(
 }
 
 bool SPIRVInstructionSelector::selectSampleGradIntrinsic(
-    Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register &ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
   Register ImageReg = I.getOperand(2).getReg();
   Register SamplerReg = I.getOperand(3).getReg();
   Register CoordinateReg = I.getOperand(4).getReg();
@@ -4464,7 +4463,7 @@ bool SPIRVInstructionSelector::selectSampleGradIntrinsic(
 }
 
 bool SPIRVInstructionSelector::selectSampleLevelIntrinsic(
-    Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register &ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
   Register ImageReg = I.getOperand(2).getReg();
   Register SamplerReg = I.getOperand(3).getReg();
   Register CoordinateReg = I.getOperand(4).getReg();
@@ -4476,8 +4475,9 @@ bool SPIRVInstructionSelector::selectSampleLevelIntrinsic(
                              CoordinateReg, ImOps, I.getDebugLoc(), I);
 }
 
-bool SPIRVInstructionSelector::selectSampleCmpIntrinsic(
-    Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+bool SPIRVInstructionSelector::selectSampleCmpIntrinsic(Register &ResVReg,
+                                                        SPIRVTypeInst ResType,
+                                                        MachineInstr &I) const {
   Register ImageReg = I.getOperand(2).getReg();
   Register SamplerReg = I.getOperand(3).getReg();
   Register CoordinateReg = I.getOperand(4).getReg();
@@ -4492,7 +4492,7 @@ bool SPIRVInstructionSelector::selectSampleCmpIntrinsic(
 }
 
 bool SPIRVInstructionSelector::selectSampleCmpLevelZeroIntrinsic(
-    Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register &ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
   Register ImageReg = I.getOperand(2).getReg();
   Register SamplerReg = I.getOperand(3).getReg();
   Register CoordinateReg = I.getOperand(4).getReg();
@@ -4500,16 +4500,16 @@ bool SPIRVInstructionSelector::selectSampleCmpLevelZeroIntrinsic(
   ImOps.Compare = I.getOperand(5).getReg();
   if (I.getNumOperands() > 6)
     ImOps.Offset = I.getOperand(6).getReg();
-  SPIRVType *FloatTy = GR.getOrCreateSPIRVFloatType(32, I, TII);
+  SPIRVTypeInst FloatTy = GR.getOrCreateSPIRVFloatType(32, I, TII);
   ImOps.Lod = GR.getOrCreateConstFP(APFloat(0.0f), I, FloatTy, TII);
   return generateSampleImage(ResVReg, ResType, ImageReg, SamplerReg,
                              CoordinateReg, ImOps, I.getDebugLoc(), I);
 }
 
 bool SPIRVInstructionSelector::generateImageReadOrFetch(
-    Register &ResVReg, const SPIRVType *ResType, Register ImageReg,
+    Register &ResVReg, SPIRVTypeInst ResType, Register ImageReg,
     Register IdxReg, DebugLoc Loc, MachineInstr &Pos) const {
-  SPIRVType *ImageType = GR.getSPIRVTypeForVReg(ImageReg);
+  SPIRVTypeInst ImageType = GR.getSPIRVTypeForVReg(ImageReg);
   assert(ImageType && ImageType->getOpcode() == SPIRV::OpTypeImage &&
          "ImageReg is not an image type.");
 
@@ -4536,7 +4536,7 @@ bool SPIRVInstructionSelector::generateImageReadOrFetch(
     return true;
   }
 
-  SPIRVType *ReadType = widenTypeToVec4(ResType, Pos);
+  SPIRVTypeInst ReadType = widenTypeToVec4(ResType, Pos);
   Register ReadReg = MRI->createVirtualRegister(GR.getRegClass(ReadType));
   auto BMI =
       BuildMI(*Pos.getParent(), Pos, Loc,
@@ -4561,10 +4561,11 @@ bool SPIRVInstructionSelector::generateImageReadOrFetch(
   return extractSubvector(ResVReg, ResType, ReadReg, Pos);
 }
 
-bool SPIRVInstructionSelector::selectResourceGetPointer(
-    Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+bool SPIRVInstructionSelector::selectResourceGetPointer(Register &ResVReg,
+                                                        SPIRVTypeInst ResType,
+                                                        MachineInstr &I) const {
   Register ResourcePtr = I.getOperand(2).getReg();
-  SPIRVType *RegType = GR.getSPIRVTypeForVReg(ResourcePtr, I.getMF());
+  SPIRVTypeInst RegType = GR.getSPIRVTypeForVReg(ResourcePtr, I.getMF());
   if (RegType->getOpcode() == SPIRV::OpTypeImage) {
     // For texel buffers, the index into the image is part of the OpImageRead or
     // OpImageWrite instructions. So we will do nothing in this case. This
@@ -4590,13 +4591,13 @@ bool SPIRVInstructionSelector::selectResourceGetPointer(
 }
 
 bool SPIRVInstructionSelector::selectPushConstantGetPointer(
-    Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register &ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
   MRI->replaceRegWith(ResVReg, I.getOperand(2).getReg());
   return true;
 }
 
 bool SPIRVInstructionSelector::selectResourceNonUniformIndex(
-    Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
+    Register &ResVReg, SPIRVTypeInst ResType, MachineInstr &I) const {
   Register ObjReg = I.getOperand(2).getReg();
   if (!BuildCOPY(ResVReg, ObjReg, I))
     return false;
@@ -4644,9 +4645,9 @@ void SPIRVInstructionSelector::decorateUsesAsNonUniform(
 }
 
 bool SPIRVInstructionSelector::extractSubvector(
-    Register &ResVReg, const SPIRVType *ResType, Register &ReadReg,
+    Register &ResVReg, SPIRVTypeInst ResType, Register &ReadReg,
     MachineInstr &InsertionPoint) const {
-  SPIRVType *InputType = GR.getResultType(ReadReg);
+  SPIRVTypeInst InputType = GR.getResultType(ReadReg);
   [[maybe_unused]] uint64_t InputSize =
       GR.getScalarOrVectorComponentCount(InputType);
   uint64_t ResultSize = GR.getScalarOrVectorComponentCount(ResType);
@@ -4655,7 +4656,7 @@ bool SPIRVInstructionSelector::extractSubvector(
   assert(ResultSize < InputSize &&
          "Cannot extract more element than there are in the input.");
   SmallVector<Register> ComponentRegisters;
-  SPIRVType *ScalarType = GR.getScalarOrVectorComponentType(ResType);
+  SPIRVTypeInst ScalarType = GR.getScalarOrVectorComponentType(ResType);
   const TargetRegisterClass *ScalarRegClass = GR.getRegClass(ScalarType);
   for (uint64_t I = 0; I < ResultSize; I++) {
     Register ComponentReg = MRI->createVirtualRegister(ScalarRegClass);
@@ -4710,12 +4711,12 @@ bool SPIRVInstructionSelector::selectImageWriteIntrinsic(
 }
 
 Register SPIRVInstructionSelector::buildPointerToResource(
-    const SPIRVType *SpirvResType, SPIRV::StorageClass::StorageClass SC,
+    SPIRVTypeInst SpirvResType, SPIRV::StorageClass::StorageClass SC,
     uint32_t Set, uint32_t Binding, uint32_t ArraySize, Register IndexReg,
     StringRef Name, MachineIRBuilder MIRBuilder) const {
   const Type *ResType = GR.getTypeForSPIRVType(SpirvResType);
   if (ArraySize == 1) {
-    SPIRVType *PtrType =
+    SPIRVTypeInst PtrType =
         GR.getOrCreateSPIRVPointerType(ResType, MIRBuilder, SC);
     assert(GR.getPointeeType(PtrType) == SpirvResType &&
            "SpirvResType did not have an explicit layout.");
@@ -4724,12 +4725,12 @@ Register SPIRVInstructionSelector::buildPointerToResource(
   }
 
   const Type *VarType = ArrayType::get(const_cast<Type *>(ResType), ArraySize);
-  SPIRVType *VarPointerType =
+  SPIRVTypeInst VarPointerType =
       GR.getOrCreateSPIRVPointerType(VarType, MIRBuilder, SC);
   Register VarReg = GR.getOrCreateGlobalVariableWithBinding(
       VarPointerType, Set, Binding, Name, MIRBuilder);
 
-  SPIRVType *ResPointerType =
+  SPIRVTypeInst ResPointerType =
       GR.getOrCreateSPIRVPointerType(ResType, MIRBuilder, SC);
   Register AcReg = MRI->createVirtualRegister(GR.getRegClass(ResPointerType));
 
@@ -4743,7 +4744,7 @@ Register SPIRVInstructionSelector::buildPointerToResource(
 }
 
 bool SPIRVInstructionSelector::selectFirstBitSet16(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I,
     unsigned ExtendOpcode, unsigned BitSetOpcode) const {
   Register ExtReg = MRI->createVirtualRegister(GR.getRegClass(ResType));
   if (!selectOpWithSrcs(ExtReg, ResType, I, {I.getOperand(2).getReg()},
@@ -4754,8 +4755,8 @@ bool SPIRVInstructionSelector::selectFirstBitSet16(
 }
 
 bool SPIRVInstructionSelector::selectFirstBitSet32(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
-    Register SrcReg, unsigned BitSetOpcode) const {
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I, Register SrcReg,
+    unsigned BitSetOpcode) const {
   BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpExtInst))
       .addDef(ResVReg)
       .addUse(GR.getSPIRVTypeID(ResType))
@@ -4767,8 +4768,8 @@ bool SPIRVInstructionSelector::selectFirstBitSet32(
 }
 
 bool SPIRVInstructionSelector::selectFirstBitSet64Overflow(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
-    Register SrcReg, unsigned BitSetOpcode, bool SwapPrimarySide) const {
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I, Register SrcReg,
+    unsigned BitSetOpcode, bool SwapPrimarySide) const {
 
   // SPIR-V allow vectors of size 2,3,4 only. Calling with a larger vectors
   // requires creating a param register and return register with an invalid
@@ -4778,11 +4779,11 @@ bool SPIRVInstructionSelector::selectFirstBitSet64Overflow(
   assert(ComponentCount < 5 && "Vec 5+ will generate invalid SPIR-V ops");
 
   MachineIRBuilder MIRBuilder(I);
-  SPIRVType *BaseType = GR.retrieveScalarOrVectorIntType(ResType);
-  SPIRVType *I64Type = GR.getOrCreateSPIRVIntegerType(64, MIRBuilder);
-  SPIRVType *I64x2Type =
+  SPIRVTypeInst BaseType = GR.retrieveScalarOrVectorIntType(ResType);
+  SPIRVTypeInst I64Type = GR.getOrCreateSPIRVIntegerType(64, MIRBuilder);
+  SPIRVTypeInst I64x2Type =
       GR.getOrCreateSPIRVVectorType(I64Type, 2, MIRBuilder, false);
-  SPIRVType *Vec2ResType =
+  SPIRVTypeInst Vec2ResType =
       GR.getOrCreateSPIRVVectorType(BaseType, 2, MIRBuilder, false);
 
   std::vector<Register> PartialRegs;
@@ -4844,10 +4845,10 @@ bool SPIRVInstructionSelector::selectFirstBitSet64Overflow(
 }
 
 bool SPIRVInstructionSelector::selectFirstBitSet64(
-    Register ResVReg, const SPIRVType *ResType, MachineInstr &I,
-    Register SrcReg, unsigned BitSetOpcode, bool SwapPrimarySide) const {
+    Register ResVReg, SPIRVTypeInst ResType, MachineInstr &I, Register SrcReg,
+    unsigned BitSetOpcode, bool SwapPrimarySide) const {
   unsigned ComponentCount = GR.getScalarOrVectorComponentCount(ResType);
-  SPIRVType *BaseType = GR.retrieveScalarOrVectorIntType(ResType);
+  SPIRVTypeInst BaseType = GR.retrieveScalarOrVectorIntType(ResType);
   bool ZeroAsNull = !STI.isShader();
   Register ConstIntZero =
       GR.getOrCreateConstInt(0, I, BaseType, TII, ZeroAsNull);
@@ -4865,7 +4866,7 @@ bool SPIRVInstructionSelector::selectFirstBitSet64(
 
   // 1. Split int64 into 2 pieces using a bitcast
   MachineIRBuilder MIRBuilder(I);
-  SPIRVType *PostCastType = GR.getOrCreateSPIRVVectorType(
+  SPIRVTypeInst PostCastType = GR.getOrCreateSPIRVVectorType(
       BaseType, 2 * ComponentCount, MIRBuilder, false);
   Register BitcastReg =
       MRI->createVirtualRegister(GR.getRegClass(PostCastType));
@@ -4926,7 +4927,7 @@ bool SPIRVInstructionSelector::selectFirstBitSet64(
 
   // 4. Check the result. When primary bits == -1 use secondary, otherwise use
   // primary
-  SPIRVType *BoolType = GR.getOrCreateSPIRVBoolType(I, TII);
+  SPIRVTypeInst BoolType = GR.getOrCreateSPIRVBoolType(I, TII);
   Register NegOneReg;
   Register Reg0;
   Register Reg32;
@@ -4987,12 +4988,12 @@ bool SPIRVInstructionSelector::selectFirstBitSet64(
 }
 
 bool SPIRVInstructionSelector::selectFirstBitHigh(Register ResVReg,
-                                                  const SPIRVType *ResType,
+                                                  SPIRVTypeInst ResType,
                                                   MachineInstr &I,
                                                   bool IsSigned) const {
   // FindUMsb and FindSMsb intrinsics only support 32 bit integers
   Register OpReg = I.getOperand(2).getReg();
-  SPIRVType *OpType = GR.getSPIRVTypeForVReg(OpReg);
+  SPIRVTypeInst OpType = GR.getSPIRVTypeForVReg(OpReg);
   // zero or sign extend
   unsigned ExtendOpcode = IsSigned ? SPIRV::OpSConvert : SPIRV::OpUConvert;
   unsigned BitSetOpcode = IsSigned ? GL::FindSMsb : GL::FindUMsb;
@@ -5012,11 +5013,11 @@ bool SPIRVInstructionSelector::selectFirstBitHigh(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectFirstBitLow(Register ResVReg,
-                                                 const SPIRVType *ResType,
+                                                 SPIRVTypeInst ResType,
                                                  MachineInstr &I) const {
   // FindILsb intrinsic only supports 32 bit integers
   Register OpReg = I.getOperand(2).getReg();
-  SPIRVType *OpType = GR.getSPIRVTypeForVReg(OpReg);
+  SPIRVTypeInst OpType = GR.getSPIRVTypeForVReg(OpReg);
   // OpUConvert treats the operand bits as an unsigned i16 and zero extends it
   // to an unsigned i32. As this leaves all the least significant bits unchanged
   // so the first set bit from the LSB side doesn't change.
@@ -5037,7 +5038,7 @@ bool SPIRVInstructionSelector::selectFirstBitLow(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectAllocaArray(Register ResVReg,
-                                                 const SPIRVType *ResType,
+                                                 SPIRVTypeInst ResType,
                                                  MachineInstr &I) const {
   // there was an allocation size parameter to the allocation instruction
   // that is not 1
@@ -5055,7 +5056,7 @@ bool SPIRVInstructionSelector::selectAllocaArray(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectFrameIndex(Register ResVReg,
-                                                const SPIRVType *ResType,
+                                                SPIRVTypeInst ResType,
                                                 MachineInstr &I) const {
   // Change order of instructions if needed: all OpVariable instructions in a
   // function must be the first instructions in the first block
@@ -5123,7 +5124,7 @@ bool SPIRVInstructionSelector::selectBranchCond(MachineInstr &I) const {
 }
 
 bool SPIRVInstructionSelector::selectPhi(Register ResVReg,
-                                         const SPIRVType *ResType,
+                                         SPIRVTypeInst ResType,
                                          MachineInstr &I) const {
   auto MIB = BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpPhi))
                  .addDef(ResVReg)
@@ -5176,7 +5177,7 @@ bool SPIRVInstructionSelector::selectGlobalValue(
           STI.canUseExtension(SPIRV::Extension::SPV_INTEL_function_pointers)
               ? dyn_cast<Function>(GV)
               : nullptr;
-      SPIRVType *ResType = GR.getOrCreateSPIRVPointerType(
+      SPIRVTypeInst ResType = GR.getOrCreateSPIRVPointerType(
           GVType, I,
           GVFun ? SPIRV::StorageClass::CodeSectionINTEL
                 : addressSpaceToStorageClass(GV->getAddressSpace(), STI));
@@ -5231,7 +5232,8 @@ bool SPIRVInstructionSelector::selectGlobalValue(
   const unsigned AddrSpace = GV->getAddressSpace();
   SPIRV::StorageClass::StorageClass StorageClass =
       addressSpaceToStorageClass(AddrSpace, STI);
-  SPIRVType *ResType = GR.getOrCreateSPIRVPointerType(GVType, I, StorageClass);
+  SPIRVTypeInst ResType =
+      GR.getOrCreateSPIRVPointerType(GVType, I, StorageClass);
   Register Reg = GR.buildGlobalVariable(
       ResVReg, ResType, GlobalIdent, GV, StorageClass, Init,
       GlobalVar->isConstant(), LnkType, MIRBuilder, true);
@@ -5251,7 +5253,7 @@ bool SPIRVInstructionSelector::selectGlobalValue(
 }
 
 bool SPIRVInstructionSelector::selectLog10(Register ResVReg,
-                                           const SPIRVType *ResType,
+                                           SPIRVTypeInst ResType,
                                            MachineInstr &I) const {
   if (STI.canUseExtInstSet(SPIRV::InstructionSet::OpenCL_std)) {
     return selectExtInst(ResVReg, ResType, I, CL::log10);
@@ -5279,10 +5281,10 @@ bool SPIRVInstructionSelector::selectLog10(Register ResVReg,
   assert(ResType->getOpcode() == SPIRV::OpTypeVector ||
          ResType->getOpcode() == SPIRV::OpTypeFloat);
   // TODO: Add matrix implementation once supported by the HLSL frontend.
-  const SPIRVType *SpirvScalarType =
-      ResType->getOpcode() == SPIRV::OpTypeVector
-          ? GR.getSPIRVTypeForVReg(ResType->getOperand(1).getReg())
-          : ResType;
+  SPIRVTypeInst SpirvScalarType = ResType->getOpcode() == SPIRV::OpTypeVector
+                                      ? SPIRVTypeInst(GR.getSPIRVTypeForVReg(
+                                            ResType->getOperand(1).getReg()))
+                                      : ResType;
   Register ScaleReg =
       GR.buildConstantFP(APFloat(0.30103f), MIRBuilder, SpirvScalarType);
 
@@ -5300,7 +5302,7 @@ bool SPIRVInstructionSelector::selectLog10(Register ResVReg,
 }
 
 bool SPIRVInstructionSelector::selectModf(Register ResVReg,
-                                          const SPIRVType *ResType,
+                                          SPIRVTypeInst ResType,
                                           MachineInstr &I) const {
   // llvm.modf has a single arg --the number to be decomposed-- and returns a
   // struct { restype, restype }, while OpenCLLIB::modf has two args --the
@@ -5319,7 +5321,7 @@ bool SPIRVInstructionSelector::selectModf(Register ResVReg,
   if (STI.canUseExtInstSet(SPIRV::InstructionSet::OpenCL_std)) {
     MachineIRBuilder MIRBuilder(I);
     // Get pointer type for alloca variable.
-    const SPIRVType *PtrType = GR.getOrCreateSPIRVPointerType(
+    const SPIRVTypeInst PtrType = GR.getOrCreateSPIRVPointerType(
         ResType, MIRBuilder, SPIRV::StorageClass::Function);
     // Create new register for the pointer type of alloca variable.
     Register PtrTyReg =
@@ -5382,11 +5384,11 @@ bool SPIRVInstructionSelector::selectModf(Register ResVReg,
 
 bool SPIRVInstructionSelector::loadVec3BuiltinInputID(
     SPIRV::BuiltIn::BuiltIn BuiltInValue, Register ResVReg,
-    const SPIRVType *ResType, MachineInstr &I) const {
+    SPIRVTypeInst ResType, MachineInstr &I) const {
   MachineIRBuilder MIRBuilder(I);
-  const SPIRVType *Vec3Ty =
+  const SPIRVTypeInst Vec3Ty =
       GR.getOrCreateSPIRVVectorType(ResType, 3, MIRBuilder, false);
-  const SPIRVType *PtrType = GR.getOrCreateSPIRVPointerType(
+  const SPIRVTypeInst PtrType = GR.getOrCreateSPIRVPointerType(
       Vec3Ty, MIRBuilder, SPIRV::StorageClass::Input);
 
   // Create new register for the input ID builtin variable.
@@ -5434,9 +5436,9 @@ bool SPIRVInstructionSelector::loadVec3BuiltinInputID(
 // Like LocalInvocationIndex
 bool SPIRVInstructionSelector::loadBuiltinInputID(
     SPIRV::BuiltIn::BuiltIn BuiltInValue, Register ResVReg,
-    const SPIRVType *ResType, MachineInstr &I) const {
+    SPIRVTypeInst ResType, MachineInstr &I) const {
   MachineIRBuilder MIRBuilder(I);
-  const SPIRVType *PtrType = GR.getOrCreateSPIRVPointerType(
+  const SPIRVTypeInst PtrType = GR.getOrCreateSPIRVPointerType(
       ResType, MIRBuilder, SPIRV::StorageClass::Input);
 
   // Create new register for the input ID builtin variable.
@@ -5465,8 +5467,8 @@ bool SPIRVInstructionSelector::loadBuiltinInputID(
   return true;
 }
 
-SPIRVType *SPIRVInstructionSelector::widenTypeToVec4(const SPIRVType *Type,
-                                                     MachineInstr &I) const {
+SPIRVTypeInst SPIRVInstructionSelector::widenTypeToVec4(SPIRVTypeInst Type,
+                                                        MachineInstr &I) const {
   MachineIRBuilder MIRBuilder(I);
   if (Type->getOpcode() != SPIRV::OpTypeVector)
     return GR.getOrCreateSPIRVVectorType(Type, 4, MIRBuilder, false);
@@ -5476,12 +5478,12 @@ SPIRVType *SPIRVInstructionSelector::widenTypeToVec4(const SPIRVType *Type,
     return Type;
 
   Register ScalarTypeReg = Type->getOperand(1).getReg();
-  const SPIRVType *ScalarType = GR.getSPIRVTypeForVReg(ScalarTypeReg);
+  const SPIRVTypeInst ScalarType = GR.getSPIRVTypeForVReg(ScalarTypeReg);
   return GR.getOrCreateSPIRVVectorType(ScalarType, 4, MIRBuilder, false);
 }
 
 bool SPIRVInstructionSelector::loadHandleBeforePosition(
-    Register &HandleReg, const SPIRVType *ResType, GIntrinsic &HandleDef,
+    Register &HandleReg, SPIRVTypeInst ResType, GIntrinsic &HandleDef,
     MachineInstr &Pos) const {
 
   assert(HandleDef.getIntrinsicID() ==
@@ -5495,7 +5497,7 @@ bool SPIRVInstructionSelector::loadHandleBeforePosition(
 
   bool IsStructuredBuffer = ResType->getOpcode() == SPIRV::OpTypePointer;
   MachineIRBuilder MIRBuilder(HandleDef);
-  SPIRVType *VarType = ResType;
+  SPIRVTypeInst VarType = ResType;
   SPIRV::StorageClass::StorageClass SC = SPIRV::StorageClass::UniformConstant;
 
   if (IsStructuredBuffer) {
@@ -5503,8 +5505,9 @@ bool SPIRVInstructionSelector::loadHandleBeforePosition(
     SC = GR.getPointerStorageClass(ResType);
   }
 
-  Register VarReg = buildPointerToResource(VarType, SC, Set, Binding, ArraySize,
-                                           IndexReg, Name, MIRBuilder);
+  Register VarReg =
+      buildPointerToResource(SPIRVTypeInst(VarType), SC, Set, Binding,
+                             ArraySize, IndexReg, Name, MIRBuilder);
 
   // The handle for the buffer is the pointer to the resource. For an image, the
   // handle is the image object. So images get an extra load.
diff --git a/llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp b/llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp
index 70a405cbd1c7e..d8f197443c6ab 100644
--- a/llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp
@@ -529,7 +529,7 @@ static bool legalizeInsertVectorElt(LegalizerHelper &Helper, MachineInstr &MI,
   return true;
 }
 
-static Register convertPtrToInt(Register Reg, LLT ConvTy, SPIRVType *SpvType,
+static Register convertPtrToInt(Register Reg, LLT ConvTy, SPIRVTypeInst SpvType,
                                 LegalizerHelper &Helper,
                                 MachineRegisterInfo &MRI,
                                 SPIRVGlobalRegistry *GR) {
@@ -683,7 +683,7 @@ bool SPIRVLegalizerInfo::legalizeCustom(
       LLT ConvT = LLT::scalar(ST->getPointerSize());
       Type *LLVMTy = IntegerType::get(MI.getMF()->getFunction().getContext(),
                                       ST->getPointerSize());
-      SPIRVType *SpirvTy = GR->getOrCreateSPIRVType(
+      SPIRVTypeInst SpirvTy = GR->getOrCreateSPIRVType(
           LLVMTy, Helper.MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
       Op0.setReg(convertPtrToInt(Reg0, ConvT, SpirvTy, Helper, MRI, GR));
       Op1.setReg(convertPtrToInt(Reg1, ConvT, SpirvTy, Helper, MRI, GR));
@@ -709,14 +709,14 @@ createStackTemporaryForVector(LegalizerHelper &Helper, SPIRVGlobalRegistry *GR,
       TypeSize::getFixed(SrcTy.getSizeInBytes()), VecAlign, PtrInfo);
 
   // Set the type of StackTemp to a pointer to an array of the element type.
-  SPIRVType *SpvSrcTy = GR->getSPIRVTypeForVReg(SrcReg);
-  SPIRVType *EltSpvTy = GR->getScalarOrVectorComponentType(SpvSrcTy);
+  SPIRVTypeInst SpvSrcTy = GR->getSPIRVTypeForVReg(SrcReg);
+  SPIRVTypeInst EltSpvTy = GR->getScalarOrVectorComponentType(SpvSrcTy);
   const Type *LLVMEltTy = GR->getTypeForSPIRVType(EltSpvTy);
   const Type *LLVMArrTy =
       ArrayType::get(const_cast<Type *>(LLVMEltTy), SrcTy.getNumElements());
-  SPIRVType *ArrSpvTy = GR->getOrCreateSPIRVType(
+  SPIRVTypeInst ArrSpvTy = GR->getOrCreateSPIRVType(
       LLVMArrTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
-  SPIRVType *PtrToArrSpvTy = GR->getOrCreateSPIRVPointerType(
+  SPIRVTypeInst PtrToArrSpvTy = GR->getOrCreateSPIRVPointerType(
       ArrSpvTy, MIRBuilder, SPIRV::StorageClass::Function);
 
   Register StackReg = StackTemp.getReg(0);
@@ -768,7 +768,7 @@ static bool legalizeSpvInsertElt(LegalizerHelper &Helper, MachineInstr &MI,
       uint64_t IdxVal = foldImm(IdxOperand, &MRI);
       if (IdxVal < SrcTy.getNumElements()) {
         SmallVector<Register, 8> Regs;
-        SPIRVType *ElementType =
+        SPIRVTypeInst ElementType =
             GR->getScalarOrVectorComponentType(GR->getSPIRVTypeForVReg(DstReg));
         LLT ElementLLTTy = GR->getRegType(ElementType);
         for (unsigned I = 0, E = SrcTy.getNumElements(); I < E; ++I) {
@@ -833,7 +833,7 @@ static bool legalizeSpvExtractElt(LegalizerHelper &Helper, MachineInstr &MI,
       if (IdxVal < SrcTy.getNumElements()) {
         LLT DstTy = MRI.getType(DstReg);
         SmallVector<Register, 8> Regs;
-        SPIRVType *DstSpvTy = GR->getSPIRVTypeForVReg(DstReg);
+        SPIRVTypeInst DstSpvTy = GR->getSPIRVTypeForVReg(DstReg);
         for (unsigned I = 0, E = SrcTy.getNumElements(); I < E; ++I) {
           if (I == IdxVal) {
             Regs.push_back(DstReg);
@@ -896,8 +896,8 @@ static bool legalizeSpvConstComposite(LegalizerHelper &Helper, MachineInstr &MI,
     // The "null" case: no values are attached.
     LLT EltTy = DstTy.getElementType();
     auto Zero = MIRBuilder.buildConstant(EltTy, 0);
-    SPIRVType *SpvDstTy = GR->getSPIRVTypeForVReg(DstReg);
-    SPIRVType *SpvEltTy = GR->getScalarOrVectorComponentType(SpvDstTy);
+    SPIRVTypeInst SpvDstTy = GR->getSPIRVTypeForVReg(DstReg);
+    SPIRVTypeInst SpvEltTy = GR->getScalarOrVectorComponentType(SpvDstTy);
     GR->assignSPIRVTypeToVReg(SpvEltTy, Zero.getReg(0), MIRBuilder.getMF());
     for (unsigned i = 0; i < DstTy.getNumElements(); ++i)
       SrcRegs.push_back(Zero.getReg(0));
@@ -960,7 +960,7 @@ bool SPIRVLegalizerInfo::legalizeIsFPClass(
       IntegerType::get(MIRBuilder.getContext(), DstTy.getScalarSizeInBits());
   if (DstTy.isVector())
     LLVMDstTy = VectorType::get(LLVMDstTy, DstTy.getElementCount());
-  SPIRVType *SPIRVDstTy = GR->getOrCreateSPIRVType(
+  SPIRVTypeInst SPIRVDstTy = GR->getOrCreateSPIRVType(
       LLVMDstTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite,
       /*EmitIR*/ true);
 
@@ -973,7 +973,7 @@ bool SPIRVLegalizerInfo::legalizeIsFPClass(
     IntTy = LLT::vector(SrcTy.getElementCount(), IntTy);
     LLVMIntTy = VectorType::get(LLVMIntTy, SrcTy.getElementCount());
   }
-  SPIRVType *SPIRVIntTy = GR->getOrCreateSPIRVType(
+  SPIRVTypeInst SPIRVIntTy = GR->getOrCreateSPIRVType(
       LLVMIntTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite,
       /*EmitIR*/ true);
 
@@ -986,7 +986,7 @@ bool SPIRVLegalizerInfo::legalizeIsFPClass(
     LLT MITy = MRI.getType(MI.getReg(0));
     assert((MITy == IntTy || MITy == DstTyCopy) &&
            "Unexpected LLT type while lowering G_IS_FPCLASS");
-    auto *SPVTy = MITy == IntTy ? SPIRVIntTy : SPIRVDstTy;
+    SPIRVTypeInst SPVTy = MITy == IntTy ? SPIRVIntTy : SPIRVDstTy;
     GR->assignSPIRVTypeToVReg(SPVTy, MI.getReg(0), MF);
     return MI;
   };
@@ -998,7 +998,7 @@ bool SPIRVLegalizerInfo::legalizeIsFPClass(
     auto ScalarC = MIRBuilder.buildConstant(Ty.getScalarType(), C);
     assert((Ty == IntTy || Ty == DstTyCopy) &&
            "Unexpected LLT type while lowering constant for G_IS_FPCLASS");
-    SPIRVType *VecEltTy = GR->getOrCreateSPIRVType(
+    SPIRVTypeInst VecEltTy = GR->getOrCreateSPIRVType(
         (Ty == IntTy ? LLVMIntTy : LLVMDstTy)->getScalarType(), MIRBuilder,
         SPIRV::AccessQualifier::ReadWrite,
         /*EmitIR*/ true);
diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
index 40cddbf7897b4..7a9dfc63a3f1b 100644
--- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
@@ -1064,7 +1064,7 @@ static void addOpTypeImageReqs(const MachineInstr &MI,
   }
 }
 
-static bool isBFloat16Type(const SPIRVType *TypeDef) {
+static bool isBFloat16Type(SPIRVTypeInst TypeDef) {
   return TypeDef && TypeDef->getNumOperands() == 3 &&
          TypeDef->getOpcode() == SPIRV::OpTypeFloat &&
          TypeDef->getOperand(1).getImm() == 16 &&
@@ -1078,7 +1078,7 @@ static bool isBFloat16Type(const SPIRVType *TypeDef) {
 static void AddAtomicVectorFloatRequirements(const MachineInstr &MI,
                                              SPIRV::RequirementHandler &Reqs,
                                              const SPIRVSubtarget &ST) {
-  SPIRVType *VecTypeDef =
+  SPIRVTypeInst VecTypeDef =
       MI.getMF()->getRegInfo().getVRegDef(MI.getOperand(1).getReg());
 
   const unsigned Rank = VecTypeDef->getOperand(2).getImm();
@@ -1086,7 +1086,7 @@ static void AddAtomicVectorFloatRequirements(const MachineInstr &MI,
     reportFatalUsageError("Result type of an atomic vector float instruction "
                           "must be a 2-component or 4 component vector");
 
-  SPIRVType *EltTypeDef =
+  SPIRVTypeInst EltTypeDef =
       MI.getMF()->getRegInfo().getVRegDef(VecTypeDef->getOperand(1).getReg());
 
   if (EltTypeDef->getOpcode() != SPIRV::OpTypeFloat ||
@@ -1114,7 +1114,7 @@ static void AddAtomicFloatRequirements(const MachineInstr &MI,
   assert(MI.getOperand(1).isReg() &&
          "Expect register operand in atomic float instruction");
   Register TypeReg = MI.getOperand(1).getReg();
-  SPIRVType *TypeDef = MI.getMF()->getRegInfo().getVRegDef(TypeReg);
+  SPIRVTypeInst TypeDef = MI.getMF()->getRegInfo().getVRegDef(TypeReg);
 
   if (TypeDef->getOpcode() == SPIRV::OpTypeVector)
     return AddAtomicVectorFloatRequirements(MI, Reqs, ST);
@@ -1334,7 +1334,7 @@ void addOpAccessChainReqs(const MachineInstr &Instr,
   }
 }
 
-static bool isImageTypeWithUnknownFormat(SPIRVType *TypeInst) {
+static bool isImageTypeWithUnknownFormat(SPIRVTypeInst TypeInst) {
   if (TypeInst->getOpcode() != SPIRV::OpTypeImage)
     return false;
   assert(TypeInst->getOperand(7).isImm() && "The image format must be an imm.");
@@ -1356,12 +1356,13 @@ static void AddDotProductRequirements(const MachineInstr &MI,
   assert(Input->getOperand(1).isReg() && "Unexpected operand in dot input");
   Register InputReg = Input->getOperand(1).getReg();
 
-  SPIRVType *TypeDef = MRI.getVRegDef(InputReg);
+  SPIRVTypeInst TypeDef = MRI.getVRegDef(InputReg);
   if (TypeDef->getOpcode() == SPIRV::OpTypeInt) {
     assert(TypeDef->getOperand(1).getImm() == 32);
     Reqs.addCapability(SPIRV::Capability::DotProductInput4x8BitPacked);
   } else if (TypeDef->getOpcode() == SPIRV::OpTypeVector) {
-    SPIRVType *ScalarTypeDef = MRI.getVRegDef(TypeDef->getOperand(1).getReg());
+    SPIRVTypeInst ScalarTypeDef =
+        MRI.getVRegDef(TypeDef->getOperand(1).getReg());
     assert(ScalarTypeDef->getOpcode() == SPIRV::OpTypeInt);
     if (ScalarTypeDef->getOperand(1).getImm() == 8) {
       assert(TypeDef->getOperand(2).getImm() == 4 &&
@@ -1377,7 +1378,7 @@ void addPrintfRequirements(const MachineInstr &MI,
                            SPIRV::RequirementHandler &Reqs,
                            const SPIRVSubtarget &ST) {
   SPIRVGlobalRegistry *GR = ST.getSPIRVGlobalRegistry();
-  const SPIRVType *PtrType = GR->getSPIRVTypeForVReg(MI.getOperand(4).getReg());
+  SPIRVTypeInst PtrType = GR->getSPIRVTypeForVReg(MI.getOperand(4).getReg());
   if (PtrType) {
     MachineOperand ASOp = PtrType->getOperand(1);
     if (ASOp.isImm()) {
@@ -1467,7 +1468,7 @@ void addInstrRequirements(const MachineInstr &MI,
   }
   case SPIRV::OpDot: {
     const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
-    SPIRVType *TypeDef = MRI.getVRegDef(MI.getOperand(1).getReg());
+    SPIRVTypeInst TypeDef = MRI.getVRegDef(MI.getOperand(1).getReg());
     if (isBFloat16Type(TypeDef))
       Reqs.addCapability(SPIRV::Capability::BFloat16DotProductKHR);
     break;
@@ -1506,7 +1507,7 @@ void addInstrRequirements(const MachineInstr &MI,
       break;
     assert(MI.getOperand(2).isReg());
     const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
-    SPIRVType *TypeDef = MRI.getVRegDef(MI.getOperand(2).getReg());
+    SPIRVTypeInst TypeDef = MRI.getVRegDef(MI.getOperand(2).getReg());
     if ((TypeDef->getNumOperands() == 2) &&
         (TypeDef->getOpcode() == SPIRV::OpTypeFloat) &&
         (TypeDef->getOperand(1).getImm() == 16))
@@ -1619,7 +1620,7 @@ void addInstrRequirements(const MachineInstr &MI,
     }
     assert(InstrPtr->getOperand(1).isReg() && "Unexpected operand in atomic");
     Register TypeReg = InstrPtr->getOperand(1).getReg();
-    SPIRVType *TypeDef = MRI.getVRegDef(TypeReg);
+    SPIRVTypeInst TypeDef = MRI.getVRegDef(TypeReg);
     if (TypeDef->getOpcode() == SPIRV::OpTypeInt) {
       unsigned BitWidth = TypeDef->getOperand(1).getImm();
       if (BitWidth == 64)
@@ -1901,7 +1902,7 @@ void addInstrRequirements(const MachineInstr &MI,
     Reqs.addExtension(SPIRV::Extension::SPV_KHR_cooperative_matrix);
     Reqs.addCapability(SPIRV::Capability::CooperativeMatrixKHR);
     const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
-    SPIRVType *TypeDef = MRI.getVRegDef(MI.getOperand(1).getReg());
+    SPIRVTypeInst TypeDef = MRI.getVRegDef(MI.getOperand(1).getReg());
     if (isBFloat16Type(TypeDef))
       Reqs.addCapability(SPIRV::Capability::BFloat16CooperativeMatrixKHR);
     break;
@@ -2070,7 +2071,7 @@ void addInstrRequirements(const MachineInstr &MI,
                          false);
     SPIRVGlobalRegistry *GR = ST.getSPIRVGlobalRegistry();
     SPIRV::AddressingModel::AddressingModel AddrModel = MAI.Addr;
-    SPIRVType *TyDef = GR->getSPIRVTypeForVReg(MI.getOperand(1).getReg());
+    SPIRVTypeInst TyDef = GR->getSPIRVTypeForVReg(MI.getOperand(1).getReg());
     if (MI.getOpcode() == SPIRV::OpConvertHandleToImageINTEL &&
         TyDef->getOpcode() != SPIRV::OpTypeImage) {
       report_fatal_error("Incorrect return type for the instruction "
@@ -2087,7 +2088,7 @@ void addInstrRequirements(const MachineInstr &MI,
                          "OpConvertHandleToSampledImageINTEL",
                          false);
     }
-    SPIRVType *SpvTy = GR->getSPIRVTypeForVReg(MI.getOperand(2).getReg());
+    SPIRVTypeInst SpvTy = GR->getSPIRVTypeForVReg(MI.getOperand(2).getReg());
     unsigned Bitwidth = GR->getScalarOrVectorBitWidth(SpvTy);
     if (!(Bitwidth == 32 && AddrModel == SPIRV::AddressingModel::Physical32) &&
         !(Bitwidth == 64 && AddrModel == SPIRV::AddressingModel::Physical64)) {
@@ -2163,7 +2164,7 @@ void addInstrRequirements(const MachineInstr &MI,
     break;
   case SPIRV::OpImageRead: {
     Register ImageReg = MI.getOperand(2).getReg();
-    SPIRVType *TypeDef = ST.getSPIRVGlobalRegistry()->getResultType(
+    SPIRVTypeInst TypeDef = ST.getSPIRVGlobalRegistry()->getResultType(
         ImageReg, const_cast<MachineFunction *>(MI.getMF()));
     // OpImageRead and OpImageWrite can use Unknown Image Formats
     // when the Kernel capability is declared. In the OpenCL environment we are
@@ -2177,7 +2178,7 @@ void addInstrRequirements(const MachineInstr &MI,
   }
   case SPIRV::OpImageWrite: {
     Register ImageReg = MI.getOperand(0).getReg();
-    SPIRVType *TypeDef = ST.getSPIRVGlobalRegistry()->getResultType(
+    SPIRVTypeInst TypeDef = ST.getSPIRVGlobalRegistry()->getResultType(
         ImageReg, const_cast<MachineFunction *>(MI.getMF()));
     // OpImageRead and OpImageWrite can use Unknown Image Formats
     // when the Kernel capability is declared. In the OpenCL environment we are
@@ -2310,7 +2311,7 @@ void addInstrRequirements(const MachineInstr &MI,
   case SPIRV::OpFRemV:
   case SPIRV::OpFNegateV: {
     const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
-    SPIRVType *TypeDef = MRI.getVRegDef(MI.getOperand(1).getReg());
+    SPIRVTypeInst TypeDef = MRI.getVRegDef(MI.getOperand(1).getReg());
     if (TypeDef->getOpcode() == SPIRV::OpTypeVector)
       TypeDef = MRI.getVRegDef(TypeDef->getOperand(1).getReg());
     if (isBFloat16Type(TypeDef)) {
@@ -2340,7 +2341,7 @@ void addInstrRequirements(const MachineInstr &MI,
   case SPIRV::OpFUnordGreaterThanEqual: {
     const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
     MachineInstr *OperandDef = MRI.getVRegDef(MI.getOperand(2).getReg());
-    SPIRVType *TypeDef = MRI.getVRegDef(OperandDef->getOperand(1).getReg());
+    SPIRVTypeInst TypeDef = MRI.getVRegDef(OperandDef->getOperand(1).getReg());
     if (TypeDef->getOpcode() == SPIRV::OpTypeVector)
       TypeDef = MRI.getVRegDef(TypeDef->getOperand(1).getReg());
     if (isBFloat16Type(TypeDef)) {
@@ -2612,7 +2613,7 @@ static void handleMIFlagDecoration(
     Register ResReg = I.getOpcode() == SPIRV::OpExtInst
                           ? I.getOperand(1).getReg()
                           : I.getOperand(2).getReg();
-    SPIRVType *ResType = GR->getSPIRVTypeForVReg(ResReg, I.getMF());
+    SPIRVTypeInst ResType = GR->getSPIRVTypeForVReg(ResReg, I.getMF());
     const Type *Ty = GR->getTypeForSPIRVType(ResType);
     Ty = Ty->isVectorTy() ? cast<VectorType>(Ty)->getElementType() : Ty;
 
diff --git a/llvm/lib/Target/SPIRV/SPIRVPostLegalizer.cpp b/llvm/lib/Target/SPIRV/SPIRVPostLegalizer.cpp
index 198654b0564b1..be39a39e5c97b 100644
--- a/llvm/lib/Target/SPIRV/SPIRVPostLegalizer.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVPostLegalizer.cpp
@@ -37,28 +37,28 @@ class SPIRVPostLegalizer : public MachineFunctionPass {
 
 namespace llvm {
 //  Defined in SPIRVPreLegalizer.cpp.
-extern void updateRegType(Register Reg, Type *Ty, SPIRVType *SpirvTy,
+extern void updateRegType(Register Reg, Type *Ty, SPIRVTypeInst SpirvTy,
                           SPIRVGlobalRegistry *GR, MachineIRBuilder &MIB,
                           MachineRegisterInfo &MRI);
 extern void processInstr(MachineInstr &MI, MachineIRBuilder &MIB,
                          MachineRegisterInfo &MRI, SPIRVGlobalRegistry *GR,
-                         SPIRVType *KnownResType);
+                         SPIRVTypeInst KnownResType);
 } // namespace llvm
 
-static SPIRVType *deduceIntTypeFromResult(Register ResVReg,
-                                          MachineIRBuilder &MIB,
-                                          SPIRVGlobalRegistry *GR) {
+static SPIRVTypeInst deduceIntTypeFromResult(Register ResVReg,
+                                             MachineIRBuilder &MIB,
+                                             SPIRVGlobalRegistry *GR) {
   const LLT &Ty = MIB.getMRI()->getType(ResVReg);
   return GR->getOrCreateSPIRVIntegerType(Ty.getScalarSizeInBits(), MIB);
 }
 
-static SPIRVType *deduceTypeFromSingleOperand(MachineInstr *I,
-                                              MachineIRBuilder &MIB,
-                                              SPIRVGlobalRegistry *GR,
-                                              unsigned OpIdx) {
+static SPIRVTypeInst deduceTypeFromSingleOperand(MachineInstr *I,
+                                                 MachineIRBuilder &MIB,
+                                                 SPIRVGlobalRegistry *GR,
+                                                 unsigned OpIdx) {
   Register OpReg = I->getOperand(OpIdx).getReg();
-  if (SPIRVType *OpType = GR->getSPIRVTypeForVReg(OpReg)) {
-    if (SPIRVType *CompType = GR->getScalarOrVectorComponentType(OpType)) {
+  if (SPIRVTypeInst OpType = GR->getSPIRVTypeForVReg(OpReg)) {
+    if (SPIRVTypeInst CompType = GR->getScalarOrVectorComponentType(OpType)) {
       Register ResVReg = I->getOperand(0).getReg();
       const LLT &ResLLT = MIB.getMRI()->getType(ResVReg);
       if (ResLLT.isVector())
@@ -70,13 +70,14 @@ static SPIRVType *deduceTypeFromSingleOperand(MachineInstr *I,
   return nullptr;
 }
 
-static SPIRVType *deduceTypeFromOperandRange(MachineInstr *I,
-                                             MachineIRBuilder &MIB,
-                                             SPIRVGlobalRegistry *GR,
-                                             unsigned StartOp, unsigned EndOp) {
-  SPIRVType *ResType = nullptr;
+static SPIRVTypeInst deduceTypeFromOperandRange(MachineInstr *I,
+                                                MachineIRBuilder &MIB,
+                                                SPIRVGlobalRegistry *GR,
+                                                unsigned StartOp,
+                                                unsigned EndOp) {
+  SPIRVTypeInst ResType = nullptr;
   for (unsigned i = StartOp; i < EndOp; ++i) {
-    if (SPIRVType *Type = deduceTypeFromSingleOperand(I, MIB, GR, i)) {
+    if (SPIRVTypeInst Type = deduceTypeFromSingleOperand(I, MIB, GR, i)) {
 #ifdef EXPENSIVE_CHECKS
       assert(!ResType || Type == ResType && "Conflicting type from operands.");
       ResType = Type;
@@ -88,15 +89,15 @@ static SPIRVType *deduceTypeFromOperandRange(MachineInstr *I,
   return ResType;
 }
 
-static SPIRVType *deduceTypeFromResultRegister(MachineInstr *Use,
-                                               Register UseRegister,
-                                               SPIRVGlobalRegistry *GR,
-                                               MachineIRBuilder &MIB) {
+static SPIRVTypeInst deduceTypeFromResultRegister(MachineInstr *Use,
+                                                  Register UseRegister,
+                                                  SPIRVGlobalRegistry *GR,
+                                                  MachineIRBuilder &MIB) {
   for (const MachineOperand &MO : Use->defs()) {
     if (!MO.isReg())
       continue;
-    if (SPIRVType *OpType = GR->getSPIRVTypeForVReg(MO.getReg())) {
-      if (SPIRVType *CompType = GR->getScalarOrVectorComponentType(OpType)) {
+    if (SPIRVTypeInst OpType = GR->getSPIRVTypeForVReg(MO.getReg())) {
+      if (SPIRVTypeInst CompType = GR->getScalarOrVectorComponentType(OpType)) {
         const LLT &ResLLT = MIB.getMRI()->getType(UseRegister);
         if (ResLLT.isVector())
           return GR->getOrCreateSPIRVVectorType(
@@ -108,15 +109,15 @@ static SPIRVType *deduceTypeFromResultRegister(MachineInstr *Use,
   return nullptr;
 }
 
-static SPIRVType *deducePointerTypeFromResultRegister(MachineInstr *Use,
-                                                      Register UseRegister,
-                                                      SPIRVGlobalRegistry *GR,
-                                                      MachineIRBuilder &MIB) {
+static SPIRVTypeInst
+deducePointerTypeFromResultRegister(MachineInstr *Use, Register UseRegister,
+                                    SPIRVGlobalRegistry *GR,
+                                    MachineIRBuilder &MIB) {
   assert(Use->getOpcode() == TargetOpcode::G_LOAD ||
          Use->getOpcode() == TargetOpcode::G_STORE);
 
   Register ValueReg = Use->getOperand(0).getReg();
-  SPIRVType *ValueType = GR->getSPIRVTypeForVReg(ValueReg);
+  SPIRVTypeInst ValueType = GR->getSPIRVTypeForVReg(ValueReg);
   if (!ValueType)
     return nullptr;
 
@@ -124,27 +125,27 @@ static SPIRVType *deducePointerTypeFromResultRegister(MachineInstr *Use,
                                          SPIRV::StorageClass::Function);
 }
 
-static SPIRVType *deduceTypeFromPointerOperand(MachineInstr *Use,
-                                               Register UseRegister,
-                                               SPIRVGlobalRegistry *GR,
-                                               MachineIRBuilder &MIB) {
+static SPIRVTypeInst deduceTypeFromPointerOperand(MachineInstr *Use,
+                                                  Register UseRegister,
+                                                  SPIRVGlobalRegistry *GR,
+                                                  MachineIRBuilder &MIB) {
   assert(Use->getOpcode() == TargetOpcode::G_LOAD ||
          Use->getOpcode() == TargetOpcode::G_STORE);
 
   Register PtrReg = Use->getOperand(1).getReg();
-  SPIRVType *PtrType = GR->getSPIRVTypeForVReg(PtrReg);
+  SPIRVTypeInst PtrType = GR->getSPIRVTypeForVReg(PtrReg);
   if (!PtrType)
     return nullptr;
 
   return GR->getPointeeType(PtrType);
 }
 
-static SPIRVType *deduceTypeFromUses(Register Reg, MachineFunction &MF,
-                                     SPIRVGlobalRegistry *GR,
-                                     MachineIRBuilder &MIB) {
+static SPIRVTypeInst deduceTypeFromUses(Register Reg, MachineFunction &MF,
+                                        SPIRVGlobalRegistry *GR,
+                                        MachineIRBuilder &MIB) {
   MachineRegisterInfo &MRI = MF.getRegInfo();
   for (MachineInstr &Use : MRI.use_nodbg_instructions(Reg)) {
-    SPIRVType *ResType = nullptr;
+    SPIRVTypeInst ResType = nullptr;
     LLVM_DEBUG(dbgs() << "Looking at use " << Use);
     switch (Use.getOpcode()) {
     case TargetOpcode::G_BUILD_VECTOR:
@@ -195,17 +196,17 @@ static SPIRVType *deduceTypeFromUses(Register Reg, MachineFunction &MF,
   return nullptr;
 }
 
-static SPIRVType *deduceGEPType(MachineInstr *I, SPIRVGlobalRegistry *GR,
-                                MachineIRBuilder &MIB) {
+static SPIRVTypeInst deduceGEPType(MachineInstr *I, SPIRVGlobalRegistry *GR,
+                                   MachineIRBuilder &MIB) {
   LLVM_DEBUG(dbgs() << "Deducing GEP type for: " << *I);
   Register PtrReg = I->getOperand(3).getReg();
-  SPIRVType *PtrType = GR->getSPIRVTypeForVReg(PtrReg);
+  SPIRVTypeInst PtrType = GR->getSPIRVTypeForVReg(PtrReg);
   if (!PtrType) {
     LLVM_DEBUG(dbgs() << "  Could not get type for pointer operand.\n");
     return nullptr;
   }
 
-  SPIRVType *PointeeType = GR->getPointeeType(PtrType);
+  SPIRVTypeInst PointeeType = GR->getPointeeType(PtrType);
   if (!PointeeType) {
     LLVM_DEBUG(dbgs() << "  Could not get pointee type from pointer type.\n");
     return nullptr;
@@ -262,14 +263,14 @@ static SPIRVType *deduceGEPType(MachineInstr *I, SPIRVGlobalRegistry *GR,
   LLVM_DEBUG(dbgs() << "  Final pointee type: " << *PointeeType);
 
   SPIRV::StorageClass::StorageClass SC = GR->getPointerStorageClass(PtrType);
-  SPIRVType *Res = GR->getOrCreateSPIRVPointerType(PointeeType, MIB, SC);
+  SPIRVTypeInst Res = GR->getOrCreateSPIRVPointerType(PointeeType, MIB, SC);
   LLVM_DEBUG(dbgs() << "  Deduced GEP type: " << *Res);
   return Res;
 }
 
-static SPIRVType *deduceResultTypeFromOperands(MachineInstr *I,
-                                               SPIRVGlobalRegistry *GR,
-                                               MachineIRBuilder &MIB) {
+static SPIRVTypeInst deduceResultTypeFromOperands(MachineInstr *I,
+                                                  SPIRVGlobalRegistry *GR,
+                                                  MachineIRBuilder &MIB) {
   Register ResVReg = I->getOperand(0).getReg();
   switch (I->getOpcode()) {
   case TargetOpcode::G_CONSTANT:
@@ -289,7 +290,7 @@ static SPIRVType *deduceResultTypeFromOperands(MachineInstr *I,
     break;
   }
   case TargetOpcode::G_LOAD: {
-    SPIRVType *PtrType = deduceTypeFromSingleOperand(I, MIB, GR, 1);
+    SPIRVTypeInst PtrType = deduceTypeFromSingleOperand(I, MIB, GR, 1);
     return PtrType ? GR->getPointeeType(PtrType) : nullptr;
   }
   default:
@@ -305,8 +306,8 @@ static bool deduceAndAssignTypeForGUnmerge(MachineInstr *I, MachineFunction &MF,
                                            MachineIRBuilder &MIB) {
   MachineRegisterInfo &MRI = MF.getRegInfo();
   Register SrcReg = I->getOperand(I->getNumOperands() - 1).getReg();
-  SPIRVType *ScalarType = nullptr;
-  if (SPIRVType *DefType = GR->getSPIRVTypeForVReg(SrcReg)) {
+  SPIRVTypeInst ScalarType = nullptr;
+  if (SPIRVTypeInst DefType = GR->getSPIRVTypeForVReg(SrcReg)) {
     assert(DefType->getOpcode() == SPIRV::OpTypeVector);
     ScalarType = GR->getSPIRVTypeForVReg(DefType->getOperand(1).getReg());
   }
@@ -333,7 +334,7 @@ static bool deduceAndAssignTypeForGUnmerge(MachineInstr *I, MachineFunction &MF,
       continue;
 
     LLT DefLLT = MRI.getType(DefReg);
-    SPIRVType *ResType =
+    SPIRVTypeInst ResType =
         DefLLT.isVector()
             ? GR->getOrCreateSPIRVVectorType(
                   ScalarType, DefLLT.getNumElements(), *I,
@@ -358,7 +359,7 @@ static bool deduceAndAssignSpirvType(MachineInstr *I, MachineFunction &MF,
     return deduceAndAssignTypeForGUnmerge(I, MF, GR, MIB);
 
   LLVM_DEBUG(dbgs() << "Inferring type from operands\n");
-  SPIRVType *ResType = deduceResultTypeFromOperands(I, GR, MIB);
+  SPIRVTypeInst ResType = deduceResultTypeFromOperands(I, GR, MIB);
   if (!ResType) {
     LLVM_DEBUG(dbgs() << "Inferring type from uses\n");
     ResType = deduceTypeFromUses(ResVReg, MF, GR, MIB);
@@ -453,9 +454,9 @@ static void registerSpirvTypeForNewInstructions(MachineFunction &MF,
       if (GR->getSPIRVTypeForVReg(ResVReg))
         continue;
       const LLT &ResLLT = MRI.getType(ResVReg);
-      SPIRVType *ResType = nullptr;
+      SPIRVTypeInst ResType = nullptr;
       if (ResLLT.isVector()) {
-        SPIRVType *CompType = GR->getOrCreateSPIRVIntegerType(
+        SPIRVTypeInst CompType = GR->getOrCreateSPIRVIntegerType(
             ResLLT.getElementType().getSizeInBits(), MIB);
         ResType = GR->getOrCreateSPIRVVectorType(
             CompType, ResLLT.getNumElements(), MIB, false);
@@ -477,7 +478,8 @@ static bool hasAssignType(Register Reg, MachineRegisterInfo &MRI) {
 }
 
 static void generateAssignType(MachineInstr &MI, Register ResultRegister,
-                               SPIRVType *ResultType, SPIRVGlobalRegistry *GR,
+                               SPIRVTypeInst ResultType,
+                               SPIRVGlobalRegistry *GR,
                                MachineRegisterInfo &MRI) {
   LLVM_DEBUG(dbgs() << "  Adding ASSIGN_TYPE for ResultRegister: "
                     << printReg(ResultRegister, MRI.getTargetRegisterInfo())
@@ -533,8 +535,7 @@ static void ensureAssignTypeForTypeFolding(MachineFunction &MF,
         continue;
       }
 
-      SPIRVType *ResultType = GR->getSPIRVTypeForVReg(ResultRegister);
-      assert(ResultType);
+      SPIRVTypeInst ResultType = GR->getSPIRVTypeForVReg(ResultRegister);
       generateAssignType(MI, ResultRegister, ResultType, GR, MRI);
     }
   }
diff --git a/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp b/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp
index 9ddbeee92ffb6..89b6975cdbdbd 100644
--- a/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp
@@ -96,7 +96,7 @@ addConstantsToTrack(MachineFunction &MF, SPIRVGlobalRegistry *GR,
             if (Const->isNullValue()) {
               MachineBasicBlock &DepMBB = MF.front();
               MachineIRBuilder MIB(DepMBB, DepMBB.getFirstNonPHI());
-              SPIRVType *ExtType = GR->getOrCreateSPIRVType(
+              SPIRVTypeInst ExtType = GR->getOrCreateSPIRVType(
                   Const->getType(), MIB, SPIRV::AccessQualifier::ReadWrite,
                   true);
               assert(SrcMI && "Expected source instruction to be valid");
@@ -175,8 +175,8 @@ static MachineInstr *findAssignTypeInstr(Register Reg,
 
 static void buildOpBitcast(SPIRVGlobalRegistry *GR, MachineIRBuilder &MIB,
                            Register ResVReg, Register OpReg) {
-  SPIRVType *ResType = GR->getSPIRVTypeForVReg(ResVReg);
-  SPIRVType *OpType = GR->getSPIRVTypeForVReg(OpReg);
+  SPIRVTypeInst ResType = GR->getSPIRVTypeForVReg(ResVReg);
+  SPIRVTypeInst OpType = GR->getSPIRVTypeForVReg(OpReg);
   assert(ResType && OpType && "Operand types are expected");
   if (!GR->isBitcastCompatible(ResType, OpType))
     report_fatal_error("incompatible result and operand types in a bitcast");
@@ -211,11 +211,11 @@ static void lowerBitcasts(MachineFunction &MF, SPIRVGlobalRegistry *GR,
       if (isSpvIntrinsic(MI, Intrinsic::spv_bitcast)) {
         Register DstReg = MI.getOperand(0).getReg();
         Register SrcReg = MI.getOperand(2).getReg();
-        SPIRVType *DstType = GR->getSPIRVTypeForVReg(DstReg);
+        SPIRVTypeInst DstType = GR->getSPIRVTypeForVReg(DstReg);
         assert(
             DstType &&
             "Expected destination SPIR-V type to have been assigned already.");
-        SPIRVType *SrcType = GR->getSPIRVTypeForVReg(SrcReg);
+        SPIRVTypeInst SrcType = GR->getSPIRVTypeForVReg(SrcReg);
         assert(SrcType &&
                "Expected source SPIR-V type to have been assigned already.");
         if (DstType == SrcType) {
@@ -261,7 +261,7 @@ static void insertBitcasts(MachineFunction &MF, SPIRVGlobalRegistry *GR,
           isa<FunctionType>(ElemTy)
               ? SPIRV::StorageClass::CodeSectionINTEL
               : addressSpaceToStorageClass(MI.getOperand(4).getImm(), *ST);
-      SPIRVType *AssignedPtrType =
+      SPIRVTypeInst AssignedPtrType =
           GR->getOrCreateSPIRVPointerType(ElemTy, MI, SC);
 
       // If the ptrcast would be redundant, replace all uses with the source
@@ -299,10 +299,11 @@ static void insertBitcasts(MachineFunction &MF, SPIRVGlobalRegistry *GR,
 //
 // Set SPIRVType for GV, propagate it from GV to other instructions,
 // also set register classes.
-static SPIRVType *propagateSPIRVType(MachineInstr *MI, SPIRVGlobalRegistry *GR,
-                                     MachineRegisterInfo &MRI,
-                                     MachineIRBuilder &MIB) {
-  SPIRVType *SpvType = nullptr;
+static SPIRVTypeInst propagateSPIRVType(MachineInstr *MI,
+                                        SPIRVGlobalRegistry *GR,
+                                        MachineRegisterInfo &MRI,
+                                        MachineIRBuilder &MIB) {
+  SPIRVTypeInst SpvType = nullptr;
   assert(MI && "Machine instr is expected");
   if (MI->getOperand(0).isReg()) {
     Register Reg = MI->getOperand(0).getReg();
@@ -333,7 +334,8 @@ static SPIRVType *propagateSPIRVType(MachineInstr *MI, SPIRVGlobalRegistry *GR,
         if (MI->getOperand(1).isReg()) {
           if (MachineInstr *DefInstr =
                   MRI.getVRegDef(MI->getOperand(1).getReg())) {
-            if (SPIRVType *Def = propagateSPIRVType(DefInstr, GR, MRI, MIB)) {
+            if (SPIRVTypeInst Def =
+                    propagateSPIRVType(DefInstr, GR, MRI, MIB)) {
               unsigned CurrentBW = GR->getScalarOrVectorBitWidth(Def);
               unsigned ExpectedBW =
                   std::max(MRI.getType(Reg).getScalarSizeInBits(), CurrentBW);
@@ -428,7 +430,7 @@ static void setInsertPtAfterDef(MachineIRBuilder &MIB, MachineInstr *Def) {
 }
 
 namespace llvm {
-void updateRegType(Register Reg, Type *Ty, SPIRVType *SpvType,
+void updateRegType(Register Reg, Type *Ty, SPIRVTypeInst SpvType,
                    SPIRVGlobalRegistry *GR, MachineIRBuilder &MIB,
                    MachineRegisterInfo &MRI) {
   assert((Ty || SpvType) && "Either LLVM or SPIRV type is expected.");
@@ -446,13 +448,13 @@ void updateRegType(Register Reg, Type *Ty, SPIRVType *SpvType,
 
 void processInstr(MachineInstr &MI, MachineIRBuilder &MIB,
                   MachineRegisterInfo &MRI, SPIRVGlobalRegistry *GR,
-                  SPIRVType *KnownResType) {
+                  SPIRVTypeInst KnownResType) {
   MIB.setInsertPt(*MI.getParent(), MI.getIterator());
   for (auto &Op : MI.operands()) {
     if (!Op.isReg() || Op.isDef())
       continue;
     Register OpReg = Op.getReg();
-    SPIRVType *SpvType = GR->getSPIRVTypeForVReg(OpReg);
+    SPIRVTypeInst SpvType = GR->getSPIRVTypeForVReg(OpReg);
     if (!SpvType && KnownResType) {
       SpvType = KnownResType;
       GR->assignSPIRVTypeToVReg(KnownResType, OpReg, *MI.getMF());
@@ -508,7 +510,7 @@ generateAssignInstrs(MachineFunction &MF, SPIRVGlobalRegistry *GR,
         Register Reg = MI.getOperand(1).getReg();
         MIB.setInsertPt(*MI.getParent(), MI.getIterator());
         Type *ElementTy = getMDOperandAsType(MI.getOperand(2).getMetadata(), 0);
-        SPIRVType *AssignedPtrType = GR->getOrCreateSPIRVPointerType(
+        SPIRVTypeInst AssignedPtrType = GR->getOrCreateSPIRVPointerType(
             ElementTy, MI,
             addressSpaceToStorageClass(MI.getOperand(3).getImm(), *ST));
         MachineInstr *Def = MRI.getVRegDef(Reg);
@@ -552,7 +554,7 @@ generateAssignInstrs(MachineFunction &MF, SPIRVGlobalRegistry *GR,
         // %rc = G_CONSTANT ty Val
         // Ensure %rc has a valid SPIR-V type assigned in the Global Registry.
         Register Reg = MI.getOperand(0).getReg();
-        bool NeedAssignType = GR->getSPIRVTypeForVReg(Reg) == nullptr;
+        bool NeedAssignType = !GR->getSPIRVTypeForVReg(Reg);
         Type *Ty = nullptr;
         if (MIOp == TargetOpcode::G_CONSTANT) {
           auto TargetExtIt = TargetExtConstTypes.find(&MI);
@@ -594,7 +596,7 @@ generateAssignInstrs(MachineFunction &MF, SPIRVGlobalRegistry *GR,
           } else if (ElemMI->getOpcode() == TargetOpcode::G_FCONSTANT) {
             ElemTy = ElemMI->getOperand(1).getFPImm()->getType();
           } else {
-            if (const SPIRVType *ElemSpvType =
+            if (SPIRVTypeInst ElemSpvType =
                     GR->getSPIRVTypeForVReg(MI.getOperand(1).getReg(), &MF))
               ElemTy = const_cast<Type *>(GR->getTypeForSPIRVType(ElemSpvType));
           }
@@ -707,14 +709,14 @@ insertInlineAsmProcess(MachineFunction &MF, SPIRVGlobalRegistry *GR,
     // create types
     const MDNode *IAMD = I1->getOperand(1).getMetadata();
     FunctionType *FTy = cast<FunctionType>(getMDOperandAsType(IAMD, 0));
-    SmallVector<SPIRVType *, 4> ArgTypes;
+    SmallVector<SPIRVTypeInst, 4> ArgTypes;
     for (const auto &ArgTy : FTy->params())
       ArgTypes.push_back(GR->getOrCreateSPIRVType(
           ArgTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true));
-    SPIRVType *RetType =
+    SPIRVTypeInst RetType =
         GR->getOrCreateSPIRVType(FTy->getReturnType(), MIRBuilder,
                                  SPIRV::AccessQualifier::ReadWrite, true);
-    SPIRVType *FuncType = GR->getOrCreateOpTypeFunctionWithArgs(
+    SPIRVTypeInst FuncType = GR->getOrCreateOpTypeFunctionWithArgs(
         FTy, RetType, ArgTypes, MIRBuilder);
 
     // define vendor specific assembly instructions string
@@ -745,7 +747,7 @@ insertInlineAsmProcess(MachineFunction &MF, SPIRVGlobalRegistry *GR,
     if (!DefReg.isValid()) {
       DefReg = MRI.createGenericVirtualRegister(LLT::scalar(32));
       MRI.setRegClass(DefReg, &SPIRV::iIDRegClass);
-      SPIRVType *VoidType = GR->getOrCreateSPIRVType(
+      SPIRVTypeInst VoidType = GR->getOrCreateSPIRVType(
           Type::getVoidTy(MF.getFunction().getContext()), MIRBuilder,
           SPIRV::AccessQualifier::ReadWrite, true);
       GR->assignSPIRVTypeToVReg(VoidType, DefReg, MF);



More information about the llvm-commits mailing list