[llvm-commits] CVS: llvm/lib/CodeGen/BranchFolding.cpp
Dale Johannesen
dalej at apple.com
Thu May 10 16:59:41 PDT 2007
Changes in directory llvm/lib/CodeGen:
BranchFolding.cpp updated: 1.51 -> 1.52
---
Log message:
Do not generate branches to entry block. This fixes several test suite
failures on PPC (can happen only when prologue code is null)
---
Diffs of the changes: (+19 -4)
BranchFolding.cpp | 23 +++++++++++++++++++----
1 files changed, 19 insertions(+), 4 deletions(-)
Index: llvm/lib/CodeGen/BranchFolding.cpp
diff -u llvm/lib/CodeGen/BranchFolding.cpp:1.51 llvm/lib/CodeGen/BranchFolding.cpp:1.52
--- llvm/lib/CodeGen/BranchFolding.cpp:1.51 Wed May 9 20:01:49 2007
+++ llvm/lib/CodeGen/BranchFolding.cpp Thu May 10 18:59:23 2007
@@ -338,6 +338,14 @@
MachineBasicBlock::iterator MBB2I,
const TargetInstrInfo *TII,
MachineBasicBlock *PredBB) {
+ // If one block is the entry block, split the other one; we can't generate
+ // a branch to the entry block, as its label is not emitted.
+ MachineBasicBlock *Entry = MBB1->getParent()->begin();
+ if (MBB1 == Entry)
+ return false;
+ if (MBB2 == Entry)
+ return true;
+
// If one block falls through into the common successor, choose that
// one to split; it is one instruction less to do that.
if (PredBB) {
@@ -456,8 +464,14 @@
MachineBasicBlock *MBB2 = (MergePotentials.end()-2)->second;
// If neither block is the entire common tail, split the tail of one block
- // to make it redundant with the other tail.
- if (CurMBB->begin() != BBI1 && MBB2->begin() != BBI2) {
+ // to make it redundant with the other tail. Also, we cannot jump to the
+ // entry block, so if one block is the entry block, split the other one.
+ MachineBasicBlock *Entry = CurMBB->getParent()->begin();
+ if (CurMBB->begin() == BBI1 && CurMBB != Entry)
+ ; // CurMBB is common tail
+ else if (MBB2->begin() == BBI2 && MBB2 != Entry)
+ ; // MBB2 is common tail
+ else {
if (0) { // Enable this to disable partial tail merges.
MergePotentials.pop_back();
continue;
@@ -475,13 +489,14 @@
}
}
- if (MBB2->begin() == BBI2) {
+ if (MBB2->begin() == BBI2 && MBB2 != Entry) {
// Hack the end off CurMBB, making it jump to MBBI@ instead.
ReplaceTailWithBranchTo(BBI1, MBB2);
// This modifies CurMBB, so remove it from the worklist.
MergePotentials.pop_back();
} else {
- assert(CurMBB->begin() == BBI1 && "Didn't split block correctly?");
+ assert(CurMBB->begin() == BBI1 && CurMBB != Entry &&
+ "Didn't split block correctly?");
// Hack the end off MBB2, making it jump to CurMBB instead.
ReplaceTailWithBranchTo(BBI2, CurMBB);
// This modifies MBB2, so remove it from the worklist.
More information about the llvm-commits
mailing list