@@ -253,6 +253,21 @@ static bool isReInterleaveMask(ShuffleVectorInst *SVI, unsigned &Factor,
253
253
return false ;
254
254
}
255
255
256
+ static Value *getMaskOperand (IntrinsicInst *II) {
257
+ switch (II->getIntrinsicID ()) {
258
+ default :
259
+ llvm_unreachable (" Unexpected intrinsic" );
260
+ case Intrinsic::vp_load:
261
+ return II->getOperand (1 );
262
+ case Intrinsic::masked_load:
263
+ return II->getOperand (2 );
264
+ case Intrinsic::vp_store:
265
+ return II->getOperand (2 );
266
+ case Intrinsic::masked_store:
267
+ return II->getOperand (3 );
268
+ }
269
+ }
270
+
256
271
// Return the corresponded deinterleaved mask, or nullptr if there is no valid
257
272
// mask.
258
273
static Value *getMask (Value *WideMask, unsigned Factor,
@@ -268,8 +283,12 @@ bool InterleavedAccessImpl::lowerInterleavedLoad(
268
283
if (isa<ScalableVectorType>(Load->getType ()))
269
284
return false ;
270
285
271
- if (auto *LI = dyn_cast<LoadInst>(Load);
272
- LI && !LI->isSimple ())
286
+ auto *LI = dyn_cast<LoadInst>(Load);
287
+ auto *II = dyn_cast<IntrinsicInst>(Load);
288
+ if (!LI && !II)
289
+ return false ;
290
+
291
+ if (LI && !LI->isSimple ())
273
292
return false ;
274
293
275
294
// Check if all users of this load are shufflevectors. If we encounter any
@@ -322,7 +341,7 @@ bool InterleavedAccessImpl::lowerInterleavedLoad(
322
341
// Holds the corresponding index for each DE-interleave shuffle.
323
342
SmallVector<unsigned , 4 > Indices;
324
343
325
- Type *VecTy = FirstSVI->getType ();
344
+ VectorType *VecTy = cast<VectorType>( FirstSVI->getType () );
326
345
327
346
// Check if other shufflevectors are also DE-interleaved of the same type
328
347
// and factor as the first shufflevector.
@@ -360,13 +379,16 @@ bool InterleavedAccessImpl::lowerInterleavedLoad(
360
379
replaceBinOpShuffles (BinOpShuffles.getArrayRef (), Shuffles, Load);
361
380
362
381
Value *Mask = nullptr ;
363
- if (auto *VPLoad = dyn_cast<VPIntrinsic>(Load)) {
364
- Mask = getMask (VPLoad->getMaskParam (), Factor, cast<VectorType>(VecTy));
382
+ if (LI) {
383
+ LLVM_DEBUG (dbgs () << " IA: Found an interleaved load: " << *Load << " \n " );
384
+ } else {
385
+ // Check mask operand. Handle both all-true/false and interleaved mask.
386
+ Mask = getMask (getMaskOperand (II), Factor, VecTy);
365
387
if (!Mask)
366
388
return false ;
367
- LLVM_DEBUG ( dbgs () << " IA: Found an interleaved vp.load: " << *Load << " \n " );
368
- } else {
369
- LLVM_DEBUG ( dbgs () << " IA: Found an interleaved load: " << *Load << " \n " );
389
+
390
+ LLVM_DEBUG ( dbgs () << " IA: Found an interleaved vp.load or masked.load: "
391
+ << *Load << " \n " );
370
392
}
371
393
372
394
// Try to create target specific intrinsics to replace the load and
@@ -483,15 +505,16 @@ bool InterleavedAccessImpl::tryReplaceExtracts(
483
505
bool InterleavedAccessImpl::lowerInterleavedStore (
484
506
Instruction *Store, SmallSetVector<Instruction *, 32 > &DeadInsts) {
485
507
Value *StoredValue;
486
- if (auto *SI = dyn_cast<StoreInst>(Store)) {
508
+ auto *SI = dyn_cast<StoreInst>(Store);
509
+ auto *II = dyn_cast<IntrinsicInst>(Store);
510
+ if (SI) {
487
511
if (!SI->isSimple ())
488
512
return false ;
489
513
StoredValue = SI->getValueOperand ();
490
- } else if (auto *VPStore = dyn_cast<VPIntrinsic>(Store)) {
491
- assert (VPStore->getIntrinsicID () == Intrinsic::vp_store);
492
- StoredValue = VPStore->getArgOperand (0 );
493
514
} else {
494
- llvm_unreachable (" unsupported store operation" );
515
+ assert (II->getIntrinsicID () == Intrinsic::vp_store ||
516
+ II->getIntrinsicID () == Intrinsic::masked_store);
517
+ StoredValue = II->getArgOperand (0 );
495
518
}
496
519
497
520
auto *SVI = dyn_cast<ShuffleVectorInst>(StoredValue);
@@ -508,18 +531,18 @@ bool InterleavedAccessImpl::lowerInterleavedStore(
508
531
" number of stored element should be a multiple of Factor" );
509
532
510
533
Value *Mask = nullptr ;
511
- if (auto *VPStore = dyn_cast<VPIntrinsic>(Store)) {
534
+ if (SI) {
535
+ LLVM_DEBUG (dbgs () << " IA: Found an interleaved store: " << *Store << " \n " );
536
+ } else {
537
+ // Check mask operand. Handle both all-true/false and interleaved mask.
512
538
unsigned LaneMaskLen = NumStoredElements / Factor;
513
- Mask = getMask (VPStore-> getMaskParam ( ), Factor,
539
+ Mask = getMask (getMaskOperand (II ), Factor,
514
540
ElementCount::getFixed (LaneMaskLen));
515
541
if (!Mask)
516
542
return false ;
517
543
518
- LLVM_DEBUG (dbgs () << " IA: Found an interleaved vp.store: " << *Store
519
- << " \n " );
520
-
521
- } else {
522
- LLVM_DEBUG (dbgs () << " IA: Found an interleaved store: " << *Store << " \n " );
544
+ LLVM_DEBUG (dbgs () << " IA: Found an interleaved vp.store or masked.store: "
545
+ << *Store << " \n " );
523
546
}
524
547
525
548
// Try to create target specific intrinsics to replace the store and
@@ -592,19 +615,7 @@ bool InterleavedAccessImpl::lowerDeinterleaveIntrinsic(
592
615
assert (II);
593
616
594
617
// Check mask operand. Handle both all-true/false and interleaved mask.
595
- Value *WideMask;
596
- switch (II->getIntrinsicID ()) {
597
- default :
598
- return false ;
599
- case Intrinsic::vp_load:
600
- WideMask = II->getOperand (1 );
601
- break ;
602
- case Intrinsic::masked_load:
603
- WideMask = II->getOperand (2 );
604
- break ;
605
- }
606
-
607
- Mask = getMask (WideMask, Factor, getDeinterleavedVectorType (DI));
618
+ Mask = getMask (getMaskOperand (II), Factor, getDeinterleavedVectorType (DI));
608
619
if (!Mask)
609
620
return false ;
610
621
@@ -642,18 +653,7 @@ bool InterleavedAccessImpl::lowerInterleaveIntrinsic(
642
653
Value *Mask = nullptr ;
643
654
if (II) {
644
655
// Check mask operand. Handle both all-true/false and interleaved mask.
645
- Value *WideMask;
646
- switch (II->getIntrinsicID ()) {
647
- default :
648
- return false ;
649
- case Intrinsic::vp_store:
650
- WideMask = II->getOperand (2 );
651
- break ;
652
- case Intrinsic::masked_store:
653
- WideMask = II->getOperand (3 );
654
- break ;
655
- }
656
- Mask = getMask (WideMask, Factor,
656
+ Mask = getMask (getMaskOperand (II), Factor,
657
657
cast<VectorType>(InterleaveValues[0 ]->getType ()));
658
658
if (!Mask)
659
659
return false ;
@@ -687,11 +687,13 @@ bool InterleavedAccessImpl::runOnFunction(Function &F) {
687
687
using namespace PatternMatch ;
688
688
for (auto &I : instructions (F)) {
689
689
if (match (&I, m_CombineOr (m_Load (m_Value ()),
690
- m_Intrinsic<Intrinsic::vp_load>())))
690
+ m_Intrinsic<Intrinsic::vp_load>())) ||
691
+ match (&I, m_Intrinsic<Intrinsic::masked_load>()))
691
692
Changed |= lowerInterleavedLoad (&I, DeadInsts);
692
693
693
694
if (match (&I, m_CombineOr (m_Store (m_Value (), m_Value ()),
694
- m_Intrinsic<Intrinsic::vp_store>())))
695
+ m_Intrinsic<Intrinsic::vp_store>())) ||
696
+ match (&I, m_Intrinsic<Intrinsic::masked_store>()))
695
697
Changed |= lowerInterleavedStore (&I, DeadInsts);
696
698
697
699
if (auto *II = dyn_cast<IntrinsicInst>(&I)) {
0 commit comments