[llvm] [WebAssembly][FastISel] Call materializeLoadStoreOperands in load fold (PR #184203)

via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 2 21:13:12 PST 2026


https://github.com/ParkHanbum updated https://github.com/llvm/llvm-project/pull/184203

>From 66c863e677f0633683f703a1f07f4c195439cfc3 Mon Sep 17 00:00:00 2001
From: Hanbum Park <kese111 at gmail.com>
Date: Tue, 3 Mar 2026 03:09:50 +0900
Subject: [PATCH 1/3] [WebAssembly][FastISel] Call materializeLoadStoreOperands
 in load fold

The `tryToFoldLoadIntoMI` function omitted materializing base registers
for addresses before folding sign-extend instructions into loads. This
left `$noreg` as the base register, crashing subsequent passes.

WebAssembly memory instructions structurally require a valid base
register. Calling the existing `materializeLoadStoreOperands` function
ensures that a `CONST 0` virtual register is generated when addressing
global variables directly without a pre-existing base register.

(before) %1:i32 = LOAD8_S_I32_A32 0, @ch, $noreg ... -> CRASH
(after)  %3:i32 = CONST_I32 0
         %1:i32 = LOAD8_S_I32_A32 0, @ch, %3:i32 ... -> Folded safely
---
 .../WebAssembly/WebAssemblyFastISel.cpp       |   1 +
 llvm/test/CodeGen/WebAssembly/load-ext.ll     | 291 ++++++++++++++++++
 2 files changed, 292 insertions(+)

diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
index 02c3eb2469ea0..faec1acef68f9 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
@@ -1306,6 +1306,7 @@ bool WebAssemblyFastISel::tryToFoldLoadIntoMI(MachineInstr *MI, unsigned OpNo,
   if (!computeAddress(LI->getPointerOperand(), Addr))
     return false;
 
+  materializeLoadStoreOperands(Addr);
   Register ResultReg = MI->getOperand(0).getReg();
   MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
                                     TII.get(NewOpc), ResultReg);
diff --git a/llvm/test/CodeGen/WebAssembly/load-ext.ll b/llvm/test/CodeGen/WebAssembly/load-ext.ll
index d15b69fc7c76e..23664a8691d48 100644
--- a/llvm/test/CodeGen/WebAssembly/load-ext.ll
+++ b/llvm/test/CodeGen/WebAssembly/load-ext.ll
@@ -10,6 +10,297 @@
 
 ; Test that extending loads are assembled properly.
 
+ at gv8 = hidden global i8 0, align 1
+ at gv16 = hidden global i16 0, align 1
+
+define i32 @global_sext_i8_i32() {
+; WASM32-DAG-LABEL: global_sext_i8_i32:
+; WASM32-DAG:         .functype global_sext_i8_i32 () -> (i32)
+; WASM32-DAG-NEXT:  # %bb.0:
+; WASM32-DAG-NEXT:    i32.const $push0=, 0
+; WASM32-DAG-NEXT:    i32.load8_s $push1=, gv8($pop0)
+; WASM32-DAG-NEXT:    return $pop1
+;
+; WASM32-DAG-MVP-LABEL: global_sext_i8_i32:
+; WASM32-DAG-MVP:         .functype global_sext_i8_i32 () -> (i32)
+; WASM32-DAG-MVP-NEXT:  # %bb.0:
+; WASM32-DAG-MVP-NEXT:    i32.const $push0=, 0
+; WASM32-DAG-MVP-NEXT:    i32.load8_s $push1=, gv8($pop0)
+; WASM32-DAG-MVP-NEXT:    return $pop1
+;
+; WASM32-FAST-LABEL: global_sext_i8_i32:
+; WASM32-FAST:         .functype global_sext_i8_i32 () -> (i32)
+; WASM32-FAST-NEXT:  # %bb.0:
+; WASM32-FAST-NEXT:    i32.const $push1=, 0
+; WASM32-FAST-NEXT:    i32.load8_s $push0=, gv8($pop1)
+; WASM32-FAST-NEXT:    return $pop0
+;
+; WASM32-FAST-MVP-LABEL: global_sext_i8_i32:
+; WASM32-FAST-MVP:         .functype global_sext_i8_i32 () -> (i32)
+; WASM32-FAST-MVP-NEXT:  # %bb.0:
+; WASM32-FAST-MVP-NEXT:    i32.const $push3=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load8_u $push4=, gv8($pop3)
+; WASM32-FAST-MVP-NEXT:    i32.const $push0=, 24
+; WASM32-FAST-MVP-NEXT:    i32.shl $push1=, $pop4, $pop0
+; WASM32-FAST-MVP-NEXT:    i32.const $push5=, 24
+; WASM32-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
+; WASM32-FAST-MVP-NEXT:    return $pop2
+;
+; WASM64-DAG-LABEL: global_sext_i8_i32:
+; WASM64-DAG:         .functype global_sext_i8_i32 () -> (i32)
+; WASM64-DAG-NEXT:  # %bb.0:
+; WASM64-DAG-NEXT:    i64.const $push0=, 0
+; WASM64-DAG-NEXT:    i32.load8_s $push1=, gv8($pop0)
+; WASM64-DAG-NEXT:    return $pop1
+;
+; WASM64-DAG-MVP-LABEL: global_sext_i8_i32:
+; WASM64-DAG-MVP:         .functype global_sext_i8_i32 () -> (i32)
+; WASM64-DAG-MVP-NEXT:  # %bb.0:
+; WASM64-DAG-MVP-NEXT:    i64.const $push0=, 0
+; WASM64-DAG-MVP-NEXT:    i32.load8_s $push1=, gv8($pop0)
+; WASM64-DAG-MVP-NEXT:    return $pop1
+;
+; WASM64-FAST-LABEL: global_sext_i8_i32:
+; WASM64-FAST:         .functype global_sext_i8_i32 () -> (i32)
+; WASM64-FAST-NEXT:  # %bb.0:
+; WASM64-FAST-NEXT:    i64.const $push1=, 0
+; WASM64-FAST-NEXT:    i32.load8_s $push0=, gv8($pop1)
+; WASM64-FAST-NEXT:    return $pop0
+;
+; WASM64-FAST-MVP-LABEL: global_sext_i8_i32:
+; WASM64-FAST-MVP:         .functype global_sext_i8_i32 () -> (i32)
+; WASM64-FAST-MVP-NEXT:  # %bb.0:
+; WASM64-FAST-MVP-NEXT:    i64.const $push3=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load8_u $push4=, gv8($pop3)
+; WASM64-FAST-MVP-NEXT:    i32.const $push0=, 24
+; WASM64-FAST-MVP-NEXT:    i32.shl $push1=, $pop4, $pop0
+; WASM64-FAST-MVP-NEXT:    i32.const $push5=, 24
+; WASM64-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
+; WASM64-FAST-MVP-NEXT:    return $pop2
+  %ld = load i8, ptr @gv8, align 1
+  %conv = sext i8 %ld to i32
+  ret i32 %conv
+}
+
+define i32 @global_sext_i16_i32() {
+; WASM32-DAG-LABEL: global_sext_i16_i32:
+; WASM32-DAG:         .functype global_sext_i16_i32 () -> (i32)
+; WASM32-DAG-NEXT:  # %bb.0:
+; WASM32-DAG-NEXT:    i32.const $push0=, 0
+; WASM32-DAG-NEXT:    i32.load16_s $push1=, gv16($pop0):p2align=0
+; WASM32-DAG-NEXT:    return $pop1
+;
+; WASM32-DAG-MVP-LABEL: global_sext_i16_i32:
+; WASM32-DAG-MVP:         .functype global_sext_i16_i32 () -> (i32)
+; WASM32-DAG-MVP-NEXT:  # %bb.0:
+; WASM32-DAG-MVP-NEXT:    i32.const $push0=, 0
+; WASM32-DAG-MVP-NEXT:    i32.load16_s $push1=, gv16($pop0):p2align=0
+; WASM32-DAG-MVP-NEXT:    return $pop1
+;
+; WASM32-FAST-LABEL: global_sext_i16_i32:
+; WASM32-FAST:         .functype global_sext_i16_i32 () -> (i32)
+; WASM32-FAST-NEXT:  # %bb.0:
+; WASM32-FAST-NEXT:    i32.const $push1=, 0
+; WASM32-FAST-NEXT:    i32.load16_s $push0=, gv16($pop1):p2align=0
+; WASM32-FAST-NEXT:    return $pop0
+;
+; WASM32-FAST-MVP-LABEL: global_sext_i16_i32:
+; WASM32-FAST-MVP:         .functype global_sext_i16_i32 () -> (i32)
+; WASM32-FAST-MVP-NEXT:  # %bb.0:
+; WASM32-FAST-MVP-NEXT:    i32.const $push3=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load16_u $push4=, gv16($pop3):p2align=0
+; WASM32-FAST-MVP-NEXT:    i32.const $push0=, 16
+; WASM32-FAST-MVP-NEXT:    i32.shl $push1=, $pop4, $pop0
+; WASM32-FAST-MVP-NEXT:    i32.const $push5=, 16
+; WASM32-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
+; WASM32-FAST-MVP-NEXT:    return $pop2
+;
+; WASM64-DAG-LABEL: global_sext_i16_i32:
+; WASM64-DAG:         .functype global_sext_i16_i32 () -> (i32)
+; WASM64-DAG-NEXT:  # %bb.0:
+; WASM64-DAG-NEXT:    i64.const $push0=, 0
+; WASM64-DAG-NEXT:    i32.load16_s $push1=, gv16($pop0):p2align=0
+; WASM64-DAG-NEXT:    return $pop1
+;
+; WASM64-DAG-MVP-LABEL: global_sext_i16_i32:
+; WASM64-DAG-MVP:         .functype global_sext_i16_i32 () -> (i32)
+; WASM64-DAG-MVP-NEXT:  # %bb.0:
+; WASM64-DAG-MVP-NEXT:    i64.const $push0=, 0
+; WASM64-DAG-MVP-NEXT:    i32.load16_s $push1=, gv16($pop0):p2align=0
+; WASM64-DAG-MVP-NEXT:    return $pop1
+;
+; WASM64-FAST-LABEL: global_sext_i16_i32:
+; WASM64-FAST:         .functype global_sext_i16_i32 () -> (i32)
+; WASM64-FAST-NEXT:  # %bb.0:
+; WASM64-FAST-NEXT:    i64.const $push1=, 0
+; WASM64-FAST-NEXT:    i32.load16_s $push0=, gv16($pop1):p2align=0
+; WASM64-FAST-NEXT:    return $pop0
+;
+; WASM64-FAST-MVP-LABEL: global_sext_i16_i32:
+; WASM64-FAST-MVP:         .functype global_sext_i16_i32 () -> (i32)
+; WASM64-FAST-MVP-NEXT:  # %bb.0:
+; WASM64-FAST-MVP-NEXT:    i64.const $push3=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load16_u $push4=, gv16($pop3):p2align=0
+; WASM64-FAST-MVP-NEXT:    i32.const $push0=, 16
+; WASM64-FAST-MVP-NEXT:    i32.shl $push1=, $pop4, $pop0
+; WASM64-FAST-MVP-NEXT:    i32.const $push5=, 16
+; WASM64-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
+; WASM64-FAST-MVP-NEXT:    return $pop2
+  %ld = load i16, ptr @gv16, align 1
+  %conv = sext i16 %ld to i32
+  ret i32 %conv
+}
+
+define i64 @global_sext_i8_i64() {
+; WASM32-DAG-LABEL: global_sext_i8_i64:
+; WASM32-DAG:         .functype global_sext_i8_i64 () -> (i64)
+; WASM32-DAG-NEXT:  # %bb.0:
+; WASM32-DAG-NEXT:    i32.const $push0=, 0
+; WASM32-DAG-NEXT:    i64.load8_s $push1=, gv8($pop0)
+; WASM32-DAG-NEXT:    return $pop1
+;
+; WASM32-DAG-MVP-LABEL: global_sext_i8_i64:
+; WASM32-DAG-MVP:         .functype global_sext_i8_i64 () -> (i64)
+; WASM32-DAG-MVP-NEXT:  # %bb.0:
+; WASM32-DAG-MVP-NEXT:    i32.const $push0=, 0
+; WASM32-DAG-MVP-NEXT:    i64.load8_s $push1=, gv8($pop0)
+; WASM32-DAG-MVP-NEXT:    return $pop1
+;
+; WASM32-FAST-LABEL: global_sext_i8_i64:
+; WASM32-FAST:         .functype global_sext_i8_i64 () -> (i64)
+; WASM32-FAST-NEXT:  # %bb.0:
+; WASM32-FAST-NEXT:    i32.const $push2=, 0
+; WASM32-FAST-NEXT:    i32.load8_u $push3=, gv8($pop2)
+; WASM32-FAST-NEXT:    i64.extend_i32_u $push0=, $pop3
+; WASM32-FAST-NEXT:    i64.extend8_s $push1=, $pop0
+; WASM32-FAST-NEXT:    return $pop1
+;
+; WASM32-FAST-MVP-LABEL: global_sext_i8_i64:
+; WASM32-FAST-MVP:         .functype global_sext_i8_i64 () -> (i64)
+; WASM32-FAST-MVP-NEXT:  # %bb.0:
+; WASM32-FAST-MVP-NEXT:    i32.const $push4=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load8_u $push5=, gv8($pop4)
+; WASM32-FAST-MVP-NEXT:    i32.const $push1=, 24
+; WASM32-FAST-MVP-NEXT:    i32.shl $push2=, $pop5, $pop1
+; WASM32-FAST-MVP-NEXT:    i32.const $push6=, 24
+; WASM32-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
+; WASM32-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3
+; WASM32-FAST-MVP-NEXT:    return $pop0
+;
+; WASM64-DAG-LABEL: global_sext_i8_i64:
+; WASM64-DAG:         .functype global_sext_i8_i64 () -> (i64)
+; WASM64-DAG-NEXT:  # %bb.0:
+; WASM64-DAG-NEXT:    i64.const $push0=, 0
+; WASM64-DAG-NEXT:    i64.load8_s $push1=, gv8($pop0)
+; WASM64-DAG-NEXT:    return $pop1
+;
+; WASM64-DAG-MVP-LABEL: global_sext_i8_i64:
+; WASM64-DAG-MVP:         .functype global_sext_i8_i64 () -> (i64)
+; WASM64-DAG-MVP-NEXT:  # %bb.0:
+; WASM64-DAG-MVP-NEXT:    i64.const $push0=, 0
+; WASM64-DAG-MVP-NEXT:    i64.load8_s $push1=, gv8($pop0)
+; WASM64-DAG-MVP-NEXT:    return $pop1
+;
+; WASM64-FAST-LABEL: global_sext_i8_i64:
+; WASM64-FAST:         .functype global_sext_i8_i64 () -> (i64)
+; WASM64-FAST-NEXT:  # %bb.0:
+; WASM64-FAST-NEXT:    i64.const $push2=, 0
+; WASM64-FAST-NEXT:    i32.load8_u $push3=, gv8($pop2)
+; WASM64-FAST-NEXT:    i64.extend_i32_u $push0=, $pop3
+; WASM64-FAST-NEXT:    i64.extend8_s $push1=, $pop0
+; WASM64-FAST-NEXT:    return $pop1
+;
+; WASM64-FAST-MVP-LABEL: global_sext_i8_i64:
+; WASM64-FAST-MVP:         .functype global_sext_i8_i64 () -> (i64)
+; WASM64-FAST-MVP-NEXT:  # %bb.0:
+; WASM64-FAST-MVP-NEXT:    i64.const $push4=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load8_u $push5=, gv8($pop4)
+; WASM64-FAST-MVP-NEXT:    i32.const $push1=, 24
+; WASM64-FAST-MVP-NEXT:    i32.shl $push2=, $pop5, $pop1
+; WASM64-FAST-MVP-NEXT:    i32.const $push6=, 24
+; WASM64-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
+; WASM64-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3
+; WASM64-FAST-MVP-NEXT:    return $pop0
+  %ld = load i8, ptr @gv8, align 1
+  %conv = sext i8 %ld to i64
+  ret i64 %conv
+}
+
+define i64 @global_sext_i16_i64() {
+; WASM32-DAG-LABEL: global_sext_i16_i64:
+; WASM32-DAG:         .functype global_sext_i16_i64 () -> (i64)
+; WASM32-DAG-NEXT:  # %bb.0:
+; WASM32-DAG-NEXT:    i32.const $push0=, 0
+; WASM32-DAG-NEXT:    i64.load16_s $push1=, gv16($pop0):p2align=0
+; WASM32-DAG-NEXT:    return $pop1
+;
+; WASM32-DAG-MVP-LABEL: global_sext_i16_i64:
+; WASM32-DAG-MVP:         .functype global_sext_i16_i64 () -> (i64)
+; WASM32-DAG-MVP-NEXT:  # %bb.0:
+; WASM32-DAG-MVP-NEXT:    i32.const $push0=, 0
+; WASM32-DAG-MVP-NEXT:    i64.load16_s $push1=, gv16($pop0):p2align=0
+; WASM32-DAG-MVP-NEXT:    return $pop1
+;
+; WASM32-FAST-LABEL: global_sext_i16_i64:
+; WASM32-FAST:         .functype global_sext_i16_i64 () -> (i64)
+; WASM32-FAST-NEXT:  # %bb.0:
+; WASM32-FAST-NEXT:    i32.const $push2=, 0
+; WASM32-FAST-NEXT:    i32.load16_u $push3=, gv16($pop2):p2align=0
+; WASM32-FAST-NEXT:    i64.extend_i32_u $push0=, $pop3
+; WASM32-FAST-NEXT:    i64.extend16_s $push1=, $pop0
+; WASM32-FAST-NEXT:    return $pop1
+;
+; WASM32-FAST-MVP-LABEL: global_sext_i16_i64:
+; WASM32-FAST-MVP:         .functype global_sext_i16_i64 () -> (i64)
+; WASM32-FAST-MVP-NEXT:  # %bb.0:
+; WASM32-FAST-MVP-NEXT:    i32.const $push4=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load16_u $push5=, gv16($pop4):p2align=0
+; WASM32-FAST-MVP-NEXT:    i32.const $push1=, 16
+; WASM32-FAST-MVP-NEXT:    i32.shl $push2=, $pop5, $pop1
+; WASM32-FAST-MVP-NEXT:    i32.const $push6=, 16
+; WASM32-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
+; WASM32-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3
+; WASM32-FAST-MVP-NEXT:    return $pop0
+;
+; WASM64-DAG-LABEL: global_sext_i16_i64:
+; WASM64-DAG:         .functype global_sext_i16_i64 () -> (i64)
+; WASM64-DAG-NEXT:  # %bb.0:
+; WASM64-DAG-NEXT:    i64.const $push0=, 0
+; WASM64-DAG-NEXT:    i64.load16_s $push1=, gv16($pop0):p2align=0
+; WASM64-DAG-NEXT:    return $pop1
+;
+; WASM64-DAG-MVP-LABEL: global_sext_i16_i64:
+; WASM64-DAG-MVP:         .functype global_sext_i16_i64 () -> (i64)
+; WASM64-DAG-MVP-NEXT:  # %bb.0:
+; WASM64-DAG-MVP-NEXT:    i64.const $push0=, 0
+; WASM64-DAG-MVP-NEXT:    i64.load16_s $push1=, gv16($pop0):p2align=0
+; WASM64-DAG-MVP-NEXT:    return $pop1
+;
+; WASM64-FAST-LABEL: global_sext_i16_i64:
+; WASM64-FAST:         .functype global_sext_i16_i64 () -> (i64)
+; WASM64-FAST-NEXT:  # %bb.0:
+; WASM64-FAST-NEXT:    i64.const $push2=, 0
+; WASM64-FAST-NEXT:    i32.load16_u $push3=, gv16($pop2):p2align=0
+; WASM64-FAST-NEXT:    i64.extend_i32_u $push0=, $pop3
+; WASM64-FAST-NEXT:    i64.extend16_s $push1=, $pop0
+; WASM64-FAST-NEXT:    return $pop1
+;
+; WASM64-FAST-MVP-LABEL: global_sext_i16_i64:
+; WASM64-FAST-MVP:         .functype global_sext_i16_i64 () -> (i64)
+; WASM64-FAST-MVP-NEXT:  # %bb.0:
+; WASM64-FAST-MVP-NEXT:    i64.const $push4=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load16_u $push5=, gv16($pop4):p2align=0
+; WASM64-FAST-MVP-NEXT:    i32.const $push1=, 16
+; WASM64-FAST-MVP-NEXT:    i32.shl $push2=, $pop5, $pop1
+; WASM64-FAST-MVP-NEXT:    i32.const $push6=, 16
+; WASM64-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
+; WASM64-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3
+; WASM64-FAST-MVP-NEXT:    return $pop0
+  %ld= load i16, ptr @gv16, align 1
+  %conv = sext i16 %ld to i64
+  ret i64 %conv
+}
+
 define i32 @sext_i8_i32(ptr %p) {
 ; WASM32-DAG-LABEL: sext_i8_i32:
 ; WASM32-DAG:         .functype sext_i8_i32 (i32) -> (i32)

>From 2fa1fcdcb4f20cd1095608656b235396bdf10e10 Mon Sep 17 00:00:00 2001
From: Hanbum Park <kese111 at gmail.com>
Date: Tue, 3 Mar 2026 11:40:47 +0900
Subject: [PATCH 2/3] Refactor selectLoad and tryToFoldLoadIntoMI to use
 emitLoad helper

---
 .../WebAssembly/WebAssemblyFastISel.cpp       | 36 +++++-----
 llvm/test/CodeGen/WebAssembly/load-ext.ll     | 72 +++++++++----------
 2 files changed, 55 insertions(+), 53 deletions(-)

diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
index faec1acef68f9..fc73785d9b44b 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
@@ -156,6 +156,7 @@ class WebAssemblyFastISel final : public FastISel {
   void materializeLoadStoreOperands(Address &Addr);
   void addLoadStoreOperands(const Address &Addr, const MachineInstrBuilder &MIB,
                             MachineMemOperand *MMO);
+  bool emitLoad(Register ResultReg, unsigned Opc, const LoadInst *LoadInst);
   unsigned maskI1Value(unsigned Reg, const Value *V);
   unsigned getRegForI1Value(const Value *V, const BasicBlock *BB, bool &Not);
   unsigned zeroExtendToI32(unsigned Reg, const Value *V,
@@ -430,6 +431,20 @@ void WebAssemblyFastISel::addLoadStoreOperands(const Address &Addr,
   MIB.addMemOperand(MMO);
 }
 
+bool WebAssemblyFastISel::emitLoad(Register ResultReg, unsigned Opc,
+                                   const LoadInst *Load) {
+  Address Addr;
+  if (!computeAddress(Load->getPointerOperand(), Addr))
+    return false;
+
+  materializeLoadStoreOperands(Addr);
+  auto MIB =
+      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(Opc), ResultReg);
+  addLoadStoreOperands(Addr, MIB, createMachineMemOperandFor(Load));
+
+  return true;
+}
+
 unsigned WebAssemblyFastISel::maskI1Value(unsigned Reg, const Value *V) {
   return zeroExtendToI32(Reg, V, MVT::i1);
 }
@@ -1302,15 +1317,10 @@ bool WebAssemblyFastISel::tryToFoldLoadIntoMI(MachineInstr *MI, unsigned OpNo,
       WebAssembly::INSTRUCTION_LIST_END)
     return false;
 
-  Address Addr;
-  if (!computeAddress(LI->getPointerOperand(), Addr))
+  Register ResultReg = MI->getOperand(0).getReg();
+  if (!emitLoad(ResultReg, NewOpc, LI))
     return false;
 
-  materializeLoadStoreOperands(Addr);
-  Register ResultReg = MI->getOperand(0).getReg();
-  MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD,
-                                    TII.get(NewOpc), ResultReg);
-  addLoadStoreOperands(Addr, MIB, createMachineMemOperandFor(LI));
   MachineBasicBlock::iterator Iter(MI);
   removeDeadCode(Iter, std::next(Iter));
   return true;
@@ -1325,10 +1335,6 @@ bool WebAssemblyFastISel::selectLoad(const Instruction *I) {
   if (!Subtarget->hasSIMD128() && Load->getType()->isVectorTy())
     return false;
 
-  Address Addr;
-  if (!computeAddress(Load->getPointerOperand(), Addr))
-    return false;
-
   // TODO: Fold a following sign-/zero-extend into the load instruction.
 
   unsigned Opc;
@@ -1364,13 +1370,9 @@ bool WebAssemblyFastISel::selectLoad(const Instruction *I) {
     return false;
   }
 
-  materializeLoadStoreOperands(Addr);
-
   Register ResultReg = createResultReg(RC);
-  auto MIB =
-      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, MIMD, TII.get(Opc), ResultReg);
-
-  addLoadStoreOperands(Addr, MIB, createMachineMemOperandFor(Load));
+  if (!emitLoad(ResultReg, Opc, Load))
+    return false;
 
   updateValueMap(Load, ResultReg);
   return true;
diff --git a/llvm/test/CodeGen/WebAssembly/load-ext.ll b/llvm/test/CodeGen/WebAssembly/load-ext.ll
index 23664a8691d48..1d54ef5be2b7a 100644
--- a/llvm/test/CodeGen/WebAssembly/load-ext.ll
+++ b/llvm/test/CodeGen/WebAssembly/load-ext.ll
@@ -38,10 +38,10 @@ define i32 @global_sext_i8_i32() {
 ; WASM32-FAST-MVP-LABEL: global_sext_i8_i32:
 ; WASM32-FAST-MVP:         .functype global_sext_i8_i32 () -> (i32)
 ; WASM32-FAST-MVP-NEXT:  # %bb.0:
-; WASM32-FAST-MVP-NEXT:    i32.const $push3=, 0
-; WASM32-FAST-MVP-NEXT:    i32.load8_u $push4=, gv8($pop3)
+; WASM32-FAST-MVP-NEXT:    i32.const $push4=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load8_u $push3=, gv8($pop4)
 ; WASM32-FAST-MVP-NEXT:    i32.const $push0=, 24
-; WASM32-FAST-MVP-NEXT:    i32.shl $push1=, $pop4, $pop0
+; WASM32-FAST-MVP-NEXT:    i32.shl $push1=, $pop3, $pop0
 ; WASM32-FAST-MVP-NEXT:    i32.const $push5=, 24
 ; WASM32-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
 ; WASM32-FAST-MVP-NEXT:    return $pop2
@@ -70,10 +70,10 @@ define i32 @global_sext_i8_i32() {
 ; WASM64-FAST-MVP-LABEL: global_sext_i8_i32:
 ; WASM64-FAST-MVP:         .functype global_sext_i8_i32 () -> (i32)
 ; WASM64-FAST-MVP-NEXT:  # %bb.0:
-; WASM64-FAST-MVP-NEXT:    i64.const $push3=, 0
-; WASM64-FAST-MVP-NEXT:    i32.load8_u $push4=, gv8($pop3)
+; WASM64-FAST-MVP-NEXT:    i64.const $push4=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load8_u $push3=, gv8($pop4)
 ; WASM64-FAST-MVP-NEXT:    i32.const $push0=, 24
-; WASM64-FAST-MVP-NEXT:    i32.shl $push1=, $pop4, $pop0
+; WASM64-FAST-MVP-NEXT:    i32.shl $push1=, $pop3, $pop0
 ; WASM64-FAST-MVP-NEXT:    i32.const $push5=, 24
 ; WASM64-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
 ; WASM64-FAST-MVP-NEXT:    return $pop2
@@ -107,10 +107,10 @@ define i32 @global_sext_i16_i32() {
 ; WASM32-FAST-MVP-LABEL: global_sext_i16_i32:
 ; WASM32-FAST-MVP:         .functype global_sext_i16_i32 () -> (i32)
 ; WASM32-FAST-MVP-NEXT:  # %bb.0:
-; WASM32-FAST-MVP-NEXT:    i32.const $push3=, 0
-; WASM32-FAST-MVP-NEXT:    i32.load16_u $push4=, gv16($pop3):p2align=0
+; WASM32-FAST-MVP-NEXT:    i32.const $push4=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load16_u $push3=, gv16($pop4):p2align=0
 ; WASM32-FAST-MVP-NEXT:    i32.const $push0=, 16
-; WASM32-FAST-MVP-NEXT:    i32.shl $push1=, $pop4, $pop0
+; WASM32-FAST-MVP-NEXT:    i32.shl $push1=, $pop3, $pop0
 ; WASM32-FAST-MVP-NEXT:    i32.const $push5=, 16
 ; WASM32-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
 ; WASM32-FAST-MVP-NEXT:    return $pop2
@@ -139,10 +139,10 @@ define i32 @global_sext_i16_i32() {
 ; WASM64-FAST-MVP-LABEL: global_sext_i16_i32:
 ; WASM64-FAST-MVP:         .functype global_sext_i16_i32 () -> (i32)
 ; WASM64-FAST-MVP-NEXT:  # %bb.0:
-; WASM64-FAST-MVP-NEXT:    i64.const $push3=, 0
-; WASM64-FAST-MVP-NEXT:    i32.load16_u $push4=, gv16($pop3):p2align=0
+; WASM64-FAST-MVP-NEXT:    i64.const $push4=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load16_u $push3=, gv16($pop4):p2align=0
 ; WASM64-FAST-MVP-NEXT:    i32.const $push0=, 16
-; WASM64-FAST-MVP-NEXT:    i32.shl $push1=, $pop4, $pop0
+; WASM64-FAST-MVP-NEXT:    i32.shl $push1=, $pop3, $pop0
 ; WASM64-FAST-MVP-NEXT:    i32.const $push5=, 16
 ; WASM64-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
 ; WASM64-FAST-MVP-NEXT:    return $pop2
@@ -169,19 +169,19 @@ define i64 @global_sext_i8_i64() {
 ; WASM32-FAST-LABEL: global_sext_i8_i64:
 ; WASM32-FAST:         .functype global_sext_i8_i64 () -> (i64)
 ; WASM32-FAST-NEXT:  # %bb.0:
-; WASM32-FAST-NEXT:    i32.const $push2=, 0
-; WASM32-FAST-NEXT:    i32.load8_u $push3=, gv8($pop2)
-; WASM32-FAST-NEXT:    i64.extend_i32_u $push0=, $pop3
+; WASM32-FAST-NEXT:    i32.const $push3=, 0
+; WASM32-FAST-NEXT:    i32.load8_u $push2=, gv8($pop3)
+; WASM32-FAST-NEXT:    i64.extend_i32_u $push0=, $pop2
 ; WASM32-FAST-NEXT:    i64.extend8_s $push1=, $pop0
 ; WASM32-FAST-NEXT:    return $pop1
 ;
 ; WASM32-FAST-MVP-LABEL: global_sext_i8_i64:
 ; WASM32-FAST-MVP:         .functype global_sext_i8_i64 () -> (i64)
 ; WASM32-FAST-MVP-NEXT:  # %bb.0:
-; WASM32-FAST-MVP-NEXT:    i32.const $push4=, 0
-; WASM32-FAST-MVP-NEXT:    i32.load8_u $push5=, gv8($pop4)
+; WASM32-FAST-MVP-NEXT:    i32.const $push5=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load8_u $push4=, gv8($pop5)
 ; WASM32-FAST-MVP-NEXT:    i32.const $push1=, 24
-; WASM32-FAST-MVP-NEXT:    i32.shl $push2=, $pop5, $pop1
+; WASM32-FAST-MVP-NEXT:    i32.shl $push2=, $pop4, $pop1
 ; WASM32-FAST-MVP-NEXT:    i32.const $push6=, 24
 ; WASM32-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
 ; WASM32-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3
@@ -204,19 +204,19 @@ define i64 @global_sext_i8_i64() {
 ; WASM64-FAST-LABEL: global_sext_i8_i64:
 ; WASM64-FAST:         .functype global_sext_i8_i64 () -> (i64)
 ; WASM64-FAST-NEXT:  # %bb.0:
-; WASM64-FAST-NEXT:    i64.const $push2=, 0
-; WASM64-FAST-NEXT:    i32.load8_u $push3=, gv8($pop2)
-; WASM64-FAST-NEXT:    i64.extend_i32_u $push0=, $pop3
+; WASM64-FAST-NEXT:    i64.const $push3=, 0
+; WASM64-FAST-NEXT:    i32.load8_u $push2=, gv8($pop3)
+; WASM64-FAST-NEXT:    i64.extend_i32_u $push0=, $pop2
 ; WASM64-FAST-NEXT:    i64.extend8_s $push1=, $pop0
 ; WASM64-FAST-NEXT:    return $pop1
 ;
 ; WASM64-FAST-MVP-LABEL: global_sext_i8_i64:
 ; WASM64-FAST-MVP:         .functype global_sext_i8_i64 () -> (i64)
 ; WASM64-FAST-MVP-NEXT:  # %bb.0:
-; WASM64-FAST-MVP-NEXT:    i64.const $push4=, 0
-; WASM64-FAST-MVP-NEXT:    i32.load8_u $push5=, gv8($pop4)
+; WASM64-FAST-MVP-NEXT:    i64.const $push5=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load8_u $push4=, gv8($pop5)
 ; WASM64-FAST-MVP-NEXT:    i32.const $push1=, 24
-; WASM64-FAST-MVP-NEXT:    i32.shl $push2=, $pop5, $pop1
+; WASM64-FAST-MVP-NEXT:    i32.shl $push2=, $pop4, $pop1
 ; WASM64-FAST-MVP-NEXT:    i32.const $push6=, 24
 ; WASM64-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
 ; WASM64-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3
@@ -244,19 +244,19 @@ define i64 @global_sext_i16_i64() {
 ; WASM32-FAST-LABEL: global_sext_i16_i64:
 ; WASM32-FAST:         .functype global_sext_i16_i64 () -> (i64)
 ; WASM32-FAST-NEXT:  # %bb.0:
-; WASM32-FAST-NEXT:    i32.const $push2=, 0
-; WASM32-FAST-NEXT:    i32.load16_u $push3=, gv16($pop2):p2align=0
-; WASM32-FAST-NEXT:    i64.extend_i32_u $push0=, $pop3
+; WASM32-FAST-NEXT:    i32.const $push3=, 0
+; WASM32-FAST-NEXT:    i32.load16_u $push2=, gv16($pop3):p2align=0
+; WASM32-FAST-NEXT:    i64.extend_i32_u $push0=, $pop2
 ; WASM32-FAST-NEXT:    i64.extend16_s $push1=, $pop0
 ; WASM32-FAST-NEXT:    return $pop1
 ;
 ; WASM32-FAST-MVP-LABEL: global_sext_i16_i64:
 ; WASM32-FAST-MVP:         .functype global_sext_i16_i64 () -> (i64)
 ; WASM32-FAST-MVP-NEXT:  # %bb.0:
-; WASM32-FAST-MVP-NEXT:    i32.const $push4=, 0
-; WASM32-FAST-MVP-NEXT:    i32.load16_u $push5=, gv16($pop4):p2align=0
+; WASM32-FAST-MVP-NEXT:    i32.const $push5=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load16_u $push4=, gv16($pop5):p2align=0
 ; WASM32-FAST-MVP-NEXT:    i32.const $push1=, 16
-; WASM32-FAST-MVP-NEXT:    i32.shl $push2=, $pop5, $pop1
+; WASM32-FAST-MVP-NEXT:    i32.shl $push2=, $pop4, $pop1
 ; WASM32-FAST-MVP-NEXT:    i32.const $push6=, 16
 ; WASM32-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
 ; WASM32-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3
@@ -279,19 +279,19 @@ define i64 @global_sext_i16_i64() {
 ; WASM64-FAST-LABEL: global_sext_i16_i64:
 ; WASM64-FAST:         .functype global_sext_i16_i64 () -> (i64)
 ; WASM64-FAST-NEXT:  # %bb.0:
-; WASM64-FAST-NEXT:    i64.const $push2=, 0
-; WASM64-FAST-NEXT:    i32.load16_u $push3=, gv16($pop2):p2align=0
-; WASM64-FAST-NEXT:    i64.extend_i32_u $push0=, $pop3
+; WASM64-FAST-NEXT:    i64.const $push3=, 0
+; WASM64-FAST-NEXT:    i32.load16_u $push2=, gv16($pop3):p2align=0
+; WASM64-FAST-NEXT:    i64.extend_i32_u $push0=, $pop2
 ; WASM64-FAST-NEXT:    i64.extend16_s $push1=, $pop0
 ; WASM64-FAST-NEXT:    return $pop1
 ;
 ; WASM64-FAST-MVP-LABEL: global_sext_i16_i64:
 ; WASM64-FAST-MVP:         .functype global_sext_i16_i64 () -> (i64)
 ; WASM64-FAST-MVP-NEXT:  # %bb.0:
-; WASM64-FAST-MVP-NEXT:    i64.const $push4=, 0
-; WASM64-FAST-MVP-NEXT:    i32.load16_u $push5=, gv16($pop4):p2align=0
+; WASM64-FAST-MVP-NEXT:    i64.const $push5=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load16_u $push4=, gv16($pop5):p2align=0
 ; WASM64-FAST-MVP-NEXT:    i32.const $push1=, 16
-; WASM64-FAST-MVP-NEXT:    i32.shl $push2=, $pop5, $pop1
+; WASM64-FAST-MVP-NEXT:    i32.shl $push2=, $pop4, $pop1
 ; WASM64-FAST-MVP-NEXT:    i32.const $push6=, 16
 ; WASM64-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
 ; WASM64-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3

>From f4f74b8438353a75f5aaf18e36964c2078a666ff Mon Sep 17 00:00:00 2001
From: Hanbum Park <kese111 at gmail.com>
Date: Tue, 3 Mar 2026 13:19:53 +0900
Subject: [PATCH 3/3] Updated test cases

to use variable capturing instead of hardcoded register numbers
accommodating the virtual register emission order changes caused
by the refactoring.
---
 llvm/test/CodeGen/WebAssembly/load-ext.ll | 160 +++++++++++-----------
 1 file changed, 80 insertions(+), 80 deletions(-)

diff --git a/llvm/test/CodeGen/WebAssembly/load-ext.ll b/llvm/test/CodeGen/WebAssembly/load-ext.ll
index 1d54ef5be2b7a..3d938847e5c96 100644
--- a/llvm/test/CodeGen/WebAssembly/load-ext.ll
+++ b/llvm/test/CodeGen/WebAssembly/load-ext.ll
@@ -38,13 +38,13 @@ define i32 @global_sext_i8_i32() {
 ; WASM32-FAST-MVP-LABEL: global_sext_i8_i32:
 ; WASM32-FAST-MVP:         .functype global_sext_i8_i32 () -> (i32)
 ; WASM32-FAST-MVP-NEXT:  # %bb.0:
-; WASM32-FAST-MVP-NEXT:    i32.const $push4=, 0
-; WASM32-FAST-MVP-NEXT:    i32.load8_u $push3=, gv8($pop4)
-; WASM32-FAST-MVP-NEXT:    i32.const $push0=, 24
-; WASM32-FAST-MVP-NEXT:    i32.shl $push1=, $pop3, $pop0
-; WASM32-FAST-MVP-NEXT:    i32.const $push5=, 24
-; WASM32-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
-; WASM32-FAST-MVP-NEXT:    return $pop2
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P0:[0-9]+]]=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load8_u $push[[P1:[0-9]+]]=, gv8($pop[[P0]])
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P2:[0-9]+]]=, 24
+; WASM32-FAST-MVP-NEXT:    i32.shl $push[[P3:[0-9]+]]=, $pop[[P1]], $pop[[P2]]
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P4:[0-9]+]]=, 24
+; WASM32-FAST-MVP-NEXT:    i32.shr_s $push[[P5:[0-9]+]]=, $pop[[P3]], $pop[[P4]]
+; WASM32-FAST-MVP-NEXT:    return $pop[[P5]]
 ;
 ; WASM64-DAG-LABEL: global_sext_i8_i32:
 ; WASM64-DAG:         .functype global_sext_i8_i32 () -> (i32)
@@ -70,13 +70,13 @@ define i32 @global_sext_i8_i32() {
 ; WASM64-FAST-MVP-LABEL: global_sext_i8_i32:
 ; WASM64-FAST-MVP:         .functype global_sext_i8_i32 () -> (i32)
 ; WASM64-FAST-MVP-NEXT:  # %bb.0:
-; WASM64-FAST-MVP-NEXT:    i64.const $push4=, 0
-; WASM64-FAST-MVP-NEXT:    i32.load8_u $push3=, gv8($pop4)
-; WASM64-FAST-MVP-NEXT:    i32.const $push0=, 24
-; WASM64-FAST-MVP-NEXT:    i32.shl $push1=, $pop3, $pop0
-; WASM64-FAST-MVP-NEXT:    i32.const $push5=, 24
-; WASM64-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
-; WASM64-FAST-MVP-NEXT:    return $pop2
+; WASM64-FAST-MVP-NEXT:    i64.const $push[[P0:[0-9]+]]=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load8_u $push[[P1:[0-9]+]]=, gv8($pop[[P0]])
+; WASM64-FAST-MVP-NEXT:    i32.const $push[[P2:[0-9]+]]=, 24
+; WASM64-FAST-MVP-NEXT:    i32.shl $push[[P3:[0-9]+]]=, $pop[[P1]], $pop[[P2]]
+; WASM64-FAST-MVP-NEXT:    i32.const $push[[P4:[0-9]+]]=, 24
+; WASM64-FAST-MVP-NEXT:    i32.shr_s $push[[P5:[0-9]+]]=, $pop[[P3]], $pop[[P4]]
+; WASM64-FAST-MVP-NEXT:    return $pop[[P5]]
   %ld = load i8, ptr @gv8, align 1
   %conv = sext i8 %ld to i32
   ret i32 %conv
@@ -107,13 +107,13 @@ define i32 @global_sext_i16_i32() {
 ; WASM32-FAST-MVP-LABEL: global_sext_i16_i32:
 ; WASM32-FAST-MVP:         .functype global_sext_i16_i32 () -> (i32)
 ; WASM32-FAST-MVP-NEXT:  # %bb.0:
-; WASM32-FAST-MVP-NEXT:    i32.const $push4=, 0
-; WASM32-FAST-MVP-NEXT:    i32.load16_u $push3=, gv16($pop4):p2align=0
-; WASM32-FAST-MVP-NEXT:    i32.const $push0=, 16
-; WASM32-FAST-MVP-NEXT:    i32.shl $push1=, $pop3, $pop0
-; WASM32-FAST-MVP-NEXT:    i32.const $push5=, 16
-; WASM32-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
-; WASM32-FAST-MVP-NEXT:    return $pop2
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P0:[0-9]+]]=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load16_u $push[[P1:[0-9]+]]=, gv16($pop[[P0]]):p2align=0
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P2:[0-9]+]]=, 16
+; WASM32-FAST-MVP-NEXT:    i32.shl $push[[P3:[0-9]+]]=, $pop[[P1]], $pop[[P2]]
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P4:[0-9]+]]=, 16
+; WASM32-FAST-MVP-NEXT:    i32.shr_s $push[[P5:[0-9]+]]=, $pop[[P3]], $pop[[P4]]
+; WASM32-FAST-MVP-NEXT:    return $pop[[P5]]
 ;
 ; WASM64-DAG-LABEL: global_sext_i16_i32:
 ; WASM64-DAG:         .functype global_sext_i16_i32 () -> (i32)
@@ -139,13 +139,13 @@ define i32 @global_sext_i16_i32() {
 ; WASM64-FAST-MVP-LABEL: global_sext_i16_i32:
 ; WASM64-FAST-MVP:         .functype global_sext_i16_i32 () -> (i32)
 ; WASM64-FAST-MVP-NEXT:  # %bb.0:
-; WASM64-FAST-MVP-NEXT:    i64.const $push4=, 0
-; WASM64-FAST-MVP-NEXT:    i32.load16_u $push3=, gv16($pop4):p2align=0
-; WASM64-FAST-MVP-NEXT:    i32.const $push0=, 16
-; WASM64-FAST-MVP-NEXT:    i32.shl $push1=, $pop3, $pop0
-; WASM64-FAST-MVP-NEXT:    i32.const $push5=, 16
-; WASM64-FAST-MVP-NEXT:    i32.shr_s $push2=, $pop1, $pop5
-; WASM64-FAST-MVP-NEXT:    return $pop2
+; WASM64-FAST-MVP-NEXT:    i64.const $push[[P0:[0-9]+]]=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load16_u $push[[P1:[0-9]+]]=, gv16($pop[[P0]]):p2align=0
+; WASM64-FAST-MVP-NEXT:    i32.const $push[[P2:[0-9]+]]=, 16
+; WASM64-FAST-MVP-NEXT:    i32.shl $push[[P3:[0-9]+]]=, $pop[[P1]], $pop[[P2]]
+; WASM64-FAST-MVP-NEXT:    i32.const $push[[P4:[0-9]+]]=, 16
+; WASM64-FAST-MVP-NEXT:    i32.shr_s $push[[P5:[0-9]+]]=, $pop[[P3]], $pop[[P4]]
+; WASM64-FAST-MVP-NEXT:    return $pop[[P5]]
   %ld = load i16, ptr @gv16, align 1
   %conv = sext i16 %ld to i32
   ret i32 %conv
@@ -169,23 +169,23 @@ define i64 @global_sext_i8_i64() {
 ; WASM32-FAST-LABEL: global_sext_i8_i64:
 ; WASM32-FAST:         .functype global_sext_i8_i64 () -> (i64)
 ; WASM32-FAST-NEXT:  # %bb.0:
-; WASM32-FAST-NEXT:    i32.const $push3=, 0
-; WASM32-FAST-NEXT:    i32.load8_u $push2=, gv8($pop3)
-; WASM32-FAST-NEXT:    i64.extend_i32_u $push0=, $pop2
-; WASM32-FAST-NEXT:    i64.extend8_s $push1=, $pop0
-; WASM32-FAST-NEXT:    return $pop1
+; WASM32-FAST-NEXT:    i32.const $push[[P0:[0-9]+]]=, 0
+; WASM32-FAST-NEXT:    i32.load8_u $push[[P1:[0-9]+]]=, gv8($pop[[P0]])
+; WASM32-FAST-NEXT:    i64.extend_i32_u $push[[P2:[0-9]+]]=, $pop[[P1]]
+; WASM32-FAST-NEXT:    i64.extend8_s $push[[P3:[0-9]+]]=, $pop[[P2]]
+; WASM32-FAST-NEXT:    return $pop[[P3]]
 ;
 ; WASM32-FAST-MVP-LABEL: global_sext_i8_i64:
 ; WASM32-FAST-MVP:         .functype global_sext_i8_i64 () -> (i64)
 ; WASM32-FAST-MVP-NEXT:  # %bb.0:
-; WASM32-FAST-MVP-NEXT:    i32.const $push5=, 0
-; WASM32-FAST-MVP-NEXT:    i32.load8_u $push4=, gv8($pop5)
-; WASM32-FAST-MVP-NEXT:    i32.const $push1=, 24
-; WASM32-FAST-MVP-NEXT:    i32.shl $push2=, $pop4, $pop1
-; WASM32-FAST-MVP-NEXT:    i32.const $push6=, 24
-; WASM32-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
-; WASM32-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3
-; WASM32-FAST-MVP-NEXT:    return $pop0
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P0:[0-9]+]]=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load8_u $push[[P1:[0-9]+]]=, gv8($pop[[P0]])
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P2:[0-9]+]]=, 24
+; WASM32-FAST-MVP-NEXT:    i32.shl $push[[P3:[0-9]+]]=, $pop[[P1]], $pop[[P2]]
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P4:[0-9]+]]=, 24
+; WASM32-FAST-MVP-NEXT:    i32.shr_s $push[[P5:[0-9]+]]=, $pop[[P3]], $pop[[P4]]
+; WASM32-FAST-MVP-NEXT:    i64.extend_i32_s $push[[P6:[0-9]+]]=, $pop[[P5]]
+; WASM32-FAST-MVP-NEXT:    return $pop[[P6]]
 ;
 ; WASM64-DAG-LABEL: global_sext_i8_i64:
 ; WASM64-DAG:         .functype global_sext_i8_i64 () -> (i64)
@@ -204,23 +204,23 @@ define i64 @global_sext_i8_i64() {
 ; WASM64-FAST-LABEL: global_sext_i8_i64:
 ; WASM64-FAST:         .functype global_sext_i8_i64 () -> (i64)
 ; WASM64-FAST-NEXT:  # %bb.0:
-; WASM64-FAST-NEXT:    i64.const $push3=, 0
-; WASM64-FAST-NEXT:    i32.load8_u $push2=, gv8($pop3)
-; WASM64-FAST-NEXT:    i64.extend_i32_u $push0=, $pop2
-; WASM64-FAST-NEXT:    i64.extend8_s $push1=, $pop0
-; WASM64-FAST-NEXT:    return $pop1
+; WASM64-FAST-NEXT:    i64.const $push[[P0:[0-9]+]]=, 0
+; WASM64-FAST-NEXT:    i32.load8_u $push[[P1:[0-9]+]]=, gv8($pop[[P0]])
+; WASM64-FAST-NEXT:    i64.extend_i32_u $push[[P2:[0-9]+]]=, $pop[[P1]]
+; WASM64-FAST-NEXT:    i64.extend8_s $push[[P3:[0-9]+]]=, $pop[[P2]]
+; WASM64-FAST-NEXT:    return $pop[[P3]]
 ;
 ; WASM64-FAST-MVP-LABEL: global_sext_i8_i64:
 ; WASM64-FAST-MVP:         .functype global_sext_i8_i64 () -> (i64)
 ; WASM64-FAST-MVP-NEXT:  # %bb.0:
-; WASM64-FAST-MVP-NEXT:    i64.const $push5=, 0
-; WASM64-FAST-MVP-NEXT:    i32.load8_u $push4=, gv8($pop5)
-; WASM64-FAST-MVP-NEXT:    i32.const $push1=, 24
-; WASM64-FAST-MVP-NEXT:    i32.shl $push2=, $pop4, $pop1
-; WASM64-FAST-MVP-NEXT:    i32.const $push6=, 24
-; WASM64-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
-; WASM64-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3
-; WASM64-FAST-MVP-NEXT:    return $pop0
+; WASM64-FAST-MVP-NEXT:    i64.const $push[[P0:[0-9]+]]=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load8_u $push[[P1:[0-9]+]]=, gv8($pop[[P0]])
+; WASM64-FAST-MVP-NEXT:    i32.const $push[[P2:[0-9]+]]=, 24
+; WASM64-FAST-MVP-NEXT:    i32.shl $push[[P3:[0-9]+]]=, $pop[[P1]], $pop[[P2]]
+; WASM64-FAST-MVP-NEXT:    i32.const $push[[P4:[0-9]+]]=, 24
+; WASM64-FAST-MVP-NEXT:    i32.shr_s $push[[P5:[0-9]+]]=, $pop[[P3]], $pop[[P4]]
+; WASM64-FAST-MVP-NEXT:    i64.extend_i32_s $push[[P6:[0-9]+]]=, $pop[[P5]]
+; WASM64-FAST-MVP-NEXT:    return $pop[[P6]]
   %ld = load i8, ptr @gv8, align 1
   %conv = sext i8 %ld to i64
   ret i64 %conv
@@ -244,23 +244,23 @@ define i64 @global_sext_i16_i64() {
 ; WASM32-FAST-LABEL: global_sext_i16_i64:
 ; WASM32-FAST:         .functype global_sext_i16_i64 () -> (i64)
 ; WASM32-FAST-NEXT:  # %bb.0:
-; WASM32-FAST-NEXT:    i32.const $push3=, 0
-; WASM32-FAST-NEXT:    i32.load16_u $push2=, gv16($pop3):p2align=0
-; WASM32-FAST-NEXT:    i64.extend_i32_u $push0=, $pop2
-; WASM32-FAST-NEXT:    i64.extend16_s $push1=, $pop0
-; WASM32-FAST-NEXT:    return $pop1
+; WASM32-FAST-NEXT:    i32.const $push[[P0:[0-9]+]]=, 0
+; WASM32-FAST-NEXT:    i32.load16_u $push[[P1:[0-9]+]]=, gv16($pop[[P0]]):p2align=0
+; WASM32-FAST-NEXT:    i64.extend_i32_u $push[[P2:[0-9]+]]=, $pop[[P1]]
+; WASM32-FAST-NEXT:    i64.extend16_s $push[[P3:[0-9]+]]=, $pop[[P2]]
+; WASM32-FAST-NEXT:    return $pop[[P3]]
 ;
 ; WASM32-FAST-MVP-LABEL: global_sext_i16_i64:
 ; WASM32-FAST-MVP:         .functype global_sext_i16_i64 () -> (i64)
 ; WASM32-FAST-MVP-NEXT:  # %bb.0:
-; WASM32-FAST-MVP-NEXT:    i32.const $push5=, 0
-; WASM32-FAST-MVP-NEXT:    i32.load16_u $push4=, gv16($pop5):p2align=0
-; WASM32-FAST-MVP-NEXT:    i32.const $push1=, 16
-; WASM32-FAST-MVP-NEXT:    i32.shl $push2=, $pop4, $pop1
-; WASM32-FAST-MVP-NEXT:    i32.const $push6=, 16
-; WASM32-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
-; WASM32-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3
-; WASM32-FAST-MVP-NEXT:    return $pop0
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P0:[0-9]+]]=, 0
+; WASM32-FAST-MVP-NEXT:    i32.load16_u $push[[P1:[0-9]+]]=, gv16($pop[[P0]]):p2align=0
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P2:[0-9]+]]=, 16
+; WASM32-FAST-MVP-NEXT:    i32.shl $push[[P3:[0-9]+]]=, $pop[[P1]], $pop[[P2]]
+; WASM32-FAST-MVP-NEXT:    i32.const $push[[P4:[0-9]+]]=, 16
+; WASM32-FAST-MVP-NEXT:    i32.shr_s $push[[P5:[0-9]+]]=, $pop[[P3]], $pop[[P4]]
+; WASM32-FAST-MVP-NEXT:    i64.extend_i32_s $push[[P6:[0-9]+]]=, $pop[[P5]]
+; WASM32-FAST-MVP-NEXT:    return $pop[[P6]]
 ;
 ; WASM64-DAG-LABEL: global_sext_i16_i64:
 ; WASM64-DAG:         .functype global_sext_i16_i64 () -> (i64)
@@ -279,23 +279,23 @@ define i64 @global_sext_i16_i64() {
 ; WASM64-FAST-LABEL: global_sext_i16_i64:
 ; WASM64-FAST:         .functype global_sext_i16_i64 () -> (i64)
 ; WASM64-FAST-NEXT:  # %bb.0:
-; WASM64-FAST-NEXT:    i64.const $push3=, 0
-; WASM64-FAST-NEXT:    i32.load16_u $push2=, gv16($pop3):p2align=0
-; WASM64-FAST-NEXT:    i64.extend_i32_u $push0=, $pop2
-; WASM64-FAST-NEXT:    i64.extend16_s $push1=, $pop0
-; WASM64-FAST-NEXT:    return $pop1
+; WASM64-FAST-NEXT:    i64.const $push[[P0:[0-9]+]]=, 0
+; WASM64-FAST-NEXT:    i32.load16_u $push[[P1:[0-9]+]]=, gv16($pop[[P0]]):p2align=0
+; WASM64-FAST-NEXT:    i64.extend_i32_u $push[[P2:[0-9]+]]=, $pop[[P1]]
+; WASM64-FAST-NEXT:    i64.extend16_s $push[[P3:[0-9]+]]=, $pop[[P2]]
+; WASM64-FAST-NEXT:    return $pop[[P3]]
 ;
 ; WASM64-FAST-MVP-LABEL: global_sext_i16_i64:
 ; WASM64-FAST-MVP:         .functype global_sext_i16_i64 () -> (i64)
 ; WASM64-FAST-MVP-NEXT:  # %bb.0:
-; WASM64-FAST-MVP-NEXT:    i64.const $push5=, 0
-; WASM64-FAST-MVP-NEXT:    i32.load16_u $push4=, gv16($pop5):p2align=0
-; WASM64-FAST-MVP-NEXT:    i32.const $push1=, 16
-; WASM64-FAST-MVP-NEXT:    i32.shl $push2=, $pop4, $pop1
-; WASM64-FAST-MVP-NEXT:    i32.const $push6=, 16
-; WASM64-FAST-MVP-NEXT:    i32.shr_s $push3=, $pop2, $pop6
-; WASM64-FAST-MVP-NEXT:    i64.extend_i32_s $push0=, $pop3
-; WASM64-FAST-MVP-NEXT:    return $pop0
+; WASM64-FAST-MVP-NEXT:    i64.const $push[[P0:[0-9]+]]=, 0
+; WASM64-FAST-MVP-NEXT:    i32.load16_u $push[[P1:[0-9]+]]=, gv16($pop[[P0]]):p2align=0
+; WASM64-FAST-MVP-NEXT:    i32.const $push[[P2:[0-9]+]]=, 16
+; WASM64-FAST-MVP-NEXT:    i32.shl $push[[P3:[0-9]+]]=, $pop[[P1]], $pop[[P2]]
+; WASM64-FAST-MVP-NEXT:    i32.const $push[[P4:[0-9]+]]=, 16
+; WASM64-FAST-MVP-NEXT:    i32.shr_s $push[[P5:[0-9]+]]=, $pop[[P3]], $pop[[P4]]
+; WASM64-FAST-MVP-NEXT:    i64.extend_i32_s $push[[P6:[0-9]+]]=, $pop[[P5]]
+; WASM64-FAST-MVP-NEXT:    return $pop[[P6]]
   %ld= load i16, ptr @gv16, align 1
   %conv = sext i16 %ld to i64
   ret i64 %conv



More information about the llvm-commits mailing list