Fix a CPSR liveness tracking bug introduced when I converted IT block to bundle.

llvm-svn: 146805
This commit is contained in:
Evan Cheng 2011-12-17 01:25:34 +00:00
parent 0adfe7aa2f
commit 903231bc58
2 changed files with 35 additions and 4 deletions

View File

@ -880,14 +880,17 @@ bool Thumb2SizeReduce::ReduceMBB(MachineBasicBlock &MBB) {
}
ProcessNext:
if (LiveCPSR &&
NextMII != E && MI->isInsideBundle() && !NextMII->isInsideBundle() &&
BundleMI->killsRegister(ARM::CPSR))
if (NextMII != E && MI->isInsideBundle() && !NextMII->isInsideBundle()) {
// FIXME: Since post-ra scheduler operates on bundles, the CPSR kill
// marker is only on the BUNDLE instruction. Process the BUNDLE
// instruction as we finish with the bundled instruction to work around
// the inconsistency.
LiveCPSR = false;
if (BundleMI->killsRegister(ARM::CPSR))
LiveCPSR = false;
MachineOperand *MO = BundleMI->findRegisterDefOperand(ARM::CPSR);
if (MO && !MO->isDead())
LiveCPSR = true;
}
bool DefCPSR = false;
LiveCPSR = UpdateCPSRDef(*MI, LiveCPSR, DefCPSR);

View File

@ -0,0 +1,28 @@
; RUN: llc < %s -mtriple=thumbv7-apple-ios -relocation-model=pic -disable-fp-elim -mcpu=cortex-a8
%struct.LIST_NODE.0.16 = type { %struct.LIST_NODE.0.16*, i8* }
define %struct.LIST_NODE.0.16* @list_AssocListPair(%struct.LIST_NODE.0.16* %List, i8* %Key) nounwind readonly {
entry:
br label %bb3
bb: ; preds = %bb3
%Scan.0.idx7.val = load i8** undef, align 4
%.idx = getelementptr i8* %Scan.0.idx7.val, i32 4
%0 = bitcast i8* %.idx to i8**
%.idx.val = load i8** %0, align 4
%1 = icmp eq i8* %.idx.val, %Key
br i1 %1, label %bb5, label %bb2
bb2: ; preds = %bb
%Scan.0.idx8.val = load %struct.LIST_NODE.0.16** undef, align 4
br label %bb3
bb3: ; preds = %bb2, %entry
%Scan.0 = phi %struct.LIST_NODE.0.16* [ %List, %entry ], [ %Scan.0.idx8.val, %bb2 ]
%2 = icmp eq %struct.LIST_NODE.0.16* %Scan.0, null
br i1 %2, label %bb5, label %bb
bb5: ; preds = %bb3, %bb
ret %struct.LIST_NODE.0.16* null
}