[llvm] r335074 - [WebAssembly] Fix liveness tracking info after drop insertion

Heejin Ahn via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 19 13:30:43 PDT 2018


Author: aheejin
Date: Tue Jun 19 13:30:42 2018
New Revision: 335074

URL: http://llvm.org/viewvc/llvm-project?rev=335074&view=rev
Log:
[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

Added:
    llvm/trunk/test/CodeGen/WebAssembly/explicit-locals.mir
Modified:
    llvm/trunk/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp

Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp?rev=335074&r1=335073&r2=335074&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp (original)
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp Tue Jun 19 13:30:42 2018
@@ -284,8 +284,11 @@ bool WebAssemblyExplicitLocals::runOnMac
           }
           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::runOnMac
                 .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;
         }

Added: llvm/trunk/test/CodeGen/WebAssembly/explicit-locals.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/explicit-locals.mir?rev=335074&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/WebAssembly/explicit-locals.mir (added)
+++ llvm/trunk/test/CodeGen/WebAssembly/explicit-locals.mir Tue Jun 19 13:30:42 2018
@@ -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
+...




More information about the llvm-commits mailing list