mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +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);
|
||||
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
|
||||
// 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());
|
||||
|
||||
// Splitting the edge can reduce the number of PHI entries we have.
|
||||
e = PN->getNumIncomingValues();
|
||||
BB = NewBB;
|
||||
i = PN->getBasicBlockIndex(BB);
|
||||
// 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
|
||||
;
|
||||
; Test LSR's use of SplitCriticalEdge during phi rewriting.
|
||||
; Verify that identical edges are merged. rdar://problem/6453893
|
||||
|
||||
target triple = "x86-apple-darwin"
|
||||
|
||||
; CHECK: @test
|
||||
; Verify that identical edges are merged. rdar://problem/6453893
|
||||
; CHECK: @test1
|
||||
; CHECK: bb89:
|
||||
; CHECK: phi i8* [ %lsr.iv.next1, %bbA.bb89_crit_edge ], [ %lsr.iv.next1, %bbB.bb89_crit_edge ]{{$}}
|
||||
|
||||
define i8* @test() {
|
||||
define i8* @test1() {
|
||||
entry:
|
||||
br label %loop
|
||||
|
||||
@ -41,3 +41,41 @@ bb89:
|
||||
exit:
|
||||
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