From 2e13be68916a123dce9ea300cd66e63dac8c86b0 Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Fri, 29 Aug 2025 21:02:11 +0000 Subject: [PATCH 1/2] [WebAssembly] Guard use of getSymbolName with isSymbol WebAssemblyRegStackfy checks for writes to the stack pointer to avoid stackifying across them, but it wasn't prepared for other global_set instructions (such as writes in addrspace 1). Fixes #156055 --- .../Target/WebAssembly/WebAssemblyRegStackify.cpp | 3 ++- llvm/test/CodeGen/WebAssembly/global-set.ll | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp index bc91c6424b63e..08ca20b5eef6e 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp @@ -247,7 +247,8 @@ static void query(const MachineInstr &MI, bool &Read, bool &Write, // Check for writes to __stack_pointer global. if ((MI.getOpcode() == WebAssembly::GLOBAL_SET_I32 || MI.getOpcode() == WebAssembly::GLOBAL_SET_I64) && - strcmp(MI.getOperand(0).getSymbolName(), "__stack_pointer") == 0) + MI.getOperand(0).isSymbol() && + !strcmp(MI.getOperand(0).getSymbolName(), "__stack_pointer")) StackPointer = true; // Analyze calls. diff --git a/llvm/test/CodeGen/WebAssembly/global-set.ll b/llvm/test/CodeGen/WebAssembly/global-set.ll index 7db374528fe9b..f76006c2863b2 100644 --- a/llvm/test/CodeGen/WebAssembly/global-set.ll +++ b/llvm/test/CodeGen/WebAssembly/global-set.ll @@ -45,6 +45,21 @@ define void @set_f64_global(double %v) { ret void } +declare i32 @get_i32() +define i32 @testFunc() { +; CHECK-LABEL: testFunc: +; CHECK-NEXT: .functype +; CHECK-NEXT: .local +; CHECK-NEXT: call get_i32 +; CHECK-NEXT: local.tee +; CHECK-NEXT: global.set i32_global +; CHECK-NEXT: local.get +; CHECK-NEXT: end_function + %1 = call i32 @get_i32() + store i32 %1, ptr addrspace(1) @i32_global + ret i32 %1 +} + ; CHECK: .globaltype i32_global, i32 ; CHECK: .globl i32_global ; CHECK-LABEL: i32_global: From 63c452175f1bf4fc6e2305d41755d344359ca381 Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Tue, 2 Sep 2025 20:12:39 +0000 Subject: [PATCH 2/2] improve test name, link to bug report --- llvm/test/CodeGen/WebAssembly/global-set.ll | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/llvm/test/CodeGen/WebAssembly/global-set.ll b/llvm/test/CodeGen/WebAssembly/global-set.ll index f76006c2863b2..4553957ae7588 100644 --- a/llvm/test/CodeGen/WebAssembly/global-set.ll +++ b/llvm/test/CodeGen/WebAssembly/global-set.ll @@ -46,8 +46,9 @@ define void @set_f64_global(double %v) { } declare i32 @get_i32() -define i32 @testFunc() { -; CHECK-LABEL: testFunc: +define i32 @stackifyAcrossGlobalSet() { +; https://github.com/llvm/llvm-project/issues/156055 +; CHECK-LABEL: stackifyAcrossGlobalSet: ; CHECK-NEXT: .functype ; CHECK-NEXT: .local ; CHECK-NEXT: call get_i32