diff options
author | Heejin Ahn <aheejin@gmail.com> | 2018-06-19 20:30:42 +0000 |
---|---|---|
committer | Heejin Ahn <aheejin@gmail.com> | 2018-06-19 20:30:42 +0000 |
commit | 891a7472667fa2e24f192f33797ecaaa0219ad0c (patch) | |
tree | c035d36411c5d2973ff42cb19658f0d37b91eec3 /llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp | |
parent | 66d984c6a51ecdc5dc1876fd16d3738983c1cb1c (diff) | |
download | llvm-891a7472667fa2e24f192f33797ecaaa0219ad0c.zip llvm-891a7472667fa2e24f192f33797ecaaa0219ad0c.tar.gz llvm-891a7472667fa2e24f192f33797ecaaa0219ad0c.tar.bz2 |
[WebAssembly] Fix liveness tracking info after drop insertion
Summary:
This fixes liveness tracking information after `drop` instruction
insertion in ExplicitLocals pass.
When a drop instruction is inserted to drop a dead register operand, the
original operand should be marked not dead anymore because it is now
used by the new drop instruction. And the operand to the new drop
instruction should be marked killed instead. This bug caused some
programs to fail when `llc` is run with `-verify-machineinstrs` option.
Reviewers: dschuff
Subscribers: sbc100, jgravelle-google, sunfish, llvm-commits
Differential Revision: https://reviews.llvm.org/D48253
llvm-svn: 335074
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp index 8639cb9..b61fb34 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp @@ -284,8 +284,11 @@ bool WebAssemblyExplicitLocals::runOnMachineFunction(MachineFunction &MF) { } if (UseEmpty[TargetRegisterInfo::virtReg2Index(OldReg)]) { unsigned Opc = getDropOpcode(RC); - BuildMI(MBB, InsertPt, MI.getDebugLoc(), TII->get(Opc)) - .addReg(NewReg); + MachineInstr *Drop = + BuildMI(MBB, InsertPt, MI.getDebugLoc(), TII->get(Opc)) + .addReg(NewReg); + // After the drop instruction, this reg operand will not be used + Drop->getOperand(0).setIsKill(); } else { unsigned LocalId = getLocalId(Reg2Local, CurLocal, OldReg); unsigned Opc = getSetLocalOpcode(RC); @@ -294,6 +297,9 @@ bool WebAssemblyExplicitLocals::runOnMachineFunction(MachineFunction &MF) { .addReg(NewReg); } MI.getOperand(0).setReg(NewReg); + // This register operand is now being used by the inserted drop + // instruction, so make it undead. + MI.getOperand(0).setIsDead(false); MFI.stackifyVReg(NewReg); Changed = true; } |