mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-22 10:29:35 +00:00
Reenable tail duplication of bb with just an unconditional jump, but
don't remove blocks that have their address taken. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@133659 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
aa0a8f3177
commit
d6379a993c
@ -207,7 +207,7 @@ bool TailDuplicatePass::TailDuplicateBlocks(MachineFunction &MF) {
|
||||
// TailBB's immediate successors are now successors of those predecessors
|
||||
// which duplicated TailBB. Add the predecessors as sources to the PHI
|
||||
// instructions.
|
||||
bool isDead = MBB->pred_empty();
|
||||
bool isDead = MBB->pred_empty() && !MBB->hasAddressTaken();
|
||||
if (PreRegAlloc)
|
||||
UpdateSuccessorsPHIs(MBB, isDead, TDBBs, Succs);
|
||||
|
||||
@ -568,9 +568,9 @@ bool
|
||||
TailDuplicatePass::isSimpleBB(MachineBasicBlock *TailBB) {
|
||||
if (TailBB->succ_size() != 1)
|
||||
return false;
|
||||
MachineBasicBlock::iterator I = TailBB->getFirstNonPHI();
|
||||
MachineBasicBlock::iterator I = TailBB->begin();
|
||||
MachineBasicBlock::iterator E = TailBB->end();
|
||||
while (I->isDebugValue() && I != E)
|
||||
while (I != E && I->isDebugValue())
|
||||
++I;
|
||||
if (I == E)
|
||||
return true;
|
||||
@ -712,7 +712,7 @@ TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
|
||||
DenseSet<unsigned> UsedByPhi;
|
||||
getRegsUsedByPHIs(*TailBB, &UsedByPhi);
|
||||
|
||||
if (0 && isSimpleBB(TailBB))
|
||||
if (isSimpleBB(TailBB))
|
||||
return duplicateSimpleBB(TailBB, TDBBs, UsedByPhi, Copies);
|
||||
|
||||
// Iterate through all the unique predecessors and tail-duplicate this
|
||||
|
28
test/CodeGen/X86/tail-dup-addr.ll
Normal file
28
test/CodeGen/X86/tail-dup-addr.ll
Normal file
@ -0,0 +1,28 @@
|
||||
; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
|
||||
|
||||
; Test that we don't drop a block that has its address taken.
|
||||
|
||||
; CHECK: Ltmp1: ## Block address taken
|
||||
; CHECK: Ltmp2: ## Block address taken
|
||||
|
||||
@a = common global i32 0, align 4
|
||||
@p = common global i8* null, align 8
|
||||
|
||||
define void @foo() noreturn nounwind uwtable ssp {
|
||||
entry:
|
||||
%tmp = load i32* @a, align 4
|
||||
%foo = icmp eq i32 0, %tmp
|
||||
br i1 %foo, label %sw.bb, label %sw.default
|
||||
|
||||
sw.bb: ; preds = %entry
|
||||
store i8* blockaddress(@foo, %sw.bb1), i8** @p, align 8
|
||||
br label %sw.bb1
|
||||
|
||||
sw.bb1: ; preds = %sw.default, %sw.bb, %entry
|
||||
store i8* blockaddress(@foo, %sw.default), i8** @p, align 8
|
||||
br label %sw.default
|
||||
|
||||
sw.default: ; preds = %sw.bb1, %entry
|
||||
store i8* blockaddress(@foo, %sw.bb1), i8** @p, align 8
|
||||
br label %sw.bb1
|
||||
}
|
Loading…
Reference in New Issue
Block a user