mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-10 22:46:25 +00:00
[LV] Remove wrong assumption about LCSSA
The LCSSA pass itself will not generate several redundant PHI nodes in a single exit block. However, such redundant PHI nodes don't violate LCSSA form, and may be introduced by passes that preserve LCSSA, and/or preserved by the LCSSA pass itself. So, assuming a single PHI node per exit block is not safe. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275217 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e0c5ceae90
commit
6449d7c4a9
@ -3112,9 +3112,6 @@ void InnerLoopVectorizer::fixupIVUsers(PHINode *OrigPhi,
|
||||
// value (the value that feeds into the phi from the loop latch).
|
||||
// We allow both, but they, obviously, have different values.
|
||||
|
||||
// We only expect at most one of each kind of user. This is because LCSSA will
|
||||
// canonicalize the users to a single PHI node per exit block, and we
|
||||
// currently only vectorize loops with a single exit.
|
||||
assert(OrigLoop->getExitBlock() && "Expected a single exit block");
|
||||
|
||||
// An external user of the last iteration's value should see the value that
|
||||
@ -3132,7 +3129,6 @@ void InnerLoopVectorizer::fixupIVUsers(PHINode *OrigPhi,
|
||||
auto *User = cast<PHINode>(UI);
|
||||
if (User->getBasicBlockIndex(MiddleBlock) == -1)
|
||||
User->addIncoming(EndValue, MiddleBlock);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -3159,7 +3155,6 @@ void InnerLoopVectorizer::fixupIVUsers(PHINode *OrigPhi,
|
||||
Value *Escape = II.transform(B, CMO, PSE.getSE(), DL);
|
||||
Escape->setName("ind.escape");
|
||||
User->addIncoming(Escape, MiddleBlock);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -108,3 +108,28 @@ for.body:
|
||||
for.end:
|
||||
ret i32* %inc.lag1
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @multiphi
|
||||
; CHECK-LABEL: scalar.ph:
|
||||
; CHECK: %bc.resume.val = phi i32 [ %n.vec, %middle.block ], [ 0, %entry ]
|
||||
; CHECK-LABEL: for.end:
|
||||
; CHECK: %phi = phi i32 [ {{.*}}, %for.body ], [ %n.vec, %middle.block ]
|
||||
; CHECK: %phi2 = phi i32 [ {{.*}}, %for.body ], [ %n.vec, %middle.block ]
|
||||
; CHECK: store i32 %phi2, i32* %p
|
||||
; CHECK: ret i32 %phi
|
||||
define i32 @multiphi(i32 %k, i32* %p) {
|
||||
entry:
|
||||
br label %for.body
|
||||
|
||||
for.body:
|
||||
%inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]
|
||||
%inc = add nsw i32 %inc.phi, 1
|
||||
%cmp = icmp eq i32 %inc, %k
|
||||
br i1 %cmp, label %for.end, label %for.body
|
||||
|
||||
for.end:
|
||||
%phi = phi i32 [ %inc, %for.body ]
|
||||
%phi2 = phi i32 [ %inc, %for.body ]
|
||||
store i32 %phi2, i32* %p
|
||||
ret i32 %phi
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user