diff options
author | Ayal Zaks <ayal.zaks@intel.com> | 2017-09-13 06:28:37 +0000 |
---|---|---|
committer | Ayal Zaks <ayal.zaks@intel.com> | 2017-09-13 06:28:37 +0000 |
commit | e2a8c0758fd128306c7ea771280d4e1bf527aad3 (patch) | |
tree | 1c8f17b816e0bd82a4861338bb33211394f89f93 /llvm/lib/Transforms | |
parent | 20562abc1cfb594885e920368d9334b65ebc3cf0 (diff) | |
download | bcm5719-llvm-e2a8c0758fd128306c7ea771280d4e1bf527aad3.tar.gz bcm5719-llvm-e2a8c0758fd128306c7ea771280d4e1bf527aad3.zip |
[LV] Fix PR34523 - avoid generating redundant selects
When converting a PHI into a series of 'select' instructions to combine the
incoming values together according their edge masks, initialize the first
value to the incoming value In0 of the first predecessor, instead of
generating a redundant assignment 'select(Cond[0], In0, In0)'. The latter
fails when the Cond[0] mask is null, representing a full mask, which can
happen only when there's a single incoming value.
No functional changes intended nor expected other than surviving null Cond[0]'s.
This fix follows D35725, which introduced using null to represent full masks.
Differential Revision: https://reviews.llvm.org/D37619
llvm-svn: 313119
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 5267a2a3f19..487a7fb72f0 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -4526,10 +4526,10 @@ void InnerLoopVectorizer::widenPHIInstruction(Instruction *PN, unsigned UF, for (unsigned Part = 0; Part < UF; ++Part) { Value *In0 = getOrCreateVectorValue(P->getIncomingValue(In), Part); - // We might have single edge PHIs (blocks) - use an identity - // 'select' for the first PHI operand. + assert((Cond[Part] || NumIncoming == 1) && + "Multiple predecessors with one predecessor having a full mask"); if (In == 0) - Entry[Part] = Builder.CreateSelect(Cond[Part], In0, In0); + Entry[Part] = In0; // Initialize with the first incoming value. else // Select between the current value and the previous incoming edge // based on the incoming mask. |