@@ -9324,52 +9324,6 @@ void VPReplicateRecipe::execute(VPTransformState &State) {
9324
9324
State.ILV ->scalarizeInstruction (UI, this , VPIteration (Part, Lane), State);
9325
9325
}
9326
9326
9327
- // / Creates either vp_store or vp_scatter intrinsics calls to represent
9328
- // / predicated store/scatter.
9329
- static Instruction *
9330
- lowerStoreUsingVectorIntrinsics (IRBuilderBase &Builder, Value *Addr,
9331
- Value *StoredVal, bool IsScatter, Value *Mask,
9332
- Value *EVL, const Align &Alignment) {
9333
- CallInst *Call;
9334
- if (IsScatter) {
9335
- Call = Builder.CreateIntrinsic (Type::getVoidTy (EVL->getContext ()),
9336
- Intrinsic::vp_scatter,
9337
- {StoredVal, Addr, Mask, EVL});
9338
- } else {
9339
- VectorBuilder VBuilder (Builder);
9340
- VBuilder.setEVL (EVL).setMask (Mask);
9341
- Call = cast<CallInst>(VBuilder.createVectorInstruction (
9342
- Instruction::Store, Type::getVoidTy (EVL->getContext ()),
9343
- {StoredVal, Addr}));
9344
- }
9345
- Call->addParamAttr (
9346
- 1 , Attribute::getWithAlignment (Call->getContext (), Alignment));
9347
- return Call;
9348
- }
9349
-
9350
- // / Creates either vp_load or vp_gather intrinsics calls to represent
9351
- // / predicated load/gather.
9352
- static Instruction *lowerLoadUsingVectorIntrinsics (IRBuilderBase &Builder,
9353
- VectorType *DataTy,
9354
- Value *Addr, bool IsGather,
9355
- Value *Mask, Value *EVL,
9356
- const Align &Alignment) {
9357
- CallInst *Call;
9358
- if (IsGather) {
9359
- Call =
9360
- Builder.CreateIntrinsic (DataTy, Intrinsic::vp_gather, {Addr, Mask, EVL},
9361
- nullptr , " wide.masked.gather" );
9362
- } else {
9363
- VectorBuilder VBuilder (Builder);
9364
- VBuilder.setEVL (EVL).setMask (Mask);
9365
- Call = cast<CallInst>(VBuilder.createVectorInstruction (
9366
- Instruction::Load, DataTy, Addr, " vp.op.load" ));
9367
- }
9368
- Call->addParamAttr (
9369
- 0 , Attribute::getWithAlignment (Call->getContext (), Alignment));
9370
- return Call;
9371
- }
9372
-
9373
9327
void VPWidenLoadRecipe::execute (VPTransformState &State) {
9374
9328
auto *LI = cast<LoadInst>(&Ingredient);
9375
9329
@@ -9391,48 +9345,62 @@ void VPWidenLoadRecipe::execute(VPTransformState &State) {
9391
9345
Mask = Builder.CreateVectorReverse (Mask, " reverse" );
9392
9346
}
9393
9347
9394
- // TODO: split this into several classes for better design.
9395
- if (State.EVL ) {
9396
- assert (State.UF == 1 && " Expected only UF == 1 when vectorizing with "
9397
- " explicit vector length." );
9398
- assert (cast<VPInstruction>(State.EVL )->getOpcode () ==
9399
- VPInstruction::ExplicitVectorLength &&
9400
- " EVL must be VPInstruction::ExplicitVectorLength." );
9401
- Value *EVL = State.get (State.EVL , VPIteration (0 , 0 ));
9402
- // If EVL is not nullptr, then EVL must be a valid value set during plan
9403
- // creation, possibly default value = whole vector register length. EVL
9404
- // is created only if TTI prefers predicated vectorization, thus if EVL
9405
- // is not nullptr it also implies preference for predicated
9406
- // vectorization.
9407
- // FIXME: Support reverse loading after vp_reverse is added.
9408
- NewLI = lowerLoadUsingVectorIntrinsics (
9409
- Builder, DataTy, State.get (getAddr (), Part, !CreateGather),
9410
- CreateGather, Mask, EVL, Alignment);
9411
- } else if (CreateGather) {
9412
- Value *VectorGep = State.get (getAddr (), Part);
9413
- NewLI = Builder.CreateMaskedGather (DataTy, VectorGep, Alignment, Mask,
9414
- nullptr , " wide.masked.gather" );
9415
- State.addMetadata (NewLI, LI);
9348
+ Value *Addr = State.get (getAddr (), Part, /* IsScalar*/ !CreateGather);
9349
+ if (CreateGather) {
9350
+ NewLI = Builder.CreateMaskedGather (DataTy, Addr, Alignment, Mask, nullptr ,
9351
+ " wide.masked.gather" );
9352
+ } else if (Mask) {
9353
+ NewLI = Builder.CreateMaskedLoad (DataTy, Addr, Alignment, Mask,
9354
+ PoisonValue::get (DataTy),
9355
+ " wide.masked.load" );
9416
9356
} else {
9417
- auto *VecPtr = State.get (getAddr (), Part, /* IsScalar*/ true );
9418
- if (Mask)
9419
- NewLI = Builder.CreateMaskedLoad (DataTy, VecPtr, Alignment, Mask,
9420
- PoisonValue::get (DataTy),
9421
- " wide.masked.load" );
9422
- else
9423
- NewLI =
9424
- Builder.CreateAlignedLoad (DataTy, VecPtr, Alignment, " wide.load" );
9425
-
9426
- // Add metadata to the load, but setVectorValue to the reverse shuffle.
9427
- State.addMetadata (NewLI, LI);
9428
- if (Reverse)
9429
- NewLI = Builder.CreateVectorReverse (NewLI, " reverse" );
9357
+ NewLI = Builder.CreateAlignedLoad (DataTy, Addr, Alignment, " wide.load" );
9430
9358
}
9431
-
9359
+ // Add metadata to the load, but setVectorValue to the reverse shuffle.
9360
+ State.addMetadata (NewLI, LI);
9361
+ if (Reverse)
9362
+ NewLI = Builder.CreateVectorReverse (NewLI, " reverse" );
9432
9363
State.set (this , NewLI, Part);
9433
9364
}
9434
9365
}
9435
9366
9367
+ void VPWidenLoadEVLRecipe::execute (VPTransformState &State) {
9368
+ assert (State.UF == 1 && " Expected only UF == 1 when vectorizing with "
9369
+ " explicit vector length." );
9370
+ // FIXME: Support reverse loading after vp_reverse is added.
9371
+ assert (!isReverse () && " Reverse loads are not implemented yet." );
9372
+
9373
+ auto *LI = cast<LoadInst>(&Ingredient);
9374
+
9375
+ Type *ScalarDataTy = getLoadStoreType (&Ingredient);
9376
+ auto *DataTy = VectorType::get (ScalarDataTy, State.VF );
9377
+ const Align Alignment = getLoadStoreAlignment (&Ingredient);
9378
+ bool CreateGather = !isConsecutive ();
9379
+
9380
+ auto &Builder = State.Builder ;
9381
+ State.setDebugLocFrom (getDebugLoc ());
9382
+ CallInst *NewLI;
9383
+ Value *EVL = State.get (getEVL (), VPIteration (0 , 0 ));
9384
+ Value *Addr = State.get (getAddr (), 0 , !CreateGather);
9385
+ Value *Mask =
9386
+ getMask () ? State.get (getMask (), 0 )
9387
+ : Mask = Builder.CreateVectorSplat (State.VF , Builder.getTrue ());
9388
+ if (CreateGather) {
9389
+ NewLI =
9390
+ Builder.CreateIntrinsic (DataTy, Intrinsic::vp_gather, {Addr, Mask, EVL},
9391
+ nullptr , " wide.masked.gather" );
9392
+ } else {
9393
+ VectorBuilder VBuilder (Builder);
9394
+ VBuilder.setEVL (EVL).setMask (Mask);
9395
+ NewLI = cast<CallInst>(VBuilder.createVectorInstruction (
9396
+ Instruction::Load, DataTy, Addr, " vp.op.load" ));
9397
+ }
9398
+ NewLI->addParamAttr (
9399
+ 0 , Attribute::getWithAlignment (NewLI->getContext (), Alignment));
9400
+ State.addMetadata (NewLI, LI);
9401
+ State.set (this , NewLI, 0 );
9402
+ }
9403
+
9436
9404
void VPWidenStoreRecipe::execute (VPTransformState &State) {
9437
9405
auto *SI = cast<StoreInst>(&Ingredient);
9438
9406
@@ -9456,45 +9424,62 @@ void VPWidenStoreRecipe::execute(VPTransformState &State) {
9456
9424
9457
9425
Value *StoredVal = State.get (StoredVPValue, Part);
9458
9426
if (isReverse ()) {
9459
- assert (!State.EVL && " reversing not yet implemented with EVL" );
9460
9427
// If we store to reverse consecutive memory locations, then we need
9461
9428
// to reverse the order of elements in the stored value.
9462
9429
StoredVal = Builder.CreateVectorReverse (StoredVal, " reverse" );
9463
9430
// We don't want to update the value in the map as it might be used in
9464
9431
// another expression. So don't call resetVectorValue(StoredVal).
9465
9432
}
9466
- // TODO: split this into several classes for better design.
9467
- if (State.EVL ) {
9468
- assert (State.UF == 1 && " Expected only UF == 1 when vectorizing with "
9469
- " explicit vector length." );
9470
- assert (cast<VPInstruction>(State.EVL )->getOpcode () ==
9471
- VPInstruction::ExplicitVectorLength &&
9472
- " EVL must be VPInstruction::ExplicitVectorLength." );
9473
- Value *EVL = State.get (State.EVL , VPIteration (0 , 0 ));
9474
- // If EVL is not nullptr, then EVL must be a valid value set during plan
9475
- // creation, possibly default value = whole vector register length. EVL
9476
- // is created only if TTI prefers predicated vectorization, thus if EVL
9477
- // is not nullptr it also implies preference for predicated
9478
- // vectorization.
9479
- // FIXME: Support reverse store after vp_reverse is added.
9480
- NewSI = lowerStoreUsingVectorIntrinsics (
9481
- Builder, State.get (getAddr (), Part, !CreateScatter), StoredVal,
9482
- CreateScatter, Mask, EVL, Alignment);
9483
- } else if (CreateScatter) {
9484
- Value *VectorGep = State.get (getAddr (), Part);
9485
- NewSI =
9486
- Builder.CreateMaskedScatter (StoredVal, VectorGep, Alignment, Mask);
9487
- } else {
9488
- auto *VecPtr = State.get (getAddr (), Part, /* IsScalar*/ true );
9489
- if (Mask)
9490
- NewSI = Builder.CreateMaskedStore (StoredVal, VecPtr, Alignment, Mask);
9491
- else
9492
- NewSI = Builder.CreateAlignedStore (StoredVal, VecPtr, Alignment);
9493
- }
9433
+ Value *Addr = State.get (getAddr (), Part, /* IsScalar*/ !CreateScatter);
9434
+ if (CreateScatter)
9435
+ NewSI = Builder.CreateMaskedScatter (StoredVal, Addr, Alignment, Mask);
9436
+ else if (Mask)
9437
+ NewSI = Builder.CreateMaskedStore (StoredVal, Addr, Alignment, Mask);
9438
+ else
9439
+ NewSI = Builder.CreateAlignedStore (StoredVal, Addr, Alignment);
9494
9440
State.addMetadata (NewSI, SI);
9495
9441
}
9496
9442
}
9497
9443
9444
+ void VPWidenStoreEVLRecipe::execute (VPTransformState &State) {
9445
+ assert (State.UF == 1 && " Expected only UF == 1 when vectorizing with "
9446
+ " explicit vector length." );
9447
+ // FIXME: Support reverse loading after vp_reverse is added.
9448
+ assert (!isReverse () && " Reverse store are not implemented yet." );
9449
+
9450
+ auto *SI = cast<StoreInst>(&Ingredient);
9451
+
9452
+ VPValue *StoredValue = getStoredValue ();
9453
+ bool CreateScatter = !isConsecutive ();
9454
+ const Align Alignment = getLoadStoreAlignment (&Ingredient);
9455
+
9456
+ auto &Builder = State.Builder ;
9457
+ State.setDebugLocFrom (getDebugLoc ());
9458
+
9459
+ CallInst *NewSI = nullptr ;
9460
+ Value *StoredVal = State.get (StoredValue, 0 );
9461
+ Value *EVL = State.get (getEVL (), VPIteration (0 , 0 ));
9462
+ // FIXME: Support reverse store after vp_reverse is added.
9463
+ Value *Mask =
9464
+ getMask () ? State.get (getMask (), 0 )
9465
+ : Mask = Builder.CreateVectorSplat (State.VF , Builder.getTrue ());
9466
+ Value *Addr = State.get (getAddr (), 0 , !CreateScatter);
9467
+ if (CreateScatter) {
9468
+ NewSI = Builder.CreateIntrinsic (Type::getVoidTy (EVL->getContext ()),
9469
+ Intrinsic::vp_scatter,
9470
+ {StoredVal, Addr, Mask, EVL});
9471
+ } else {
9472
+ VectorBuilder VBuilder (Builder);
9473
+ VBuilder.setEVL (EVL).setMask (Mask);
9474
+ NewSI = cast<CallInst>(VBuilder.createVectorInstruction (
9475
+ Instruction::Store, Type::getVoidTy (EVL->getContext ()),
9476
+ {StoredVal, Addr}));
9477
+ }
9478
+ NewSI->addParamAttr (
9479
+ 1 , Attribute::getWithAlignment (NewSI->getContext (), Alignment));
9480
+ State.addMetadata (NewSI, SI);
9481
+ }
9482
+
9498
9483
// Determine how to lower the scalar epilogue, which depends on 1) optimising
9499
9484
// for minimum code-size, 2) predicate compiler options, 3) loop hints forcing
9500
9485
// predication, and 4) a TTI hook that analyses whether the loop is suitable
0 commit comments