Skip to content

Commit 02787c9

Browse files
committed
[VPlan] Unroll directly; index type changed
1 parent c443385 commit 02787c9

File tree

126 files changed

+1752
-1745
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

126 files changed

+1752
-1745
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7607,10 +7607,13 @@ VPWidenMemoryRecipe *VPRecipeBuilder::tryToWidenMemory(VPInstruction *VPI,
76077607
Ptr, &Plan.getVF(), getLoadStoreType(I),
76087608
/*Stride*/ -1, Flags, VPI->getDebugLoc());
76097609
} else {
7610-
VectorPtr = new VPVectorPointerRecipe(
7611-
Ptr, &Plan.getVF(), getLoadStoreType(I),
7612-
GEP ? GEP->getNoWrapFlags() : GEPNoWrapFlags::none(),
7613-
VPI->getDebugLoc());
7610+
const DataLayout &DL = I->getDataLayout();
7611+
VPValue *Offset = Plan.getConstantInt(
7612+
DL.getIndexType(Ptr->getUnderlyingValue()->getType()), 0);
7613+
VectorPtr = new VPVectorPointerRecipe(Ptr, Offset, getLoadStoreType(I),
7614+
GEP ? GEP->getNoWrapFlags()
7615+
: GEPNoWrapFlags::none(),
7616+
VPI->getDebugLoc());
76147617
}
76157618
Builder.insert(VectorPtr);
76167619
Ptr = VectorPtr;

llvm/lib/Transforms/Vectorize/VPlan.h

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1977,21 +1977,21 @@ class VPVectorEndPointerRecipe : public VPRecipeWithIRFlags,
19771977
#endif
19781978
};
19791979

1980-
/// A recipe to compute the pointers for widened memory accesses of IndexTy.
1981-
class VPVectorPointerRecipe : public VPRecipeWithIRFlags,
1982-
public VPUnrollPartAccessor<2> {
1980+
/// A recipe to compute the pointers for widened memory accesses of
1981+
/// SourceElementTy.
1982+
class VPVectorPointerRecipe : public VPRecipeWithIRFlags {
19831983
Type *SourceElementTy;
19841984

19851985
public:
1986-
VPVectorPointerRecipe(VPValue *Ptr, VPValue *VF, Type *SourceElementTy,
1986+
VPVectorPointerRecipe(VPValue *Ptr, VPValue *Offset, Type *SourceElementTy,
19871987
GEPNoWrapFlags GEPFlags, DebugLoc DL)
1988-
: VPRecipeWithIRFlags(VPDef::VPVectorPointerSC, {Ptr, VF}, GEPFlags, DL),
1988+
: VPRecipeWithIRFlags(VPDef::VPVectorPointerSC, {Ptr, Offset}, GEPFlags,
1989+
DL),
19891990
SourceElementTy(SourceElementTy) {}
19901991

19911992
VP_CLASSOF_IMPL(VPDef::VPVectorPointerSC)
19921993

1993-
VPValue *getVFValue() { return getOperand(1); }
1994-
const VPValue *getVFValue() const { return getOperand(1); }
1994+
VPValue *getOffset() { return getOperand(1); }
19951995

19961996
void execute(VPTransformState &State) override;
19971997

@@ -2012,15 +2012,11 @@ class VPVectorPointerRecipe : public VPRecipeWithIRFlags,
20122012
}
20132013

20142014
VPVectorPointerRecipe *clone() override {
2015-
return new VPVectorPointerRecipe(getOperand(0), getVFValue(),
2015+
return new VPVectorPointerRecipe(getOperand(0), getOffset(),
20162016
SourceElementTy, getGEPNoWrapFlags(),
20172017
getDebugLoc());
20182018
}
20192019

2020-
/// Return true if this VPVectorPointerRecipe corresponds to part 0. Note that
2021-
/// this is only accurate after the VPlan has been unrolled.
2022-
bool isFirstPart() const { return getUnrollPart(*this) == 0; }
2023-
20242020
/// Return the cost of this VPHeaderPHIRecipe.
20252021
InstructionCost computeCost(ElementCount VF,
20262022
VPCostContext &Ctx) const override {

llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2657,20 +2657,13 @@ void VPVectorEndPointerRecipe::printRecipe(raw_ostream &O, const Twine &Indent,
26572657

26582658
void VPVectorPointerRecipe::execute(VPTransformState &State) {
26592659
auto &Builder = State.Builder;
2660-
unsigned CurrentPart = getUnrollPart(*this);
2661-
Type *IndexTy = getGEPIndexTy(State.VF.isScalable(), /*IsReverse*/ false,
2662-
/*IsUnitStride*/ true, CurrentPart, Builder);
26632660
Value *Ptr = State.get(getOperand(0), VPLane(0));
2664-
2665-
Value *RuntimeVF = State.get(getVFValue(), VPLane(0));
2666-
RuntimeVF = Builder.CreateZExtOrTrunc(RuntimeVF, IndexTy);
2667-
Value *Increment =
2668-
CurrentPart == 1 ? RuntimeVF
2669-
: Builder.CreateNUWMul(
2670-
RuntimeVF, ConstantInt::get(IndexTy, CurrentPart));
2671-
Value *ResultPtr = Builder.CreateGEP(getSourceElementType(), Ptr, Increment,
2672-
"", getGEPNoWrapFlags());
2673-
2661+
Value *Step = State.get(getOffset(), true);
2662+
if (auto *C = dyn_cast<ConstantInt>(Step))
2663+
if (C->isZero())
2664+
return State.set(this, Ptr, /*IsScalar=*/true);
2665+
Value *ResultPtr = Builder.CreateGEP(getSourceElementType(), Ptr, Step,
2666+
"vector.pointer", getGEPNoWrapFlags());
26742667
State.set(this, ResultPtr, /*IsScalar*/ true);
26752668
}
26762669

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,6 +1366,10 @@ static void simplifyRecipe(VPSingleDefRecipe *Def, VPTypeAnalysis &TypeInfo) {
13661366
if (!Plan->isUnrolled())
13671367
return;
13681368

1369+
// Simplify X + 0 -> X
1370+
if (match(Def, m_c_Add(m_VPValue(X), m_ZeroInt())))
1371+
return Def->replaceAllUsesWith(X);
1372+
13691373
// Hoist an invariant increment Y of a phi X, by having X start at Y.
13701374
if (match(Def, m_c_Add(m_VPValue(X), m_VPValue(Y))) && Y->isLiveIn() &&
13711375
isa<VPPhi>(X)) {
@@ -1378,14 +1382,6 @@ static void simplifyRecipe(VPSingleDefRecipe *Def, VPTypeAnalysis &TypeInfo) {
13781382
}
13791383
}
13801384

1381-
// VPVectorPointer for part 0 can be replaced by their start pointer.
1382-
if (auto *VecPtr = dyn_cast<VPVectorPointerRecipe>(Def)) {
1383-
if (VecPtr->isFirstPart()) {
1384-
VecPtr->replaceAllUsesWith(VecPtr->getOperand(0));
1385-
return;
1386-
}
1387-
}
1388-
13891385
// VPScalarIVSteps for part 0 can be replaced by their start value, if only
13901386
// the first lane is demanded.
13911387
if (auto *Steps = dyn_cast<VPScalarIVStepsRecipe>(Def)) {

llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,22 @@ void UnrollState::unrollRecipeByUF(VPRecipeBase &R) {
298298
Copy->setOperand(1, getValueForPart(Op, Part));
299299
continue;
300300
}
301+
if (auto *VPR = dyn_cast<VPVectorPointerRecipe>(&R)) {
302+
VPBuilder Builder(VPR);
303+
auto *Prev = cast<VPVectorPointerRecipe>(getValueForPart(VPR, Part - 1))
304+
->getOperand(1);
305+
VPValue *Increment = &Plan.getVF();
306+
Type *IncTy = TypeInfo.inferScalarType(Increment);
307+
Increment = Builder.createScalarZExtOrTrunc(
308+
Increment, TypeInfo.inferScalarType(Prev), IncTy,
309+
DebugLoc::getCompilerGenerated());
310+
VPIRFlags Flags = VPIRFlags::WrapFlagsTy(true, true);
311+
VPInstruction *Add = Builder.createNaryOp(
312+
Instruction::Add, {Prev, Increment}, Flags, VPR->getDebugLoc());
313+
Copy->setOperand(0, VPR->getOperand(0));
314+
Copy->setOperand(1, Add);
315+
continue;
316+
}
301317
if (auto *Red = dyn_cast<VPReductionRecipe>(&R)) {
302318
auto *Phi = dyn_cast<VPReductionPHIRecipe>(R.getOperand(0));
303319
if (Phi && Phi->isOrdered()) {
@@ -315,12 +331,12 @@ void UnrollState::unrollRecipeByUF(VPRecipeBase &R) {
315331
// Add operand indicating the part to generate code for, to recipes still
316332
// requiring it.
317333
if (isa<VPScalarIVStepsRecipe, VPWidenCanonicalIVRecipe,
318-
VPVectorPointerRecipe, VPVectorEndPointerRecipe>(Copy) ||
334+
VPVectorEndPointerRecipe>(Copy) ||
319335
match(Copy,
320336
m_VPInstruction<VPInstruction::CanonicalIVIncrementForPart>()))
321337
Copy->addOperand(getConstantInt(Part));
322338

323-
if (isa<VPVectorPointerRecipe, VPVectorEndPointerRecipe>(R))
339+
if (isa<VPVectorEndPointerRecipe>(R))
324340
Copy->setOperand(0, R.getOperand(0));
325341
}
326342
}

llvm/test/Transforms/LoopVectorize/AArch64/call-costs.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ define void @fshl_operand_first_order_recurrence(ptr %dst, ptr noalias %src) {
1414
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1515
; CHECK-NEXT: [[VECTOR_RECUR:%.*]] = phi <2 x i64> [ <i64 poison, i64 0>, %[[VECTOR_PH]] ], [ [[WIDE_LOAD1:%.*]], %[[VECTOR_BODY]] ]
1616
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[SRC]], i64 [[INDEX]]
17-
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i64, ptr [[TMP2]], i32 2
17+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i64, ptr [[TMP2]], i64 2
1818
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP2]], align 8
1919
; CHECK-NEXT: [[WIDE_LOAD1]] = load <2 x i64>, ptr [[TMP5]], align 8
2020
; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <2 x i64> [[VECTOR_RECUR]], <2 x i64> [[WIDE_LOAD]], <2 x i32> <i32 1, i32 2>
2121
; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <2 x i64> [[WIDE_LOAD]], <2 x i64> [[WIDE_LOAD1]], <2 x i32> <i32 1, i32 2>
2222
; CHECK-NEXT: [[TMP8:%.*]] = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> splat (i64 1), <2 x i64> [[TMP6]], <2 x i64> splat (i64 1))
2323
; CHECK-NEXT: [[TMP9:%.*]] = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> splat (i64 1), <2 x i64> [[TMP7]], <2 x i64> splat (i64 1))
2424
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i64, ptr [[DST]], i64 [[INDEX]]
25-
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i64, ptr [[TMP10]], i32 2
25+
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i64, ptr [[TMP10]], i64 2
2626
; CHECK-NEXT: store <2 x i64> [[TMP8]], ptr [[TMP10]], align 8
2727
; CHECK-NEXT: store <2 x i64> [[TMP9]], ptr [[TMP13]], align 8
2828
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4

llvm/test/Transforms/LoopVectorize/AArch64/conditional-branches-cost.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ define void @loop_dependent_cond(ptr %src, ptr noalias %dst, i64 %N) {
6363
; DEFAULT: [[VECTOR_BODY]]:
6464
; DEFAULT-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE7:.*]] ]
6565
; DEFAULT-NEXT: [[TMP3:%.*]] = getelementptr double, ptr [[SRC]], i64 [[INDEX]]
66-
; DEFAULT-NEXT: [[TMP6:%.*]] = getelementptr double, ptr [[TMP3]], i32 2
66+
; DEFAULT-NEXT: [[TMP6:%.*]] = getelementptr double, ptr [[TMP3]], i64 2
6767
; DEFAULT-NEXT: [[WIDE_LOAD:%.*]] = load <2 x double>, ptr [[TMP3]], align 8
6868
; DEFAULT-NEXT: [[WIDE_LOAD1:%.*]] = load <2 x double>, ptr [[TMP6]], align 8
6969
; DEFAULT-NEXT: [[TMP7:%.*]] = call <2 x double> @llvm.fabs.v2f64(<2 x double> [[WIDE_LOAD]])
@@ -259,7 +259,7 @@ define void @latch_branch_cost(ptr %dst) {
259259
; DEFAULT: [[VECTOR_BODY]]:
260260
; DEFAULT-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
261261
; DEFAULT-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[DST]], i64 [[INDEX]]
262-
; DEFAULT-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP2]], i32 16
262+
; DEFAULT-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP2]], i64 16
263263
; DEFAULT-NEXT: store <16 x i8> zeroinitializer, ptr [[TMP2]], align 1
264264
; DEFAULT-NEXT: store <16 x i8> zeroinitializer, ptr [[TMP5]], align 1
265265
; DEFAULT-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 32

llvm/test/Transforms/LoopVectorize/AArch64/deterministic-type-shrinkage.ll

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ define void @test_shrink_zext_in_preheader(ptr noalias %src, ptr noalias %dst, i
137137
; CHECK: [[VECTOR_BODY]]:
138138
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
139139
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[DST]], i32 [[INDEX]]
140-
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i8, ptr [[TMP4]], i32 16
140+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i8, ptr [[TMP4]], i64 16
141141
; CHECK-NEXT: store <16 x i8> [[TMP3]], ptr [[TMP4]], align 1
142142
; CHECK-NEXT: store <16 x i8> [[TMP3]], ptr [[TMP5]], align 1
143143
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 32
@@ -210,7 +210,7 @@ define void @test_shrink_select(ptr noalias %src, ptr noalias %dst, i32 %A, i1 %
210210
; CHECK: [[VECTOR_BODY]]:
211211
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
212212
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i8, ptr [[DST]], i32 [[INDEX]]
213-
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8, ptr [[TMP5]], i32 16
213+
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8, ptr [[TMP5]], i64 16
214214
; CHECK-NEXT: store <16 x i8> [[TMP4]], ptr [[TMP5]], align 1
215215
; CHECK-NEXT: store <16 x i8> [[TMP4]], ptr [[TMP6]], align 1
216216
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 32
@@ -279,15 +279,15 @@ define void @trunc_invariant_sdiv_result(i32 %a, i32 %b, ptr noalias %src, ptr %
279279
; CHECK: [[VECTOR_BODY]]:
280280
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
281281
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i64 [[INDEX]]
282-
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i32 16
282+
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i64 16
283283
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[TMP1]], align 1
284284
; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <16 x i8>, ptr [[TMP2]], align 1
285285
; CHECK-NEXT: [[TMP3:%.*]] = zext <16 x i8> [[WIDE_LOAD]] to <16 x i16>
286286
; CHECK-NEXT: [[TMP4:%.*]] = zext <16 x i8> [[WIDE_LOAD1]] to <16 x i16>
287287
; CHECK-NEXT: [[TMP5:%.*]] = mul <16 x i16> [[TMP0]], [[TMP3]]
288288
; CHECK-NEXT: [[TMP6:%.*]] = mul <16 x i16> [[TMP0]], [[TMP4]]
289289
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i16, ptr [[DST]], i64 [[INDEX]]
290-
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i16, ptr [[TMP7]], i32 16
290+
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i16, ptr [[TMP7]], i64 16
291291
; CHECK-NEXT: store <16 x i16> [[TMP5]], ptr [[TMP7]], align 2
292292
; CHECK-NEXT: store <16 x i16> [[TMP6]], ptr [[TMP8]], align 2
293293
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 32
@@ -413,7 +413,7 @@ define void @old_and_new_size_equalko(ptr noalias %src, ptr noalias %dst) {
413413
; CHECK: [[VECTOR_BODY]]:
414414
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
415415
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i64, ptr [[SRC]], i32 [[INDEX]]
416-
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[TMP0]], i32 4
416+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[TMP0]], i64 4
417417
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP0]], align 8
418418
; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i64>, ptr [[TMP1]], align 8
419419
; CHECK-NEXT: [[TMP2:%.*]] = trunc <4 x i64> [[WIDE_LOAD]] to <4 x i1>
@@ -427,15 +427,16 @@ define void @old_and_new_size_equalko(ptr noalias %src, ptr noalias %dst) {
427427
; CHECK-NEXT: [[TMP10:%.*]] = trunc <4 x i64> [[TMP8]] to <4 x i32>
428428
; CHECK-NEXT: [[TMP11:%.*]] = trunc <4 x i64> [[TMP9]] to <4 x i32>
429429
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[INDEX]]
430-
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[TMP12]], i32 4
430+
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[TMP12]], i64 4
431431
; CHECK-NEXT: store <4 x i32> [[TMP10]], ptr [[TMP12]], align 4
432432
; CHECK-NEXT: store <4 x i32> [[TMP11]], ptr [[TMP13]], align 4
433433
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 8
434434
; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1000
435435
; CHECK-NEXT: br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]
436436
; CHECK: [[MIDDLE_BLOCK]]:
437-
; CHECK-NEXT: br [[EXIT:label %.*]]
438-
; CHECK: [[SCALAR_PH:.*:]]
437+
; CHECK-NEXT: br label %[[EXIT:.*]]
438+
; CHECK: [[EXIT]]:
439+
; CHECK-NEXT: ret void
439440
;
440441
entry:
441442
br label %loop

llvm/test/Transforms/LoopVectorize/AArch64/epilog-iv-select-cmp.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ define i8 @select_icmp_var_start(ptr %a, i8 %n, i8 %start) {
2727
; CHECK-NEXT: [[STEP_ADD:%.*]] = add <16 x i8> [[VEC_IND]], splat (i8 16)
2828
; CHECK-NEXT: [[INDEX4:%.*]] = trunc i32 [[INDEX]] to i8
2929
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i8, ptr [[A]], i8 [[INDEX4]]
30-
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i8, ptr [[TMP8]], i32 16
30+
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i8, ptr [[TMP8]], i64 16
3131
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <16 x i8>, ptr [[TMP8]], align 8
3232
; CHECK-NEXT: [[WIDE_LOAD3:%.*]] = load <16 x i8>, ptr [[TMP7]], align 8
3333
; CHECK-NEXT: [[TMP17:%.*]] = icmp eq <16 x i8> [[WIDE_LOAD]], splat (i8 3)

0 commit comments

Comments
 (0)