[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