diff options
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 5 | ||||
| -rw-r--r-- | llvm/test/Transforms/LoopVectorize/iv_outside_user.ll | 25 |
2 files changed, 25 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 5c74ad5d851..a8937b09f90 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -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; } } } diff --git a/llvm/test/Transforms/LoopVectorize/iv_outside_user.ll b/llvm/test/Transforms/LoopVectorize/iv_outside_user.ll index 4e345f3517b..d536d1023f4 100644 --- a/llvm/test/Transforms/LoopVectorize/iv_outside_user.ll +++ b/llvm/test/Transforms/LoopVectorize/iv_outside_user.ll @@ -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 +} |

