[WebAssembly] Fix unbalanced register stack code in the case of late DCE.
authorDan Gohman <dan433584@gmail.com>
Mon, 25 Jan 2016 16:48:44 +0000 (16:48 +0000)
committerDan Gohman <dan433584@gmail.com>
Mon, 25 Jan 2016 16:48:44 +0000 (16:48 +0000)
Instructions can be DCE'd after the RegStackify pass. If the instruction which
would be the pop for what would be a push is removed, don't use a push.

llvm-svn: 258694

llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp
llvm/test/CodeGen/WebAssembly/cfg-stackify.ll

index 88c50a0..a76cb81 100644 (file)
@@ -92,6 +92,9 @@ bool WebAssemblyRegNumbering::runOnMachineFunction(MachineFunction &MF) {
   unsigned CurReg = MFI.getParams().size();
   for (unsigned VRegIdx = 0; VRegIdx < NumVRegs; ++VRegIdx) {
     unsigned VReg = TargetRegisterInfo::index2VirtReg(VRegIdx);
+    // Skip unused registers.
+    if (MRI.use_empty(VReg))
+      continue;
     // Handle stackified registers.
     if (MFI.isVRegStackified(VReg)) {
       DEBUG(dbgs() << "VReg " << VReg << " -> WAReg "
@@ -99,9 +102,6 @@ bool WebAssemblyRegNumbering::runOnMachineFunction(MachineFunction &MF) {
       MFI.setWAReg(VReg, INT32_MIN | NumStackRegs++);
       continue;
     }
-    // Skip unused registers.
-    if (MRI.use_empty(VReg))
-      continue;
     if (MFI.getWAReg(VReg) == WebAssemblyFunctionInfo::UnusedReg) {
       DEBUG(dbgs() << "VReg " << VReg << " -> WAReg " << CurReg << "\n");
       MFI.setWAReg(VReg, CurReg++);
index f5b4b77..a1ff4ee 100644 (file)
@@ -1176,9 +1176,9 @@ bb5:
 ; CHECK-NEXT: .LBB23_2:{{$}}
 ; CHECK-NEXT:     end_loop{{$}}
 ; CHECK-NEXT:     loop{{$}}
+; CHECK-NEXT:     i32.const   $discard=, 0{{$}}
 ; CHECK-NEXT:     i32.const   $push1=, 0{{$}}
-; CHECK-NEXT:     i32.const   $push2=, 0{{$}}
-; CHECK-NEXT:     br_if       $pop2, 0{{$}}
+; CHECK-NEXT:     br_if       $pop1, 0{{$}}
 ; CHECK-NEXT:     end_loop{{$}}
 ; CHECK-NEXT:     return{{$}}
 define void @test14() {