Skip to content

Commit

Permalink
[LoopOptimizer][Fix]PR32859, PR24738
Browse files Browse the repository at this point in the history
The Loop vectorizer pass introduced undef value while it is fixing output of LCSSA form.
Here it is:

before: %e.0.ph = phi i32 [ 0, %for.inc.2.i ]
after: %e.0.ph = phi i32 [ 0, %for.inc.2.i ], [ undef, %middle.block ]

and after this change we have:

%e.0.ph = phi i32 [ 0, %for.inc.2.i ]
%e.0.ph = phi i32 [ 0, %for.inc.2.i ], [ 0, %middle.block ]

Committed on behalf of @dtemirbulatov

Differential Revision: https://reviews.llvm.org/D33055

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302988 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
RKSimon committed May 13, 2017
1 parent e3abce2 commit 07ac640
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 7 deletions.
16 changes: 9 additions & 7 deletions lib/Transforms/Vectorize/LoopVectorize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -446,10 +446,10 @@ class InnerLoopVectorizer {
/// vectorizing this phi node.
void fixReduction(PHINode *Phi);

/// \brief The Loop exit block may have single value PHI nodes where the
/// incoming value is 'Undef'. While vectorizing we only handled real values
/// that were defined inside the loop. Here we fix the 'undef case'.
/// See PR14725.
/// \brief The Loop exit block may have single value PHI nodes with some
/// incoming value. While vectorizing we only handled real values
/// that were defined inside the loop and we should have one value for
/// each predecessor of its parent basic block. See PR14725.
void fixLCSSAPHIs();

/// Iteratively sink the scalarized operands of a predicated instruction into
Expand Down Expand Up @@ -4300,9 +4300,11 @@ void InnerLoopVectorizer::fixLCSSAPHIs() {
auto *LCSSAPhi = dyn_cast<PHINode>(&LEI);
if (!LCSSAPhi)
break;
if (LCSSAPhi->getNumIncomingValues() == 1)
LCSSAPhi->addIncoming(UndefValue::get(LCSSAPhi->getType()),
LoopMiddleBlock);
if (LCSSAPhi->getNumIncomingValues() == 1) {
assert(OrigLoop->isLoopInvariant(LCSSAPhi->getIncomingValue(0)) &&
"Incoming value isn't loop invariant");
LCSSAPhi->addIncoming(LCSSAPhi->getIncomingValue(0), LoopMiddleBlock);
}
}
}

Expand Down
30 changes: 30 additions & 0 deletions test/Transforms/LoopVectorize/pr32859.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
; RUN: opt < %s -loop-vectorize -S | FileCheck %s

; Out of the LCSSA form we could have 'phi i32 [ loop-invariant, %for.inc.2.i ]'
; but the IR Verifier requires for PHI one entry for each predecessor of
; it's parent basic block. The original PR14725 solution for the issue just
; added 'undef' for an predecessor BB and which is not correct. We copy the real
; value for another predecessor instead of bringing 'undef'.

; CHECK-LABEL: for.cond.preheader:
; CHECK: %e.0.ph = phi i32 [ 0, %if.end.2.i ], [ 0, %middle.block ]

; Function Attrs: nounwind uwtable
define void @main() #0 {
entry:
br label %for.cond1.preheader.i

for.cond1.preheader.i: ; preds = %if.end.2.i, %entry
%c.06.i = phi i32 [ 0, %entry ], [ %inc5.i, %if.end.2.i ]
%tobool.i = icmp ne i32 undef, 0
br label %if.end.2.i

if.end.2.i: ; preds = %for.cond1.preheader.i
%inc5.i = add nsw i32 %c.06.i, 1
%cmp.i = icmp slt i32 %inc5.i, 16
br i1 %cmp.i, label %for.cond1.preheader.i, label %for.cond.preheader

for.cond.preheader: ; preds = %if.end.2.i
%e.0.ph = phi i32 [ 0, %if.end.2.i ]
unreachable
}

0 comments on commit 07ac640

Please sign in to comment.