[VPlan] Simplify reverse(reverse(x)) -> x (#199057)
This is a version of #196900 that performs the simplification as a separate transform. We need to add an additional `vp.splice.right(vp.splice.left(poison, x, evl), poison, evl) -> x` simplification to avoid left over splices whenever reverses are removed in an EVL tail folded loop. Co-authored-by: Madhur Amilkanthwar <madhura@nvidia.com>
This commit is contained in:
parent
0a04c148c1
commit
ccef34d45a
6 changed files with 96 additions and 23 deletions
|
|
@ -1853,6 +1853,15 @@ void VPlanTransforms::simplifyRecipes(VPlan &Plan) {
|
|||
}
|
||||
}
|
||||
|
||||
void VPlanTransforms::simplifyReverses(VPlan &Plan) {
|
||||
VPValue *X;
|
||||
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
|
||||
vp_depth_first_deep(Plan.getEntry())))
|
||||
for (VPRecipeBase &R : make_early_inc_range(*VPBB))
|
||||
if (match(&R, m_Reverse(m_Reverse(m_VPValue(X)))))
|
||||
R.getVPSingleValue()->replaceAllUsesWith(X);
|
||||
}
|
||||
|
||||
/// Reassociate (headermask && x) && y -> headermask && (x && y) to allow the
|
||||
/// header mask to be simplified further when tail folding, e.g. in
|
||||
/// optimizeEVLMasks.
|
||||
|
|
@ -2822,6 +2831,7 @@ void VPlanTransforms::optimize(VPlan &Plan) {
|
|||
RUN_VPLAN_PASS(reassociateHeaderMask, Plan);
|
||||
RUN_VPLAN_PASS(simplifyRecipes, Plan);
|
||||
RUN_VPLAN_PASS(removeBranchOnConst, Plan, /*OnlyLatches=*/false);
|
||||
RUN_VPLAN_PASS(simplifyReverses, Plan);
|
||||
RUN_VPLAN_PASS(removeDeadRecipes, Plan);
|
||||
|
||||
RUN_VPLAN_PASS(createAndOptimizeReplicateRegions, Plan);
|
||||
|
|
@ -3155,11 +3165,22 @@ void VPlanTransforms::optimizeEVLMasks(VPlan &Plan) {
|
|||
}
|
||||
}
|
||||
|
||||
// Fold the following splice patterns into vp.reverse for reverse accesses:
|
||||
// Fold the following splice patterns:
|
||||
// splice.right(splice.left(poison, x, evl), poison, evl) -> x
|
||||
// vector.reverse(splice.left(poison, x, evl)) -> vp.reverse(x, true, evl)
|
||||
// splice.right(vector.reverse(x), poison, evl) -> vp.reverse(x, true, evl)
|
||||
for (VPUser *U : collectUsersRecursively(EVL)) {
|
||||
auto *R = cast<VPRecipeBase>(U);
|
||||
VPValue *X;
|
||||
if (match(U, m_Intrinsic<Intrinsic::vector_splice_right>(
|
||||
m_Intrinsic<Intrinsic::vector_splice_left>(
|
||||
m_Poison(), m_VPValue(X), m_Specific(EVL)),
|
||||
m_Poison(), m_Specific(EVL)))) {
|
||||
R->getVPSingleValue()->replaceAllUsesWith(X);
|
||||
OldRecipes.push_back(R);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!match(U,
|
||||
m_CombineOr(
|
||||
m_Reverse(m_Intrinsic<Intrinsic::vector_splice_left>(
|
||||
|
|
@ -3168,13 +3189,12 @@ void VPlanTransforms::optimizeEVLMasks(VPlan &Plan) {
|
|||
m_Reverse(m_VPValue(X)), m_Poison(), m_Specific(EVL)))))
|
||||
continue;
|
||||
|
||||
auto *Def = cast<VPSingleDefRecipe>(U);
|
||||
auto *VPReverse = new VPWidenIntrinsicRecipe(
|
||||
Intrinsic::experimental_vp_reverse, {X, Plan.getTrue(), EVL},
|
||||
X->getScalarType(), {}, {}, Def->getDebugLoc());
|
||||
VPReverse->insertBefore(Def);
|
||||
Def->replaceAllUsesWith(VPReverse);
|
||||
OldRecipes.push_back(Def);
|
||||
X->getScalarType(), {}, {}, R->getDebugLoc());
|
||||
VPReverse->insertBefore(R);
|
||||
R->getVPSingleValue()->replaceAllUsesWith(VPReverse);
|
||||
OldRecipes.push_back(R);
|
||||
}
|
||||
|
||||
for (VPRecipeBase *R : reverse(OldRecipes)) {
|
||||
|
|
|
|||
|
|
@ -388,6 +388,9 @@ struct VPlanTransforms {
|
|||
/// Perform instcombine-like simplifications on recipes in \p Plan.
|
||||
static void simplifyRecipes(VPlan &Plan);
|
||||
|
||||
/// Cancel out redundant reverses in \p Plan, e.g. reverse(reverse(x)) -> x.
|
||||
static void simplifyReverses(VPlan &Plan);
|
||||
|
||||
/// Remove BranchOnCond recipes with true or false conditions together with
|
||||
/// removing dead edges to their successors. If \p OnlyLatches is true, only
|
||||
/// process loop latches. Returns true if incoming values from any phi-like
|
||||
|
|
|
|||
|
|
@ -25,11 +25,9 @@ define void @reverse_load_store(i64 %startval, ptr noalias %ptr, ptr noalias %pt
|
|||
; IF-EVL-NEXT: [[TMP6:%.*]] = sub i64 0, [[TMP4]]
|
||||
; IF-EVL-NEXT: [[TMP12:%.*]] = getelementptr i32, ptr [[TMP8]], i64 [[TMP6]]
|
||||
; IF-EVL-NEXT: [[VP_OP_LOAD:%.*]] = call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr align 4 [[TMP12]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP5]])
|
||||
; IF-EVL-NEXT: [[VP_REVERSE:%.*]] = call <vscale x 4 x i32> @llvm.experimental.vp.reverse.nxv4i32(<vscale x 4 x i32> [[VP_OP_LOAD]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP5]])
|
||||
; IF-EVL-NEXT: [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[PTR2:%.*]], i64 [[TMP7]]
|
||||
; IF-EVL-NEXT: [[TMP17:%.*]] = getelementptr i32, ptr [[TMP13]], i64 [[TMP6]]
|
||||
; IF-EVL-NEXT: [[VP_REVERSE3:%.*]] = call <vscale x 4 x i32> @llvm.experimental.vp.reverse.nxv4i32(<vscale x 4 x i32> [[VP_REVERSE]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP5]])
|
||||
; IF-EVL-NEXT: call void @llvm.vp.store.nxv4i32.p0(<vscale x 4 x i32> [[VP_REVERSE3]], ptr align 4 [[TMP17]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP5]])
|
||||
; IF-EVL-NEXT: call void @llvm.vp.store.nxv4i32.p0(<vscale x 4 x i32> [[VP_OP_LOAD]], ptr align 4 [[TMP17]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP5]])
|
||||
; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP20]], [[EVL_BASED_IV]]
|
||||
; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[AVL]], [[TMP20]]
|
||||
; IF-EVL-NEXT: [[TMP24:%.*]] = icmp eq i64 [[AVL_NEXT]], 0
|
||||
|
|
@ -63,11 +61,9 @@ define void @reverse_load_store(i64 %startval, ptr noalias %ptr, ptr noalias %pt
|
|||
; NO-VP-NEXT: [[TMP12:%.*]] = sub i64 0, [[TMP9]]
|
||||
; NO-VP-NEXT: [[TMP14:%.*]] = getelementptr inbounds i32, ptr [[TMP13]], i64 [[TMP12]]
|
||||
; NO-VP-NEXT: [[WIDE_LOAD:%.*]] = load <vscale x 4 x i32>, ptr [[TMP14]], align 4
|
||||
; NO-VP-NEXT: [[REVERSE:%.*]] = call <vscale x 4 x i32> @llvm.vector.reverse.nxv4i32(<vscale x 4 x i32> [[WIDE_LOAD]])
|
||||
; NO-VP-NEXT: [[TMP15:%.*]] = getelementptr inbounds i32, ptr [[PTR2:%.*]], i64 [[TMP8]]
|
||||
; NO-VP-NEXT: [[TMP20:%.*]] = getelementptr inbounds i32, ptr [[TMP15]], i64 [[TMP12]]
|
||||
; NO-VP-NEXT: [[REVERSE1:%.*]] = call <vscale x 4 x i32> @llvm.vector.reverse.nxv4i32(<vscale x 4 x i32> [[REVERSE]])
|
||||
; NO-VP-NEXT: store <vscale x 4 x i32> [[REVERSE1]], ptr [[TMP20]], align 4
|
||||
; NO-VP-NEXT: store <vscale x 4 x i32> [[WIDE_LOAD]], ptr [[TMP20]], align 4
|
||||
; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP3]]
|
||||
; NO-VP-NEXT: [[TMP21:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
|
||||
; NO-VP-NEXT: br i1 [[TMP21]], label [[MIDDLE_BLOCK:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
|
||||
|
|
@ -134,11 +130,9 @@ define void @reverse_load_store_masked(i64 %startval, ptr noalias %ptr, ptr noal
|
|||
; IF-EVL-NEXT: [[TMP7:%.*]] = sub i64 0, [[TMP15]]
|
||||
; IF-EVL-NEXT: [[TMP20:%.*]] = getelementptr i32, ptr [[TMP16]], i64 [[TMP7]]
|
||||
; IF-EVL-NEXT: [[VP_OP_LOAD4:%.*]] = call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr align 4 [[TMP20]], <vscale x 4 x i1> [[VP_REVERSE_MASK]], i32 [[TMP5]])
|
||||
; IF-EVL-NEXT: [[VP_REVERSE:%.*]] = call <vscale x 4 x i32> @llvm.experimental.vp.reverse.nxv4i32(<vscale x 4 x i32> [[VP_OP_LOAD4]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP5]])
|
||||
; IF-EVL-NEXT: [[TMP21:%.*]] = getelementptr i32, ptr [[PTR2:%.*]], i64 [[TMP11]]
|
||||
; IF-EVL-NEXT: [[TMP25:%.*]] = getelementptr i32, ptr [[TMP21]], i64 [[TMP7]]
|
||||
; IF-EVL-NEXT: [[TMP13:%.*]] = call <vscale x 4 x i32> @llvm.experimental.vp.reverse.nxv4i32(<vscale x 4 x i32> [[VP_REVERSE]], <vscale x 4 x i1> splat (i1 true), i32 [[TMP5]])
|
||||
; IF-EVL-NEXT: call void @llvm.vp.store.nxv4i32.p0(<vscale x 4 x i32> [[TMP13]], ptr align 4 [[TMP25]], <vscale x 4 x i1> [[VP_REVERSE_MASK]], i32 [[TMP5]])
|
||||
; IF-EVL-NEXT: call void @llvm.vp.store.nxv4i32.p0(<vscale x 4 x i32> [[VP_OP_LOAD4]], ptr align 4 [[TMP25]], <vscale x 4 x i1> [[VP_REVERSE_MASK]], i32 [[TMP5]])
|
||||
; IF-EVL-NEXT: [[INDEX_EVL_NEXT]] = add nuw i64 [[TMP26]], [[EVL_BASED_IV]]
|
||||
; IF-EVL-NEXT: [[AVL_NEXT]] = sub nuw i64 [[AVL]], [[TMP26]]
|
||||
; IF-EVL-NEXT: [[TMP29:%.*]] = icmp eq i64 [[AVL_NEXT]], 0
|
||||
|
|
@ -177,11 +171,9 @@ define void @reverse_load_store_masked(i64 %startval, ptr noalias %ptr, ptr noal
|
|||
; NO-VP-NEXT: [[TMP16:%.*]] = getelementptr i32, ptr [[TMP15]], i64 [[TMP14]]
|
||||
; NO-VP-NEXT: [[REVERSE:%.*]] = call <vscale x 4 x i1> @llvm.vector.reverse.nxv4i1(<vscale x 4 x i1> [[TMP10]])
|
||||
; NO-VP-NEXT: [[WIDE_MASKED_LOAD:%.*]] = call <vscale x 4 x i32> @llvm.masked.load.nxv4i32.p0(ptr align 4 [[TMP16]], <vscale x 4 x i1> [[REVERSE]], <vscale x 4 x i32> poison)
|
||||
; NO-VP-NEXT: [[REVERSE2:%.*]] = call <vscale x 4 x i32> @llvm.vector.reverse.nxv4i32(<vscale x 4 x i32> [[WIDE_MASKED_LOAD]])
|
||||
; NO-VP-NEXT: [[TMP17:%.*]] = getelementptr i32, ptr [[PTR2:%.*]], i64 [[TMP8]]
|
||||
; NO-VP-NEXT: [[TMP22:%.*]] = getelementptr i32, ptr [[TMP17]], i64 [[TMP14]]
|
||||
; NO-VP-NEXT: [[REVERSE4:%.*]] = call <vscale x 4 x i32> @llvm.vector.reverse.nxv4i32(<vscale x 4 x i32> [[REVERSE2]])
|
||||
; NO-VP-NEXT: call void @llvm.masked.store.nxv4i32.p0(<vscale x 4 x i32> [[REVERSE4]], ptr align 4 [[TMP22]], <vscale x 4 x i1> [[REVERSE]])
|
||||
; NO-VP-NEXT: call void @llvm.masked.store.nxv4i32.p0(<vscale x 4 x i32> [[WIDE_MASKED_LOAD]], ptr align 4 [[TMP22]], <vscale x 4 x i1> [[REVERSE]])
|
||||
; NO-VP-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP3]]
|
||||
; NO-VP-NEXT: [[TMP23:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
|
||||
; NO-VP-NEXT: br i1 [[TMP23]], label [[MIDDLE_BLOCK:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,59 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --filter-out-after "middle.block:" --version 6
|
||||
; RUN: opt -p loop-vectorize -force-vector-width=4 -disable-output -vplan-print-after=simplifyReverses %s 2>&1 | FileCheck %s
|
||||
|
||||
define void @reverse_copy(ptr noalias %src, ptr noalias %dst, i32 %n) {
|
||||
; CHECK-LABEL: VPlan for loop in 'reverse_copy'
|
||||
; CHECK: VPlan 'Initial VPlan for VF={4},UF>=1' {
|
||||
; CHECK-NEXT: Live-in vp<[[VP0:%[0-9]+]]> = VF
|
||||
; CHECK-NEXT: Live-in vp<[[VP1:%[0-9]+]]> = VF * UF
|
||||
; CHECK-NEXT: Live-in vp<[[VP2:%[0-9]+]]> = vector-trip-count
|
||||
; CHECK-NEXT: vp<[[VP3:%[0-9]+]]> = original trip-count
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: ir-bb<entry>:
|
||||
; CHECK-NEXT: EMIT vp<[[VP3]]> = EXPAND SCEV ((-1 * (0 smin (-1 + %n)<nsw>)) + %n)
|
||||
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: vector.ph:
|
||||
; CHECK-NEXT: vp<[[VP4:%[0-9]+]]> = DERIVED-IV ir<%n> + vp<[[VP2]]> * ir<-1>
|
||||
; CHECK-NEXT: Successor(s): vector loop
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: <x1> vector loop: {
|
||||
; CHECK-NEXT: vp<[[VP5:%[0-9]+]]> = CANONICAL-IV
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: vector.body:
|
||||
; CHECK-NEXT: ir<%iv> = WIDEN-INDUCTION nsw ir<%n>, ir<-1>, vp<[[VP0]]>
|
||||
; CHECK-NEXT: vp<[[VP6:%[0-9]+]]> = DERIVED-IV ir<%n> + vp<[[VP5]]> * ir<-1>
|
||||
; CHECK-NEXT: vp<[[VP7:%[0-9]+]]> = SCALAR-STEPS vp<[[VP6]]>, ir<-1>, vp<[[VP0]]>
|
||||
; CHECK-NEXT: CLONE ir<%iv.next> = add nsw vp<[[VP7]]>, ir<-1>
|
||||
; CHECK-NEXT: CLONE ir<%gep.src> = getelementptr ir<%src>, ir<%iv.next>
|
||||
; CHECK-NEXT: vp<[[VP8:%[0-9]+]]> = vector-end-pointer ir<%gep.src>, vp<[[VP0]]>
|
||||
; CHECK-NEXT: WIDEN ir<%x> = load vp<[[VP8]]>
|
||||
; CHECK-NEXT: EMIT vp<[[VP9:%[0-9]+]]> = reverse ir<%x>
|
||||
; CHECK-NEXT: CLONE ir<%gep.dst> = getelementptr ir<%dst>, ir<%iv.next>
|
||||
; CHECK-NEXT: vp<[[VP10:%[0-9]+]]> = vector-end-pointer ir<%gep.dst>, vp<[[VP0]]>
|
||||
; CHECK-NEXT: EMIT vp<[[VP11:%[0-9]+]]> = reverse vp<[[VP9]]>
|
||||
; CHECK-NEXT: WIDEN store vp<[[VP10]]>, ir<%x>
|
||||
; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[VP5]]>, vp<[[VP1]]>
|
||||
; CHECK-NEXT: EMIT branch-on-count vp<%index.next>, vp<[[VP2]]>
|
||||
; CHECK-NEXT: No successors
|
||||
; CHECK-NEXT: }
|
||||
; CHECK-NEXT: Successor(s): middle.block
|
||||
; CHECK-EMPTY:
|
||||
; CHECK-NEXT: middle.block:
|
||||
;
|
||||
entry:
|
||||
br label %loop
|
||||
|
||||
loop:
|
||||
%iv = phi i32 [%n, %entry], [%iv.next, %loop]
|
||||
%iv.next = add nsw i32 %iv, -1
|
||||
%gep.src = getelementptr i32, ptr %src, i32 %iv.next
|
||||
%x = load i32, ptr %gep.src
|
||||
%gep.dst = getelementptr i32, ptr %dst, i32 %iv.next
|
||||
store i32 %x, ptr %gep.dst
|
||||
%ec = icmp sgt i32 %iv.next, 0
|
||||
br i1 %ec, label %loop, label %exit
|
||||
|
||||
exit:
|
||||
ret void
|
||||
}
|
||||
|
|
@ -45,6 +45,7 @@
|
|||
; CHECK: VPlan for loop in 'foo' after reassociateHeaderMask
|
||||
; CHECK: VPlan for loop in 'foo' after simplifyRecipes
|
||||
; CHECK: VPlan for loop in 'foo' after removeBranchOnConst
|
||||
; CHECK: VPlan for loop in 'foo' after simplifyReverses
|
||||
; CHECK: VPlan for loop in 'foo' after removeDeadRecipes
|
||||
; CHECK: VPlan for loop in 'foo' after createAndOptimizeReplicateRegions
|
||||
; CHECK: VPlan for loop in 'foo' after mergeBlocksIntoPredecessors
|
||||
|
|
|
|||
|
|
@ -39,10 +39,8 @@ define void @test_runtime_check_known_false_after_construction(ptr %start.1, ptr
|
|||
; CHECK-NEXT: [[NEXT_GEP3:%.*]] = getelementptr i8, ptr [[START_2_DIFF]], i64 [[OFFSET_IDX]]
|
||||
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr i64, ptr [[NEXT_GEP3]], i64 -3
|
||||
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP14]], align 8
|
||||
; CHECK-NEXT: [[REVERSE:%.*]] = shufflevector <4 x i64> [[WIDE_LOAD]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
|
||||
; CHECK-NEXT: [[TMP16:%.*]] = getelementptr i64, ptr [[NEXT_GEP]], i64 -3
|
||||
; CHECK-NEXT: [[REVERSE4:%.*]] = shufflevector <4 x i64> [[REVERSE]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
|
||||
; CHECK-NEXT: store <4 x i64> [[REVERSE4]], ptr [[TMP16]], align 8
|
||||
; CHECK-NEXT: store <4 x i64> [[WIDE_LOAD]], ptr [[TMP16]], align 8
|
||||
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
|
||||
; CHECK-NEXT: [[TMP17:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
|
||||
; CHECK-NEXT: br i1 [[TMP17]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
|
||||
|
|
@ -51,11 +49,11 @@ define void @test_runtime_check_known_false_after_construction(ptr %start.1, ptr
|
|||
; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
|
||||
; CHECK: [[SCALAR_PH]]:
|
||||
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[TMP10]], %[[MIDDLE_BLOCK]] ], [ [[START_1]], %[[ENTRY]] ], [ [[START_1]], %[[VECTOR_SCEVCHECK]] ]
|
||||
; CHECK-NEXT: [[BC_RESUME_VAL4:%.*]] = phi ptr [ [[TMP11]], %[[MIDDLE_BLOCK]] ], [ [[START_2_DIFF]], %[[ENTRY]] ], [ [[START_2_DIFF]], %[[VECTOR_SCEVCHECK]] ]
|
||||
; CHECK-NEXT: [[BC_RESUME_VAL3:%.*]] = phi ptr [ [[TMP11]], %[[MIDDLE_BLOCK]] ], [ [[START_2_DIFF]], %[[ENTRY]] ], [ [[START_2_DIFF]], %[[VECTOR_SCEVCHECK]] ]
|
||||
; CHECK-NEXT: br label %[[LOOP:.*]]
|
||||
; CHECK: [[LOOP]]:
|
||||
; CHECK-NEXT: [[PTR_IV_1:%.*]] = phi ptr [ [[PTR_IV_1_NEXT:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ]
|
||||
; CHECK-NEXT: [[PTR_IV_2:%.*]] = phi ptr [ [[PTR_IV_2_NEXT:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL4]], %[[SCALAR_PH]] ]
|
||||
; CHECK-NEXT: [[PTR_IV_2:%.*]] = phi ptr [ [[PTR_IV_2_NEXT:%.*]], %[[LOOP]] ], [ [[BC_RESUME_VAL3]], %[[SCALAR_PH]] ]
|
||||
; CHECK-NEXT: [[PTR_IV_2_NEXT]] = getelementptr i8, ptr [[PTR_IV_2]], i64 -8
|
||||
; CHECK-NEXT: [[PTR_IV_1_NEXT]] = getelementptr i8, ptr [[PTR_IV_1]], i64 -8
|
||||
; CHECK-NEXT: [[L:%.*]] = load i64, ptr [[PTR_IV_2]], align 8
|
||||
|
|
|
|||
Loading…
Reference in a new issue