mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-20 03:23:01 +02:00
[WebAssembly] Make tied inline asm operands work again
Summary: rL341389 broke code with tied register operands in inline assembly. For example, `asm("" : "=r"(var) : "0"(var));` The code above specifies the input operand to be in the same register with the output operand, tying the two register. This patch makes this kind of code work again. Reviewers: dschuff Subscribers: sbc100, jgravelle-google, eraman, sunfish, llvm-commits Differential Revision: https://reviews.llvm.org/D51991 llvm-svn: 342084
This commit is contained in:
parent
3526e6ff08
commit
5565c40d7e
@ -316,6 +316,9 @@ bool WebAssemblyExplicitLocals::runOnMachineFunction(MachineFunction &MF) {
|
||||
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 @@ bool WebAssemblyExplicitLocals::runOnMachineFunction(MachineFunction &MF) {
|
||||
// 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;
|
||||
}
|
||||
|
@ -97,6 +97,15 @@ entry:
|
||||
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}
|
||||
|
Loading…
Reference in New Issue
Block a user