mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
LSR critical edge splitting fix for PR13756.
llvm-svn: 164147
This commit is contained in:
parent
213f16cbf4
commit
c987eb4cb3
@ -4464,17 +4464,21 @@ void LSRInstance::RewriteForPHI(PHINode *PN,
|
|||||||
SplitLandingPadPredecessors(Parent, BB, "", "", P, NewBBs);
|
SplitLandingPadPredecessors(Parent, BB, "", "", P, NewBBs);
|
||||||
NewBB = NewBBs[0];
|
NewBB = NewBBs[0];
|
||||||
}
|
}
|
||||||
|
// If NewBB==NULL, then SplitCriticalEdge refused to split because all
|
||||||
|
// phi predecessors are identical. The simple thing to do is skip
|
||||||
|
// splitting in this case rather than complicate the API.
|
||||||
|
if (NewBB) {
|
||||||
|
// If PN is outside of the loop and BB is in the loop, we want to
|
||||||
|
// move the block to be immediately before the PHI block, not
|
||||||
|
// immediately after BB.
|
||||||
|
if (L->contains(BB) && !L->contains(PN))
|
||||||
|
NewBB->moveBefore(PN->getParent());
|
||||||
|
|
||||||
// If PN is outside of the loop and BB is in the loop, we want to
|
// Splitting the edge can reduce the number of PHI entries we have.
|
||||||
// move the block to be immediately before the PHI block, not
|
e = PN->getNumIncomingValues();
|
||||||
// immediately after BB.
|
BB = NewBB;
|
||||||
if (L->contains(BB) && !L->contains(PN))
|
i = PN->getBasicBlockIndex(BB);
|
||||||
NewBB->moveBefore(PN->getParent());
|
}
|
||||||
|
|
||||||
// Splitting the edge can reduce the number of PHI entries we have.
|
|
||||||
e = PN->getNumIncomingValues();
|
|
||||||
BB = NewBB;
|
|
||||||
i = PN->getBasicBlockIndex(BB);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
; RUN: opt -loop-reduce -S < %s | FileCheck %s
|
; RUN: opt -loop-reduce -S < %s | FileCheck %s
|
||||||
;
|
;
|
||||||
; Test LSR's use of SplitCriticalEdge during phi rewriting.
|
; Test LSR's use of SplitCriticalEdge during phi rewriting.
|
||||||
; Verify that identical edges are merged. rdar://problem/6453893
|
|
||||||
|
|
||||||
target triple = "x86-apple-darwin"
|
target triple = "x86-apple-darwin"
|
||||||
|
|
||||||
; CHECK: @test
|
; Verify that identical edges are merged. rdar://problem/6453893
|
||||||
|
; CHECK: @test1
|
||||||
; CHECK: bb89:
|
; CHECK: bb89:
|
||||||
; CHECK: phi i8* [ %lsr.iv.next1, %bbA.bb89_crit_edge ], [ %lsr.iv.next1, %bbB.bb89_crit_edge ]{{$}}
|
; CHECK: phi i8* [ %lsr.iv.next1, %bbA.bb89_crit_edge ], [ %lsr.iv.next1, %bbB.bb89_crit_edge ]{{$}}
|
||||||
|
|
||||||
define i8* @test() {
|
define i8* @test1() {
|
||||||
entry:
|
entry:
|
||||||
br label %loop
|
br label %loop
|
||||||
|
|
||||||
@ -41,3 +41,41 @@ bb89:
|
|||||||
exit:
|
exit:
|
||||||
ret i8* %tmp75phi
|
ret i8* %tmp75phi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Handle single-predecessor phis: PR13756
|
||||||
|
; CHECK: @test2
|
||||||
|
; CHECK: bb89:
|
||||||
|
; CHECK: phi i8* [ %lsr.iv.next1, %bbA ], [ %lsr.iv.next1, %bbA ], [ %lsr.iv.next1, %bbA ]{{$}}
|
||||||
|
define i8* @test2() {
|
||||||
|
entry:
|
||||||
|
br label %loop
|
||||||
|
|
||||||
|
loop:
|
||||||
|
%rec = phi i32 [ %next, %loop ], [ 0, %entry ]
|
||||||
|
%next = add i32 %rec, 1
|
||||||
|
%tmp75 = getelementptr i8* null, i32 %next
|
||||||
|
br i1 false, label %loop, label %loopexit
|
||||||
|
|
||||||
|
loopexit:
|
||||||
|
br i1 false, label %bbA, label %bbB
|
||||||
|
|
||||||
|
bbA:
|
||||||
|
switch i32 0, label %bb89 [
|
||||||
|
i32 47, label %bb89
|
||||||
|
i32 58, label %bb89
|
||||||
|
]
|
||||||
|
|
||||||
|
bbB:
|
||||||
|
switch i8 0, label %exit [
|
||||||
|
i8 47, label %exit
|
||||||
|
i8 58, label %exit
|
||||||
|
]
|
||||||
|
|
||||||
|
bb89:
|
||||||
|
%tmp75phi = phi i8* [ %tmp75, %bbA ], [ %tmp75, %bbA ], [ %tmp75, %bbA ]
|
||||||
|
br label %exit
|
||||||
|
|
||||||
|
exit:
|
||||||
|
%result = phi i8* [ %tmp75phi, %bb89 ], [ %tmp75, %bbB ], [ %tmp75, %bbB ], [ %tmp75, %bbB ]
|
||||||
|
ret i8* %result
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user