forked from OSchip/llvm-project
LoopVectorizer: Keep track of conditional store basic blocks
Before conditional store vectorization/unrolling we had only one vectorized/unrolled basic block. After adding support for conditional store vectorization this will not only be one block but multiple basic blocks. The last block would have the back-edge. I updated the code to use a vector of basic blocks instead of a single basic block and fixed the users to use the last entry in this vector. But, I forgot to add the basic blocks to this vector! Fixes PR18724. llvm-svn: 201028
This commit is contained in:
parent
3c6774a172
commit
348e1b60be
|
@ -1640,6 +1640,7 @@ void InnerLoopVectorizer::scalarizeInstruction(Instruction *Instr, bool IfPredic
|
|||
Cmp = Builder.CreateExtractElement(Cond[Part], Builder.getInt32(Width));
|
||||
Cmp = Builder.CreateICmp(ICmpInst::ICMP_EQ, Cmp, ConstantInt::get(Cmp->getType(), 1));
|
||||
CondBlock = IfBlock->splitBasicBlock(InsertPt, "cond.store");
|
||||
LoopVectorBody.push_back(CondBlock);
|
||||
VectorLp->addBasicBlockToLoop(CondBlock, LI->getBase());
|
||||
// Update Builder with newly created basic block.
|
||||
Builder.SetInsertPoint(InsertPt);
|
||||
|
@ -1668,6 +1669,7 @@ void InnerLoopVectorizer::scalarizeInstruction(Instruction *Instr, bool IfPredic
|
|||
// End if-block.
|
||||
if (IfPredicateStore) {
|
||||
BasicBlock *NewIfBlock = CondBlock->splitBasicBlock(InsertPt, "else");
|
||||
LoopVectorBody.push_back(NewIfBlock);
|
||||
VectorLp->addBasicBlockToLoop(NewIfBlock, LI->getBase());
|
||||
Builder.SetInsertPoint(InsertPt);
|
||||
Instruction *OldBr = IfBlock->getTerminator();
|
||||
|
@ -5736,6 +5738,7 @@ void InnerLoopUnroller::scalarizeInstruction(Instruction *Instr,
|
|||
Cmp = Builder.CreateICmp(ICmpInst::ICMP_EQ, Cond[Part],
|
||||
ConstantInt::get(Cond[Part]->getType(), 1));
|
||||
CondBlock = IfBlock->splitBasicBlock(InsertPt, "cond.store");
|
||||
LoopVectorBody.push_back(CondBlock);
|
||||
VectorLp->addBasicBlockToLoop(CondBlock, LI->getBase());
|
||||
// Update Builder with newly created basic block.
|
||||
Builder.SetInsertPoint(InsertPt);
|
||||
|
@ -5761,6 +5764,7 @@ void InnerLoopUnroller::scalarizeInstruction(Instruction *Instr,
|
|||
// End if-block.
|
||||
if (IfPredicateStore) {
|
||||
BasicBlock *NewIfBlock = CondBlock->splitBasicBlock(InsertPt, "else");
|
||||
LoopVectorBody.push_back(NewIfBlock);
|
||||
VectorLp->addBasicBlockToLoop(NewIfBlock, LI->getBase());
|
||||
Builder.SetInsertPoint(InsertPt);
|
||||
Instruction *OldBr = IfBlock->getTerminator();
|
||||
|
|
|
@ -84,3 +84,43 @@ for.inc:
|
|||
for.end:
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
; Track basic blocks when unrolling conditional blocks. This code used to assert
|
||||
; because we did not update the phi nodes with the proper predecessor in the
|
||||
; vectorized loop body.
|
||||
; PR18724
|
||||
|
||||
; UNROLL-LABEL: bug18724
|
||||
; UNROLL: store i32
|
||||
; UNROLL: store i32
|
||||
|
||||
define void @bug18724() {
|
||||
entry:
|
||||
br label %for.body9
|
||||
|
||||
for.body9:
|
||||
br i1 undef, label %for.inc26, label %for.body14
|
||||
|
||||
for.body14:
|
||||
%indvars.iv3 = phi i64 [ %indvars.iv.next4, %for.inc23 ], [ undef, %for.body9 ]
|
||||
%iNewChunks.120 = phi i32 [ %iNewChunks.2, %for.inc23 ], [ undef, %for.body9 ]
|
||||
%arrayidx16 = getelementptr inbounds [768 x i32]* undef, i64 0, i64 %indvars.iv3
|
||||
%tmp = load i32* %arrayidx16, align 4
|
||||
br i1 undef, label %if.then18, label %for.inc23
|
||||
|
||||
if.then18:
|
||||
store i32 2, i32* %arrayidx16, align 4
|
||||
%inc21 = add nsw i32 %iNewChunks.120, 1
|
||||
br label %for.inc23
|
||||
|
||||
for.inc23:
|
||||
%iNewChunks.2 = phi i32 [ %inc21, %if.then18 ], [ %iNewChunks.120, %for.body14 ]
|
||||
%indvars.iv.next4 = add nsw i64 %indvars.iv3, 1
|
||||
%tmp1 = trunc i64 %indvars.iv3 to i32
|
||||
%cmp13 = icmp slt i32 %tmp1, 0
|
||||
br i1 %cmp13, label %for.body14, label %for.inc26
|
||||
|
||||
for.inc26:
|
||||
%iNewChunks.1.lcssa = phi i32 [ undef, %for.body9 ], [ %iNewChunks.2, %for.inc23 ]
|
||||
unreachable
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue