Revert "r226071 - [RegisterCoalescer] Remove copies to reserved registers"
authorHal Finkel <hfinkel@anl.gov>
Thu, 15 Jan 2015 03:08:59 +0000 (03:08 +0000)
committerHal Finkel <hfinkel@anl.gov>
Thu, 15 Jan 2015 03:08:59 +0000 (03:08 +0000)
Reverting this while I investigate some bad behavior this is causing. As a
possibly-related issue, adding -verify-machineinstrs to one of the test cases
now fails because of this change:

  llc test/CodeGen/X86/2009-02-12-DebugInfoVLA.ll -march=x86-64 -o - -verify-machineinstrs

*** Bad machine code: No instruction at def index ***
- function:    foo
- basic block: BB#0 return (0x10007e21f10) [0B;736B)
- liverange:   [128r,128d:9)[160r,160d:8)[176r,176d:7)[336r,336d:6)[464r,464d:5)[480r,480d:4)[624r,624d:3)[752r,752d:2)[768r,768d:1)[78
4r,784d:0)  0@784r 1@768r 2@752r 3@624r 4@480r 5@464r 6@336r 7@176r 8@160r 9@128r
- register:    %DS
Valno #3 is defined at 624r

*** Bad machine code: Live segment doesn't end at a valid instruction ***
- function:    foo
- basic block: BB#0 return (0x10007e21f10) [0B;736B)
- liverange:   [128r,128d:9)[160r,160d:8)[176r,176d:7)[336r,336d:6)[464r,464d:5)[480r,480d:4)[624r,624d:3)[752r,752d:2)[768r,768d:1)[78
4r,784d:0)  0@784r 1@768r 2@752r 3@624r 4@480r 5@464r 6@336r 7@176r 8@160r 9@128r
- register:    %DS
[624r,624d:3)
LLVM ERROR: Found 2 machine code errors.

where 624r corresponds exactly to the interval combining change:

624B    %RSP<def> = COPY %vreg16; GR64:%vreg16
        Considering merging %vreg16 with %RSP
                RHS = %vreg16 [608r,624r:0)  0@608r
                updated: 608B   %RSP<def> = MOV64rm <fi#3>, 1, %noreg, 0, %noreg; mem:LD8[%saved_stack.1]
        Success: %vreg16 -> %RSP
        Result = %RSP

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226086 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegisterCoalescer.cpp
test/CodeGen/ARM/dyn-stackalloc.ll
test/CodeGen/X86/2009-02-12-DebugInfoVLA.ll

index 517bc2dbe12d7565e52132415de8fc7d9a64e549..b8cae4a59ed5c6c6073bfd3d94537648e5fc0be3 100644 (file)
@@ -1209,10 +1209,10 @@ bool RegisterCoalescer::canJoinPhys(const CoalescerPair &CP) {
   }
 
   LiveInterval &JoinVInt = LIS->getInterval(CP.getSrcReg());
-  if (JoinVInt.containsOneValue())
+  if (CP.isFlipped() && JoinVInt.containsOneValue())
     return true;
 
-  DEBUG(dbgs() << "\tCannot join complex intervals into reserved register.\n");
+  DEBUG(dbgs() << "\tCannot join defs into reserved register.\n");
   return false;
 }
 
@@ -1431,7 +1431,8 @@ bool RegisterCoalescer::joinReservedPhysReg(CoalescerPair &CP) {
   LiveInterval &RHS = LIS->getInterval(CP.getSrcReg());
   DEBUG(dbgs() << "\t\tRHS = " << RHS << '\n');
 
-  assert(RHS.containsOneValue() && "Invalid join with reserved register");
+  assert(CP.isFlipped() && RHS.containsOneValue() &&
+         "Invalid join with reserved register");
 
   // Optimization for reserved registers like ESP. We can only merge with a
   // reserved physreg if RHS has a single value that is a copy of CP.DstReg().
@@ -1452,18 +1453,7 @@ bool RegisterCoalescer::joinReservedPhysReg(CoalescerPair &CP) {
   // defs are there.
 
   // Delete the identity copy.
-  MachineInstr *CopyMI;
-  if (CP.isFlipped()) {
-    CopyMI = MRI->getVRegDef(RHS.reg);
-  } else {
-    if (!MRI->hasOneNonDBGUse(RHS.reg)) {
-      DEBUG(dbgs() << "\t\tMultiple vreg uses\n");
-      return false;
-    }
-
-    CopyMI = &*MRI->use_instr_nodbg_begin(RHS.reg);
-  }
-  
+  MachineInstr *CopyMI = MRI->getVRegDef(RHS.reg);
   LIS->RemoveMachineInstrFromMaps(CopyMI);
   CopyMI->eraseFromParent();
 
index 5be826519bbc933908e758c5a1a6bd0729753e69..4ac5b8a31e5f6ac5bc760bc189feff0c4b2e5df3 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc -mcpu=generic -mtriple=arm-eabi < %s | FileCheck %s
+; RUN: llc -mtriple=arm-eabi %s -o /dev/null
 
 %struct.comment = type { i8**, i32*, i32, i8* }
 %struct.info = type { i32, i32, i32, i32, i32, i32, i32, i8* }
@@ -7,18 +7,6 @@
 @str215 = external global [2 x i8]
 
 define void @t1(%struct.state* %v) {
-
-; Make sure we generate:
-;   sub        sp, sp, r1
-; instead of:
-;   sub        r1, sp, r1
-;   mov        sp, r1
-
-; CHECK-LABEL: @t1
-; CHECK: bic [[REG1:r[0-9]+]],
-; CHECK-NOT: sub r{{[0-9]+}}, sp, [[REG1]]
-; CHECK: sub sp, sp, [[REG1]]
-
   %tmp6 = load i32* null
   %tmp8 = alloca float, i32 %tmp6
   store i32 1, i32* null
index d312fddc6ce3165d7c3eb0b50ccc2b3a66dc15dc..6c8e3b5a8fdc8d1e094115ccfc27540ca2f6b581 100644 (file)
@@ -1,19 +1,9 @@
 ; RUN: llc < %s
-; RUN: llc < %s -march=x86-64 | FileCheck %s
+; RUN: llc < %s -march=x86-64
 ; PR3538
 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
 target triple = "i386-apple-darwin9"
 define signext i8 @foo(i8* %s1) nounwind ssp {
-
-; Make sure we generate:
-;  movq        -40(%rbp), %rsp
-; Instead of:
-;  movq        -40(%rbp), %rax
-;  movq        %rax, %rsp
-
-; CHECK-LABEL: @foo
-; CHECK: movq  -40(%rbp), %rsp
-
 entry:
   %s1_addr = alloca i8*                           ; <i8**> [#uses=2]
   %retval = alloca i32                            ; <i32*> [#uses=2]