Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp @@ -181,19 +181,6 @@ // Check for stores. if (MI.mayStore()) { Write = true; - - // Check for stores to __stack_pointer. - for (auto MMO : MI.memoperands()) { - const MachinePointerInfo &MPI = MMO->getPointerInfo(); - if (MPI.V.is()) { - auto PSV = MPI.V.get(); - if (const ExternalSymbolPseudoSourceValue *EPSV = - dyn_cast(PSV)) - if (StringRef(EPSV->getSymbol()) == "__stack_pointer") { - StackPointer = true; - } - } - } } else if (MI.hasOrderedMemoryRef()) { switch (MI.getOpcode()) { case WebAssembly::DIV_S_I32: @@ -258,6 +245,11 @@ } } + // Check for writes to __stack_pointer global. + if (MI.getOpcode() == WebAssembly::GLOBAL_SET_I32 && + strcmp(MI.getOperand(0).getSymbolName(), "__stack_pointer") == 0) + StackPointer = true; + // Analyze calls. if (MI.isCall()) { unsigned CalleeOpNo = WebAssembly::getCalleeOpNo(MI); Index: llvm/trunk/test/CodeGen/WebAssembly/reg-stackify.ll =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/reg-stackify.ll +++ llvm/trunk/test/CodeGen/WebAssembly/reg-stackify.ll @@ -634,7 +634,7 @@ ; NOREGS-LABEL: stackpointer_dependency: ; NOREGS: call stackpointer_callee@FUNCTION ; NOREGS: global.set __stack_pointer -declare i32 @stackpointer_callee(i8* readnone, i8* readnone) +declare i32 @stackpointer_callee(i8* readnone, i8* readnone) nounwind readnone declare i8* @llvm.frameaddress(i32) define i32 @stackpointer_dependency(i8* readnone) { %2 = tail call i8* @llvm.frameaddress(i32 0)