[PATCH] D48253: [WebAssembly] Fix liveness tracking info after drop insertion

Heejin Ahn via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Jun 16 02:51:08 PDT 2018


aheejin created this revision.
aheejin added a reviewer: dschuff.
Herald added subscribers: llvm-commits, sunfish, jgravelle-google, sbc100.

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.


Repository:
  rL LLVM

https://reviews.llvm.org/D48253

Files:
  lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp
  test/CodeGen/WebAssembly/explicit-locals.mir


Index: test/CodeGen/WebAssembly/explicit-locals.mir
===================================================================
--- /dev/null
+++ 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
+...
Index: lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp
===================================================================
--- lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp
+++ lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp
@@ -284,16 +284,22 @@
           }
           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);
             BuildMI(MBB, InsertPt, MI.getDebugLoc(), TII->get(Opc))
                 .addImm(LocalId)
                 .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;
         }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D48253.151612.patch
Type: text/x-patch
Size: 2318 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180616/e3c408e4/attachment.bin>


More information about the llvm-commits mailing list