[VPlan] Remove redundant blocks by merging them into predecessors.
Add and run VPlan transform to fold blocks with a single predecessor into the predecessor. This remove redundant blocks and addresses a TODO to replace special handling for the vector latch VPBB. Reviewed By: Ayal Differential Revision: https://reviews.llvm.org/D139927
This commit is contained in:
@@ -8978,9 +8978,6 @@ VPlanPtr LoopVectorizationPlanner::buildVPlanWithVPRecipes(
|
||||
|
||||
HeaderVPBB->setName("vector.body");
|
||||
|
||||
// Fold the last, empty block into its predecessor.
|
||||
VPBB = VPBlockUtils::tryToMergeBlockIntoPredecessor(VPBB);
|
||||
assert(VPBB && "expected to fold last (empty) block");
|
||||
// After here, VPBB should not be used.
|
||||
VPBB = nullptr;
|
||||
|
||||
@@ -9152,11 +9149,7 @@ VPlanPtr LoopVectorizationPlanner::buildVPlanWithVPRecipes(
|
||||
VPlanTransforms::sinkScalarOperands(*Plan);
|
||||
VPlanTransforms::mergeReplicateRegions(*Plan);
|
||||
VPlanTransforms::removeRedundantExpandSCEVRecipes(*Plan);
|
||||
|
||||
// Fold Exit block into its predecessor if possible.
|
||||
// TODO: Fold block earlier once all VPlan transforms properly maintain a
|
||||
// VPBasicBlock as exit.
|
||||
VPBlockUtils::tryToMergeBlockIntoPredecessor(TopRegion->getExiting());
|
||||
VPlanTransforms::mergeBlocksIntoPredecessors(*Plan);
|
||||
|
||||
assert(VPlanVerifier::verifyPlanIsValid(*Plan) && "VPlan is invalid");
|
||||
return Plan;
|
||||
|
||||
@@ -2881,31 +2881,6 @@ public:
|
||||
To->removePredecessor(From);
|
||||
}
|
||||
|
||||
/// Try to merge \p Block into its single predecessor, if \p Block is a
|
||||
/// VPBasicBlock and its predecessor has a single successor. Returns a pointer
|
||||
/// to the predecessor \p Block was merged into or nullptr otherwise.
|
||||
static VPBasicBlock *tryToMergeBlockIntoPredecessor(VPBlockBase *Block) {
|
||||
auto *VPBB = dyn_cast<VPBasicBlock>(Block);
|
||||
auto *PredVPBB =
|
||||
dyn_cast_or_null<VPBasicBlock>(Block->getSinglePredecessor());
|
||||
if (!VPBB || !PredVPBB || PredVPBB->getNumSuccessors() != 1)
|
||||
return nullptr;
|
||||
|
||||
for (VPRecipeBase &R : make_early_inc_range(*VPBB))
|
||||
R.moveBefore(*PredVPBB, PredVPBB->end());
|
||||
VPBlockUtils::disconnectBlocks(PredVPBB, VPBB);
|
||||
auto *ParentRegion = cast<VPRegionBlock>(Block->getParent());
|
||||
if (ParentRegion->getExiting() == Block)
|
||||
ParentRegion->setExiting(PredVPBB);
|
||||
SmallVector<VPBlockBase *> Successors(Block->successors());
|
||||
for (auto *Succ : Successors) {
|
||||
VPBlockUtils::disconnectBlocks(Block, Succ);
|
||||
VPBlockUtils::connectBlocks(PredVPBB, Succ);
|
||||
}
|
||||
delete Block;
|
||||
return PredVPBB;
|
||||
}
|
||||
|
||||
/// Return an iterator range over \p Range which only includes \p BlockTy
|
||||
/// blocks. The accesses are casted to \p BlockTy.
|
||||
template <typename BlockTy, typename T>
|
||||
|
||||
@@ -307,6 +307,34 @@ bool VPlanTransforms::mergeReplicateRegions(VPlan &Plan) {
|
||||
return Changed;
|
||||
}
|
||||
|
||||
bool VPlanTransforms::mergeBlocksIntoPredecessors(VPlan &Plan) {
|
||||
SmallVector<VPBasicBlock *> WorkList;
|
||||
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(depth_first(
|
||||
VPBlockRecursiveTraversalWrapper<VPBlockBase *>(Plan.getEntry())))) {
|
||||
auto *PredVPBB =
|
||||
dyn_cast_or_null<VPBasicBlock>(VPBB->getSinglePredecessor());
|
||||
if (PredVPBB && PredVPBB->getNumSuccessors() == 1)
|
||||
WorkList.push_back(VPBB);
|
||||
}
|
||||
|
||||
for (VPBasicBlock *VPBB : WorkList) {
|
||||
VPBasicBlock *PredVPBB = cast<VPBasicBlock>(VPBB->getSinglePredecessor());
|
||||
for (VPRecipeBase &R : make_early_inc_range(*VPBB))
|
||||
R.moveBefore(*PredVPBB, PredVPBB->end());
|
||||
VPBlockUtils::disconnectBlocks(PredVPBB, VPBB);
|
||||
auto *ParentRegion = cast_or_null<VPRegionBlock>(VPBB->getParent());
|
||||
if (ParentRegion && ParentRegion->getExiting() == VPBB)
|
||||
ParentRegion->setExiting(PredVPBB);
|
||||
SmallVector<VPBlockBase *> Successors(VPBB->successors());
|
||||
for (auto *Succ : Successors) {
|
||||
VPBlockUtils::disconnectBlocks(VPBB, Succ);
|
||||
VPBlockUtils::connectBlocks(PredVPBB, Succ);
|
||||
}
|
||||
delete VPBB;
|
||||
}
|
||||
return !WorkList.empty();
|
||||
}
|
||||
|
||||
void VPlanTransforms::removeRedundantInductionCasts(VPlan &Plan) {
|
||||
for (auto &Phi : Plan.getVectorLoopRegion()->getEntryBasicBlock()->phis()) {
|
||||
auto *IV = dyn_cast<VPWidenIntOrFpInductionRecipe>(&Phi);
|
||||
|
||||
@@ -40,6 +40,10 @@ struct VPlanTransforms {
|
||||
|
||||
static bool mergeReplicateRegions(VPlan &Plan);
|
||||
|
||||
/// Remove redundant VPBasicBlocks by merging them into their predecessor if
|
||||
/// the predecessor has a single successor.
|
||||
static bool mergeBlocksIntoPredecessors(VPlan &Plan);
|
||||
|
||||
/// Remove redundant casts of inductions.
|
||||
///
|
||||
/// Such redundant casts are casts of induction variables that can be ignored,
|
||||
|
||||
@@ -23,9 +23,6 @@ define void @sink_replicate_region_1(i32 %x, i8* %ptr, i32* noalias %dst) optsiz
|
||||
; CHECK-NEXT: WIDEN-INDUCTION %iv = phi 0, %iv.next, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
|
||||
; CHECK-NEXT: Successor(s): loop.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0:
|
||||
; CHECK-NEXT: Successor(s): pred.load
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.load: {
|
||||
@@ -47,9 +44,6 @@ define void @sink_replicate_region_1(i32 %x, i8* %ptr, i32* noalias %dst) optsiz
|
||||
; CHECK-NEXT: loop.1:
|
||||
; CHECK-NEXT: WIDEN ir<%conv> = sext vp<[[PRED1]]>
|
||||
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%0> ir<%conv>
|
||||
; CHECK-NEXT: Successor(s): loop.1.split
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.1.split:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.store: {
|
||||
@@ -118,14 +112,8 @@ define void @sink_replicate_region_2(i32 %x, i8 %y, i32* %ptr) optsize {
|
||||
; CHECK-NEXT: FIRST-ORDER-RECURRENCE-PHI ir<%recur> = phi ir<0>, ir<%recur.next>
|
||||
; CHECK-NEXT: WIDEN-INDUCTION %iv = phi 0, %iv.next, ir<1>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
|
||||
; CHECK-NEXT: Successor(s): loop.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0:
|
||||
; CHECK-NEXT: WIDEN ir<%recur.next> = sext ir<%y>
|
||||
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%recur> ir<%recur.next>
|
||||
; CHECK-NEXT: Successor(s): loop.0.split
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0.split:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.store: {
|
||||
@@ -194,9 +182,6 @@ define i32 @sink_replicate_region_3_reduction(i32 %x, i8 %y, i32* %ptr) optsize
|
||||
; CHECK-NEXT: WIDEN-REDUCTION-PHI ir<%and.red> = phi ir<1234>, ir<%and.red.next>
|
||||
; CHECK-NEXT: EMIT vp<[[WIDEN_CAN:%.+]]> = WIDEN-CANONICAL-INDUCTION vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule vp<[[WIDEN_CAN]]> vp<[[BTC]]>
|
||||
; CHECK-NEXT: Successor(s): loop.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0:
|
||||
; CHECK-NEXT: WIDEN ir<%recur.next> = sext ir<%y>
|
||||
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%recur> ir<%recur.next>
|
||||
; CHECK-NEXT: Successor(s): pred.srem
|
||||
@@ -272,9 +257,6 @@ define void @sink_replicate_region_4_requires_split_at_end_of_block(i32 %x, i8*
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
|
||||
; CHECK-NEXT: REPLICATE ir<%gep> = getelementptr ir<%ptr>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: Successor(s): loop.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0:
|
||||
; CHECK-NEXT: Successor(s): pred.load
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.load: {
|
||||
@@ -295,12 +277,6 @@ define void @sink_replicate_region_4_requires_split_at_end_of_block(i32 %x, i8*
|
||||
; CHECK-NEXT: loop.1:
|
||||
; CHECK-NEXT: WIDEN ir<%conv> = sext vp<[[PRED]]>
|
||||
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%0> ir<%conv>
|
||||
; CHECK-NEXT: Successor(s): loop.1.split
|
||||
; CHECK-EMPTY:
|
||||
; CHECK: loop.1.split:
|
||||
; CHECK-NEXT: Successor(s): loop.2
|
||||
; CHECK-EMPTY:
|
||||
; CHECK: loop.2:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
; CHECK: <xVFxUF> pred.store: {
|
||||
@@ -378,12 +354,6 @@ define void @sink_replicate_region_after_replicate_region(i32* %ptr, i32* noalia
|
||||
; CHECK-NEXT: WIDEN-INDUCTION %iv = phi 0, %iv.next, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
|
||||
; CHECK-NEXT: Successor(s): loop.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0:
|
||||
; CHECK-NEXT: Successor(s): loop.1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.1:
|
||||
; CHECK-NEXT: WIDEN ir<%recur.next> = sext ir<%y>
|
||||
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%recur> ir<%recur.next>
|
||||
; CHECK-NEXT: Successor(s): pred.srem
|
||||
@@ -404,9 +374,6 @@ define void @sink_replicate_region_after_replicate_region(i32* %ptr, i32* noalia
|
||||
; CHECK-NEXT: Successor(s): loop.1.split
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.1.split:
|
||||
; CHECK-NEXT: Successor(s): loop.2
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.2:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.store: {
|
||||
@@ -477,14 +444,8 @@ define void @need_new_block_after_sinking_pr56146(i32 %x, i32* %src, i32* noalia
|
||||
; CHECK-NEXT: vp<[[DERIVED_IV:%.+]]> = DERIVED-IV ir<2> + vp<[[CAN_IV]]> * ir<1>
|
||||
; CHECK-NEXT: EMIT vp<[[WIDE_IV:%.+]]> = WIDEN-CANONICAL-INDUCTION vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT vp<[[CMP:%.+]]> = icmp ule vp<[[WIDE_IV]]> vp<[[BTC]]>
|
||||
; CHECK-NEXT: Successor(s): loop.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0:
|
||||
; CHECK-NEXT: CLONE ir<[[L]]> = load ir<%src>
|
||||
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%.pn> ir<[[L]]>
|
||||
; CHECK-NEXT: Successor(s): loop.0.split
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0.split:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.store: {
|
||||
|
||||
@@ -73,12 +73,6 @@ declare i32 @llvm.smin.i32(i32, i32)
|
||||
; DBG-NEXT: vp<[[DERIVED_IV:%.+]]> = DERIVED-IV ir<false> + vp<[[CAN_IV]]> * ir<true>
|
||||
; DBG-NEXT: vp<[[STEPS1:%.+]]> = SCALAR-STEPS vp<[[DERIVED_IV]]>, ir<true>
|
||||
; DBG-NEXT: vp<[[STEPS2:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; DBG-NEXT: Successor(s): cond.false
|
||||
; DBG-EMPTY:
|
||||
; DBG-NEXT: cond.false:
|
||||
; DBG-NEXT: Successor(s): cond.false.0
|
||||
; DBG-EMPTY:
|
||||
; DBG-NEXT: cond.false.0:
|
||||
; DBG-NEXT: Successor(s): pred.store
|
||||
; DBG-EMPTY:
|
||||
; DBG-NEXT: <xVFxUF> pred.store: {
|
||||
@@ -100,9 +94,6 @@ declare i32 @llvm.smin.i32(i32, i32)
|
||||
; DBG-NEXT: Successor(s): cond.false.1
|
||||
; DBG-EMPTY:
|
||||
; DBG-NEXT: cond.false.1:
|
||||
; DBG-NEXT: Successor(s): loop.latch
|
||||
; DBG-EMPTY:
|
||||
; DBG-NEXT: loop.latch:
|
||||
; DBG-NEXT: EMIT vp<[[CAN_IV_INC:%.+]]> = VF * UF +(nuw) vp<[[CAN_IV]]>
|
||||
; DBG-NEXT: EMIT branch-on-count vp<[[CAN_IV_INC]]> vp<[[VEC_TC]]>
|
||||
; DBG-NEXT: No successors
|
||||
|
||||
@@ -16,9 +16,6 @@ define void @iv_no_binary_op_in_descriptor(i1 %c, ptr %dst) {
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%dst>, vp<[[STEPS:%.+]]>
|
||||
; CHECK-NEXT: WIDEN store ir<%gep>, ir<%iv>
|
||||
; CHECK-NEXT: Successor(s): loop.latch
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.latch:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_INC:%.+]]> = VF * UF +(nuw) vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_INC]]> vp<[[VEC_TC]]>
|
||||
; CHECK-NEXT: No successors
|
||||
|
||||
@@ -206,9 +206,6 @@ define void @print_replicate_predicated_phi(i64 %n, ptr %x) {
|
||||
; CHECK-NEXT: WIDEN-INDUCTION %i = phi 0, %i.next, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: WIDEN ir<%cmp> = icmp ult ir<%i>, ir<5>
|
||||
; CHECK-NEXT: Successor(s): if.then
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: if.then:
|
||||
; CHECK-NEXT: Successor(s): pred.udiv
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.udiv: {
|
||||
@@ -227,9 +224,6 @@ define void @print_replicate_predicated_phi(i64 %n, ptr %x) {
|
||||
; CHECK-NEXT: Successor(s): if.then.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: if.then.0:
|
||||
; CHECK-NEXT: Successor(s): for.inc
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: for.inc:
|
||||
; CHECK-NEXT: EMIT vp<[[NOT:%.+]]> = not ir<%cmp>
|
||||
; CHECK-NEXT: BLEND %d = ir<0>/vp<[[NOT]]> vp<[[PRED]]>/ir<%cmp>
|
||||
; CHECK-NEXT: CLONE ir<%idx> = getelementptr ir<%x>, vp<[[STEPS]]>
|
||||
@@ -404,13 +398,7 @@ define void @debug_loc_vpinstruction(ptr nocapture %asd, ptr nocapture %bsd) !db
|
||||
; CHECK-NEXT: WIDEN ir<%lsd> = load ir<%isd>
|
||||
; CHECK-NEXT: WIDEN ir<%psd> = add ir<%lsd>, ir<23>
|
||||
; CHECK-NEXT: WIDEN ir<%cmp1> = icmp slt ir<%lsd>, ir<100>
|
||||
; CHECK-NEXT: Successor(s): check
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: check:
|
||||
; CHECK-NEXT: WIDEN ir<%cmp2> = icmp sge ir<%lsd>, ir<200>
|
||||
; CHECK-NEXT: Successor(s): if.then
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: if.then:
|
||||
; CHECK-NEXT: EMIT vp<[[NOT1:%.+]]> = not ir<%cmp1>, !dbg /tmp/s.c:5:3
|
||||
; CHECK-NEXT: EMIT vp<[[SEL1:%.+]]> = select vp<[[NOT1]]> ir<%cmp2> ir<false>, !dbg /tmp/s.c:5:21
|
||||
; CHECK-NEXT: EMIT vp<[[OR1:%.+]]> = or vp<[[SEL1]]> ir<%cmp1>
|
||||
@@ -432,9 +420,6 @@ define void @debug_loc_vpinstruction(ptr nocapture %asd, ptr nocapture %bsd) !db
|
||||
; CHECK-NEXT: Successor(s): if.then.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: if.then.0:
|
||||
; CHECK-NEXT: Successor(s): if.end
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: if.end:
|
||||
; CHECK-NEXT: EMIT vp<[[NOT2:%.+]]> = not ir<%cmp2>
|
||||
; CHECK-NEXT: EMIT vp<[[SEL2:%.+]]> = select vp<[[NOT1]]> vp<[[NOT2]]> ir<false>
|
||||
; CHECK-NEXT: BLEND %ysd.0 = vp<[[PHI]]>/vp<[[OR1]]> ir<%psd>/vp<[[SEL2]]>
|
||||
|
||||
@@ -20,9 +20,6 @@ define void @sink_with_sideeffects(i1 %c, ptr %ptr) {
|
||||
; CHECK-NEXT: CLONE ir<%tmp2> = getelementptr ir<%ptr>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: CLONE ir<%tmp3> = load ir<%tmp2>
|
||||
; CHECK-NEXT: CLONE store ir<0>, ir<%tmp2>
|
||||
; CHECK-NEXT: Successor(s): if.then
|
||||
|
||||
; CHECK: if.then:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
|
||||
; CHECK: <xVFxUF> pred.store: {
|
||||
@@ -41,9 +38,6 @@ define void @sink_with_sideeffects(i1 %c, ptr %ptr) {
|
||||
; CHECK-NEXT: }
|
||||
|
||||
; CHECK: if.then.0:
|
||||
; CHECK-NEXT: Successor(s): for.inc
|
||||
|
||||
; CHECK: for.inc:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = VF * UF +(nuw) vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]> vp<[[VEC_TC]]>
|
||||
; CHECK-NEXT: No successors
|
||||
|
||||
@@ -24,9 +24,6 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
|
||||
; CHECK-NEXT: WIDEN-INDUCTION %iv = phi 0, %iv.next, ir<1>
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
|
||||
; CHECK-NEXT: Successor(s): loop.0
|
||||
|
||||
; CHECK: loop.0:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
|
||||
; CHECK: <xVFxUF> pred.store: {
|
||||
@@ -255,9 +252,6 @@ define void @uniform_gep(i64 %k, ptr noalias %A, ptr noalias %B) {
|
||||
; CHECK-NEXT: CLONE ir<%gep.A.uniform> = getelementptr ir<%A>, ir<0>
|
||||
; CHECK-NEXT: CLONE ir<%lv> = load ir<%gep.A.uniform>
|
||||
; CHECK-NEXT: WIDEN ir<%cmp> = icmp ult ir<%iv>, ir<%k>
|
||||
; CHECK-NEXT: Successor(s): loop.then
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.then:
|
||||
; CHECK-NEXT: EMIT vp<[[NOT2:%.+]]> = not ir<%cmp>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK2:%.+]]> = select vp<[[MASK]]> vp<[[NOT2]]> ir<false>
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
@@ -279,9 +273,6 @@ define void @uniform_gep(i64 %k, ptr noalias %A, ptr noalias %B) {
|
||||
; CHECK-NEXT: Successor(s): loop.then.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.then.0:
|
||||
; CHECK-NEXT: Successor(s): loop.latch
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.latch:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = VF * UF + vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]> vp<[[VEC_TC]]>
|
||||
; CHECK-NEXT: No successors
|
||||
@@ -328,9 +319,6 @@ define void @pred_cfg1(i32 %k, i32 %j) {
|
||||
; CHECK-NEXT: EMIT vp<[[MASK1:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
|
||||
; CHECK-NEXT: WIDEN ir<%c.1> = icmp ult ir<%iv>, ir<%j>
|
||||
; CHECK-NEXT: WIDEN ir<%mul> = mul ir<%iv>, ir<10>
|
||||
; CHECK-NEXT: Successor(s): then.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.0:
|
||||
; CHECK-NEXT: EMIT vp<[[MASK2:%.+]]> = select vp<[[MASK1]]> ir<%c.1> ir<false>
|
||||
; CHECK-NEXT: Successor(s): pred.load
|
||||
; CHECK-EMPTY:
|
||||
@@ -352,9 +340,6 @@ define void @pred_cfg1(i32 %k, i32 %j) {
|
||||
; CHECK-NEXT: Successor(s): then.0.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.0.0:
|
||||
; CHECK-NEXT: Successor(s): next.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: next.0:
|
||||
; CHECK-NEXT: EMIT vp<[[NOT:%.+]]> = not ir<%c.1>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK3:%.+]]> = select vp<[[MASK1]]> vp<[[NOT]]> ir<false>
|
||||
; CHECK-NEXT: BLEND %p = ir<0>/vp<[[MASK3]]> vp<[[PRED]]>/vp<[[MASK2]]>
|
||||
@@ -430,9 +415,6 @@ define void @pred_cfg2(i32 %k, i32 %j) {
|
||||
; CHECK-NEXT: WIDEN ir<%mul> = mul ir<%iv>, ir<10>
|
||||
; CHECK-NEXT: WIDEN ir<%c.0> = icmp ult ir<%iv>, ir<%j>
|
||||
; CHECK-NEXT: WIDEN ir<%c.1> = icmp ugt ir<%iv>, ir<%j>
|
||||
; CHECK-NEXT: Successor(s): then.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.0:
|
||||
; CHECK-NEXT: EMIT vp<[[MASK2:%.+]]> = select vp<[[MASK1]]> ir<%c.0> ir<false>
|
||||
; CHECK-NEXT: Successor(s): pred.load
|
||||
; CHECK-EMPTY:
|
||||
@@ -454,15 +436,9 @@ define void @pred_cfg2(i32 %k, i32 %j) {
|
||||
; CHECK-NEXT: Successor(s): then.0.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.0.0:
|
||||
; CHECK-NEXT: Successor(s): next.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: next.0:
|
||||
; CHECK-NEXT: EMIT vp<[[NOT:%.+]]> = not ir<%c.0>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK3:%.+]]> = select vp<[[MASK1]]> vp<[[NOT]]> ir<false>
|
||||
; CHECK-NEXT: BLEND %p = ir<0>/vp<[[MASK3]]> vp<[[PRED]]>/vp<[[MASK2]]>
|
||||
; CHECK-NEXT: Successor(s): then.1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.1:
|
||||
; CHECK-NEXT: EMIT vp<[[OR:%.+]]> = or vp<[[MASK2]]> vp<[[MASK3]]>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK4:%.+]]> = select vp<[[OR]]> ir<%c.1> ir<false>
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
@@ -483,9 +459,6 @@ define void @pred_cfg2(i32 %k, i32 %j) {
|
||||
; CHECK-NEXT: Successor(s): then.1.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.1.0:
|
||||
; CHECK-NEXT: Successor(s): next.1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: next.1:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = VF * UF + vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]> vp<[[VEC_TC]]>
|
||||
; CHECK-NEXT: No successors
|
||||
@@ -545,9 +518,6 @@ define void @pred_cfg3(i32 %k, i32 %j) {
|
||||
; CHECK-NEXT: EMIT vp<[[MASK1:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
|
||||
; CHECK-NEXT: WIDEN ir<%mul> = mul ir<%iv>, ir<10>
|
||||
; CHECK-NEXT: WIDEN ir<%c.0> = icmp ult ir<%iv>, ir<%j>
|
||||
; CHECK-NEXT: Successor(s): then.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.0:
|
||||
; CHECK-NEXT: EMIT vp<[[MASK2:%.+]]> = select vp<[[MASK1:%.+]]> ir<%c.0> ir<false>
|
||||
; CHECK-NEXT: Successor(s): pred.load
|
||||
; CHECK-EMPTY:
|
||||
@@ -569,20 +539,11 @@ define void @pred_cfg3(i32 %k, i32 %j) {
|
||||
; CHECK-NEXT: Successor(s): then.0.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.0.0:
|
||||
; CHECK-NEXT: Successor(s): next.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: next.0:
|
||||
; CHECK-NEXT: EMIT vp<[[NOT:%.+]]> = not ir<%c.0>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK3:%.+]]> = select vp<[[MASK1]]> vp<[[NOT]]> ir<false>
|
||||
; CHECK-NEXT: BLEND %p = ir<0>/vp<[[MASK3]]> vp<[[PRED]]>/vp<[[MASK2]]>
|
||||
; CHECK-NEXT: Successor(s): then.1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.1:
|
||||
; CHECK-NEXT: EMIT vp<[[MASK4:%.+]]> = or vp<[[MASK2]]> vp<[[MASK3]]>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK5:%.+]]> = select vp<[[MASK4]]> ir<%c.0> ir<false>
|
||||
; CHECK-NEXT: Successor(s): then.1.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.1.0:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.store: {
|
||||
@@ -603,9 +564,6 @@ define void @pred_cfg3(i32 %k, i32 %j) {
|
||||
; CHECK-NEXT: Successor(s): then.1.1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.1.1:
|
||||
; CHECK-NEXT: Successor(s): next.1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: next.1:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = VF * UF + vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]> vp<[[VEC_TC]]>
|
||||
; CHECK-NEXT: No successors
|
||||
@@ -664,15 +622,6 @@ define void @merge_3_replicate_region(i32 %k, i32 %j) {
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
|
||||
; CHECK-NEXT: REPLICATE ir<%gep.a> = getelementptr ir<@a>, ir<0>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: Successor(s): loop.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0:
|
||||
; CHECK-NEXT: Successor(s): loop.1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.1:
|
||||
; CHECK-NEXT: Successor(s): loop.2
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.2:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.store: {
|
||||
@@ -698,9 +647,6 @@ define void @merge_3_replicate_region(i32 %k, i32 %j) {
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.3:
|
||||
; CHECK-NEXT: WIDEN ir<%c.0> = icmp ult ir<%iv>, ir<%j>
|
||||
; CHECK-NEXT: Successor(s): then.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.0:
|
||||
; CHECK-NEXT: WIDEN ir<%mul> = mul vp<[[PRED1]]>, vp<[[PRED2]]>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK2:%.+]]> = select vp<[[MASK]]> ir<%c.0> ir<false>
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
@@ -721,9 +667,6 @@ define void @merge_3_replicate_region(i32 %k, i32 %j) {
|
||||
; CHECK-NEXT: Successor(s): then.0.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.0.0:
|
||||
; CHECK-NEXT: Successor(s): latch
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: latch:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = VF * UF + vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]> vp<[[VEC_TC]]>
|
||||
; CHECK-NEXT: No successors
|
||||
@@ -779,12 +722,6 @@ define void @update_2_uses_in_same_recipe_in_merged_block(i32 %k) {
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
|
||||
; CHECK-NEXT: REPLICATE ir<%gep.a> = getelementptr ir<@a>, ir<0>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: Successor(s): loop.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0:
|
||||
; CHECK-NEXT: Successor(s): loop.1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.1:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.store: {
|
||||
@@ -867,9 +804,6 @@ define void @recipe_in_merge_candidate_used_by_first_order_recurrence(i32 %k) {
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0:
|
||||
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%for> vp<[[PRED]]>
|
||||
; CHECK-NEXT: Successor(s): loop.1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.1:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.store: {
|
||||
@@ -925,12 +859,6 @@ define void @update_multiple_users(ptr noalias %src, ptr noalias %dst, i1 %c) {
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: Successor(s): loop.then
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.then:
|
||||
; CHECK-NEXT: Successor(s): loop.then.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.then.0:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.store: {
|
||||
@@ -953,9 +881,6 @@ define void @update_multiple_users(ptr noalias %src, ptr noalias %dst, i1 %c) {
|
||||
; CHECK-NEXT: Successor(s): loop.then.1
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.then.1:
|
||||
; CHECK-NEXT: Successor(s): loop.latch
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.latch:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = VF * UF +(nuw) vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]> vp<[[VEC_TC]]>
|
||||
; CHECK-NEXT: No successors
|
||||
@@ -999,14 +924,8 @@ define void @sinking_requires_duplication(ptr %addr) {
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
|
||||
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
|
||||
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%addr>, vp<[[STEPS]]>
|
||||
; CHECK-NEXT: Successor(s): loop.body
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.body:
|
||||
; CHECK-NEXT: WIDEN ir<%0> = load ir<%gep>
|
||||
; CHECK-NEXT: WIDEN ir<%pred> = fcmp oeq ir<%0>, ir<0.000000e+00>
|
||||
; CHECK-NEXT: Successor(s): then
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then:
|
||||
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = not ir<%pred>
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
@@ -1026,9 +945,6 @@ define void @sinking_requires_duplication(ptr %addr) {
|
||||
; CHECK-NEXT: Successor(s): then.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: then.0:
|
||||
; CHECK-NEXT: Successor(s): loop.latch
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.latch:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = VF * UF +(nuw) vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]> vp<[[VEC_TC]]>
|
||||
; CHECK-NEXT: No successors
|
||||
@@ -1079,9 +995,6 @@ define void @merge_with_dead_gep_between_regions(i32 %n, ptr noalias %src, ptr n
|
||||
; CHECK-NEXT: vp<[[SCALAR_STEPS:%.+]]> = SCALAR-STEPS vp<[[DERIVED_IV]]>, ir<-1>
|
||||
; CHECK-NEXT: EMIT vp<[[WIDE_IV:%.+]]> = WIDEN-CANONICAL-INDUCTION vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule vp<[[WIDE_IV]]> vp<[[BTC]]>
|
||||
; CHECK-NEXT: Successor(s): loop.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.0:
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <xVFxUF> pred.store: {
|
||||
@@ -1146,9 +1059,6 @@ define void @ptr_induction_remove_dead_recipe(ptr %start, ptr %end) {
|
||||
; CHECK-NEXT: CLONE ir<%ptr.iv.next> = getelementptr ir<%ptr.iv>, ir<-1>
|
||||
; CHECK-NEXT: WIDEN ir<%l> = load ir<%ptr.iv.next>
|
||||
; CHECK-NEXT: WIDEN ir<%c.1> = icmp eq ir<%l>, ir<0>
|
||||
; CHECK-NEXT: Successor(s): if.then
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: if.then:
|
||||
; CHECK-NEXT: EMIT vp<[[NEG:%.+]]> = not ir<%c.1>
|
||||
; CHECK-NEXT: Successor(s): pred.store
|
||||
; CHECK-EMPTY:
|
||||
@@ -1168,9 +1078,6 @@ define void @ptr_induction_remove_dead_recipe(ptr %start, ptr %end) {
|
||||
; CHECK-NEXT: Successor(s): if.then.0
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: if.then.0:
|
||||
; CHECK-NEXT: Successor(s): loop.latch
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: loop.latch:
|
||||
; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = VF * UF +(nuw) vp<[[CAN_IV]]>
|
||||
; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]> vp<[[VEC_TC]]>
|
||||
; CHECK-NEXT: No successors
|
||||
|
||||
Reference in New Issue
Block a user