Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp @@ -316,6 +316,9 @@ if (MO.isDef()) { assert(MI.getOpcode() == TargetOpcode::INLINEASM); unsigned LocalId = getLocalId(Reg2Local, CurLocal, OldReg); + // If this register operand is tied to another operand, we can't + // change it to an immediate. Untie it first. + MI.untieRegOperand(MI.getOperandNo(&MO)); MO.ChangeToImmediate(LocalId); continue; } @@ -331,6 +334,8 @@ // indices as immediates. if (MI.getOpcode() == TargetOpcode::INLINEASM) { unsigned LocalId = getLocalId(Reg2Local, CurLocal, OldReg); + // Untie it first if this reg operand is tied to another operand. + MI.untieRegOperand(MI.getOperandNo(&MO)); MO.ChangeToImmediate(LocalId); continue; } Index: llvm/trunk/test/CodeGen/WebAssembly/inline-asm.ll =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/inline-asm.ll +++ llvm/trunk/test/CodeGen/WebAssembly/inline-asm.ll @@ -97,6 +97,15 @@ ret i32 %t0 } +; CHECK-LABEL: tied_operands +; CHECK: get_local $push0=, 0 +; CHECK: return $pop0 +define i32 @tied_operands(i32 %var) { +entry: + %ret = call i32 asm "", "=r,0"(i32 %var) + ret i32 %ret +} + attributes #0 = { nounwind } !0 = !{i32 47}