summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeejin Ahn <aheejin@gmail.com>2018-06-19 20:30:42 +0000
committerHeejin Ahn <aheejin@gmail.com>2018-06-19 20:30:42 +0000
commit891a7472667fa2e24f192f33797ecaaa0219ad0c (patch)
treec035d36411c5d2973ff42cb19658f0d37b91eec3
parent66d984c6a51ecdc5dc1876fd16d3738983c1cb1c (diff)
downloadbcm5719-llvm-891a7472667fa2e24f192f33797ecaaa0219ad0c.tar.gz
bcm5719-llvm-891a7472667fa2e24f192f33797ecaaa0219ad0c.zip
[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
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp10
-rw-r--r--llvm/test/CodeGen/WebAssembly/explicit-locals.mir23
2 files changed, 31 insertions, 2 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp
index 8639cb9fc86..b61fb340acd 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;
}
diff --git a/llvm/test/CodeGen/WebAssembly/explicit-locals.mir b/llvm/test/CodeGen/WebAssembly/explicit-locals.mir
new file mode 100644
index 00000000000..255802bf22d
--- /dev/null
+++ b/llvm/test/CodeGen/WebAssembly/explicit-locals.mir
@@ -0,0 +1,23 @@
+# RUN: llc -mtriple=wasm32-unknown-unknown -run-pass wasm-explicit-locals %s -o - | FileCheck %s
+
+# 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.
+---
+name: drop_test
+liveins:
+ - { reg: '$arguments' }
+tracksRegLiveness: true
+body: |
+ bb.0:
+ successors: %bb.1
+ liveins: $arguments
+
+ bb.1:
+ ; predecessors: %bb.0
+ ; CHECK-NOT: dead %{{[0-9]+}}
+ ; CHECK: DROP_I32 killed %{{[0-9]+}}
+ dead %0:i32 = CONST_I32 0, implicit-def dead $arguments, implicit $sp32, implicit $sp64
+ RETURN_VOID implicit-def dead $arguments
+...
OpenPOWER on IntegriCloud