[llvm] [WebAssembly][GlobalISel] Implement pointer and memory ops. (PR #206885)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 1 00:30:34 PDT 2026


================
@@ -165,6 +217,101 @@ bool WebAssemblyInstructionSelector::select(MachineInstr &I) {
     I.setDesc(TII.get(TargetOpcode::IMPLICIT_DEF));
     return RBI.constrainGenericRegister(DefReg, *DefRC, MRI) != nullptr;
   }
+  case G_PTRTOINT: {
+    assert(MRI.getType(I.getOperand(1).getReg()).isPointer() &&
+           "G_PTRTOINT selection with non-pointer?");
+
+    I.setDesc(
+        TII.get(PtrIsI64 ? WebAssembly::COPY_I64 : WebAssembly::COPY_I32));
+    constrainSelectedInstRegOperands(I, TII, TRI, RBI);
+
+    return true;
+  }
+  case G_INTTOPTR: {
+    assert(MRI.getType(I.getOperand(0).getReg()).isPointer() &&
+           "G_INTTOPTR selection with non-pointer?");
+
+    I.setDesc(
+        TII.get(PtrIsI64 ? WebAssembly::COPY_I64 : WebAssembly::COPY_I32));
+    constrainSelectedInstRegOperands(I, TII, TRI, RBI);
+
+    return true;
+  }
+  case G_PTRMASK: {
+    assert(MRI.getType(I.getOperand(0).getReg()).isPointer() &&
+           "G_PTRMASK selection with non-pointer?");
+
+    I.setDesc(TII.get(PtrIsI64 ? WebAssembly::AND_I64 : WebAssembly::AND_I32));
+    constrainSelectedInstRegOperands(I, TII, TRI, RBI);
+
+    return true;
+  }
+  case G_GLOBAL_VALUE: {
+    assert(I.getOperand(1).getTargetFlags() == 0 &&
+           "Unexpected target flags on generic G_GLOBAL_VALUE instruction");
+    assert(WebAssembly::isValidAddressSpace(
+               MRI.getType(I.getOperand(0).getReg()).getAddressSpace()) &&
+           "Invalid address space for WebAssembly target");
+
+    unsigned OperandFlags = 0;
+    const llvm::GlobalValue *GV = I.getOperand(1).getGlobal();
+
+    if (TLI.isPositionIndependent()) {
+      if (TM.shouldAssumeDSOLocal(GV)) {
+        const char *BaseName;
+        if (GV->getValueType()->isFunctionTy()) {
+          BaseName = MF.createExternalSymbolName("__table_base");
+          OperandFlags = WebAssemblyII::MO_TABLE_BASE_REL;
+        } else {
+          BaseName = MF.createExternalSymbolName("__memory_base");
+          OperandFlags = WebAssemblyII::MO_MEMORY_BASE_REL;
+        }
+        MachineIRBuilder B(I);
+
+        auto MemBase =
+            MRI.createGenericVirtualRegister(LLT::pointer(0, PointerWidth));
----------------
arsenm wrote:

Just use the original type instead of reconstructing the pointer type?

https://github.com/llvm/llvm-project/pull/206885


More information about the llvm-commits mailing list