Unbreak ARMBaseRegisterInfo::copyRegToReg.
authorEvan Cheng <evan.cheng@apple.com>
Mon, 2 Nov 2009 04:44:55 +0000 (04:44 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Mon, 2 Nov 2009 04:44:55 +0000 (04:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85787 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMBaseInstrInfo.cpp
test/CodeGen/Thumb2/2009-11-01-CopyReg2RegBug.ll [new file with mode: 0644]

index 4cb2407aeb163b637607ba365a7de6c3ada1d85e..80961bff774ef27eefd6e435646dd8f645a80b25 100644 (file)
@@ -660,26 +660,27 @@ ARMBaseInstrInfo::copyRegToReg(MachineBasicBlock &MBB,
   } else if (DestRC == ARM::DPRRegisterClass) {
     const ARMBaseRegisterInfo* TRI = &getRegisterInfo();
 
+    // If we do not found an instruction defining the reg, this means the
+    // register should be live-in for this BB. It's always to better to use
+    // NEON reg-reg moves.
+    unsigned Domain = ARMII::DomainNEON;
+    
     // Find the Machine Instruction which defines SrcReg.
-    MachineBasicBlock::iterator J = (I == MBB.begin() ? I : prior(I));
-    while (J != MBB.begin()) {
-      if (J->modifiesRegister(SrcReg, TRI))
-        break;
-      --J;
-    }
+    if (!MBB.empty()) {
+      MachineBasicBlock::iterator J = (I == MBB.begin() ? I : prior(I));
+      while (J != MBB.begin()) {
+        if (J->modifiesRegister(SrcReg, TRI))
+          break;
+        --J;
+      }
 
-    unsigned Domain;
-    if (J->modifiesRegister(SrcReg, TRI)) {
-      Domain = J->getDesc().TSFlags & ARMII::DomainMask;
-      // Instructions in general domain are subreg accesses.
-      // Map them to NEON reg-reg moves.
-      if (Domain == ARMII::DomainGeneral)
-        Domain = ARMII::DomainNEON;
-    } else {
-      // We reached the beginning of the BB and found no instruction defining
-      // the reg. This means that register should be live-in for this BB.
-      // It's always to better to use NEON reg-reg moves.
-      Domain = ARMII::DomainNEON;
+      if (J->modifiesRegister(SrcReg, TRI)) {
+        Domain = J->getDesc().TSFlags & ARMII::DomainMask;
+        // Instructions in general domain are subreg accesses.
+        // Map them to NEON reg-reg moves.
+        if (Domain == ARMII::DomainGeneral)
+          Domain = ARMII::DomainNEON;
+      }
     }
 
     if ((Domain & ARMII::DomainNEON) && getSubtarget().hasNEON()) {
diff --git a/test/CodeGen/Thumb2/2009-11-01-CopyReg2RegBug.ll b/test/CodeGen/Thumb2/2009-11-01-CopyReg2RegBug.ll
new file mode 100644 (file)
index 0000000..216f3e3
--- /dev/null
@@ -0,0 +1,29 @@
+; RUN: llc < %s -mtriple=thumbv7-apple-darwin -relocation-model=pic -disable-fp-elim -mcpu=cortex-a8
+
+define arm_apcscc void @get_initial_mb16x16_cost() nounwind {
+entry:
+  br i1 undef, label %bb4, label %bb1
+
+bb1:                                              ; preds = %entry
+  br label %bb7
+
+bb4:                                              ; preds = %entry
+  br i1 undef, label %bb7.thread, label %bb5
+
+bb5:                                              ; preds = %bb4
+  br label %bb7
+
+bb7.thread:                                       ; preds = %bb4
+  br label %bb8
+
+bb7:                                              ; preds = %bb5, %bb1
+  br i1 undef, label %bb8, label %bb10
+
+bb8:                                              ; preds = %bb7, %bb7.thread
+  %0 = phi double [ 5.120000e+02, %bb7.thread ], [ undef, %bb7 ] ; <double> [#uses=1]
+  %1 = fdiv double %0, undef                      ; <double> [#uses=0]
+  unreachable
+
+bb10:                                             ; preds = %bb7
+  ret void
+}