|
48 | 48 | #include "llvm/ADT/DenseMap.h" |
49 | 49 | #include "llvm/ADT/SetVector.h" |
50 | 50 | #include "llvm/ADT/SmallVector.h" |
| 51 | +#include "llvm/Analysis/VectorUtils.h" |
51 | 52 | #include "llvm/CodeGen/InterleavedAccess.h" |
52 | 53 | #include "llvm/CodeGen/TargetLowering.h" |
53 | 54 | #include "llvm/CodeGen/TargetPassConfig.h" |
@@ -574,69 +575,11 @@ bool InterleavedAccessImpl::lowerInterleavedStore( |
574 | 575 | return true; |
575 | 576 | } |
576 | 577 |
|
577 | | -static bool isInterleaveIntrinsic(Intrinsic::ID IID) { |
578 | | - switch (IID) { |
579 | | - case Intrinsic::vector_interleave2: |
580 | | - case Intrinsic::vector_interleave3: |
581 | | - case Intrinsic::vector_interleave4: |
582 | | - case Intrinsic::vector_interleave5: |
583 | | - case Intrinsic::vector_interleave6: |
584 | | - case Intrinsic::vector_interleave7: |
585 | | - case Intrinsic::vector_interleave8: |
586 | | - return true; |
587 | | - default: |
588 | | - return false; |
589 | | - } |
590 | | -} |
591 | | - |
592 | | -static bool isDeinterleaveIntrinsic(Intrinsic::ID IID) { |
593 | | - switch (IID) { |
594 | | - case Intrinsic::vector_deinterleave2: |
595 | | - case Intrinsic::vector_deinterleave3: |
596 | | - case Intrinsic::vector_deinterleave4: |
597 | | - case Intrinsic::vector_deinterleave5: |
598 | | - case Intrinsic::vector_deinterleave6: |
599 | | - case Intrinsic::vector_deinterleave7: |
600 | | - case Intrinsic::vector_deinterleave8: |
601 | | - return true; |
602 | | - default: |
603 | | - return false; |
604 | | - } |
605 | | -} |
606 | | - |
607 | | -static unsigned getIntrinsicFactor(const IntrinsicInst *II) { |
608 | | - switch (II->getIntrinsicID()) { |
609 | | - case Intrinsic::vector_deinterleave2: |
610 | | - case Intrinsic::vector_interleave2: |
611 | | - return 2; |
612 | | - case Intrinsic::vector_deinterleave3: |
613 | | - case Intrinsic::vector_interleave3: |
614 | | - return 3; |
615 | | - case Intrinsic::vector_deinterleave4: |
616 | | - case Intrinsic::vector_interleave4: |
617 | | - return 4; |
618 | | - case Intrinsic::vector_deinterleave5: |
619 | | - case Intrinsic::vector_interleave5: |
620 | | - return 5; |
621 | | - case Intrinsic::vector_deinterleave6: |
622 | | - case Intrinsic::vector_interleave6: |
623 | | - return 6; |
624 | | - case Intrinsic::vector_deinterleave7: |
625 | | - case Intrinsic::vector_interleave7: |
626 | | - return 7; |
627 | | - case Intrinsic::vector_deinterleave8: |
628 | | - case Intrinsic::vector_interleave8: |
629 | | - return 8; |
630 | | - default: |
631 | | - llvm_unreachable("Unexpected intrinsic"); |
632 | | - } |
633 | | -} |
634 | | - |
635 | 578 | static Value *getMask(Value *WideMask, unsigned Factor, |
636 | 579 | ElementCount LeafValueEC) { |
637 | 580 | if (auto *IMI = dyn_cast<IntrinsicInst>(WideMask)) { |
638 | | - if (isInterleaveIntrinsic(IMI->getIntrinsicID()) && |
639 | | - getIntrinsicFactor(IMI) == Factor && llvm::all_equal(IMI->args())) { |
| 581 | + if (unsigned F = getInterleaveIntrinsicFactor(IMI->getIntrinsicID()); |
| 582 | + F && F == Factor && llvm::all_equal(IMI->args())) { |
640 | 583 | return IMI->getArgOperand(0); |
641 | 584 | } |
642 | 585 | } |
@@ -672,7 +615,9 @@ bool InterleavedAccessImpl::lowerDeinterleaveIntrinsic( |
672 | 615 | if (!LoadedVal->hasOneUse() || !isa<LoadInst, VPIntrinsic>(LoadedVal)) |
673 | 616 | return false; |
674 | 617 |
|
675 | | - const unsigned Factor = getIntrinsicFactor(DI); |
| 618 | + const unsigned Factor = getDeinterleaveIntrinsicFactor(DI->getIntrinsicID()); |
| 619 | + assert(Factor && "unexpected deinterleave intrinsic"); |
| 620 | + |
676 | 621 | SmallVector<Value *, 8> DeinterleaveValues(Factor, nullptr); |
677 | 622 | Value *LastFactor = nullptr; |
678 | 623 | for (auto *User : DI->users()) { |
@@ -738,7 +683,8 @@ bool InterleavedAccessImpl::lowerInterleaveIntrinsic( |
738 | 683 | return false; |
739 | 684 |
|
740 | 685 | SmallVector<Value *, 8> InterleaveValues(II->args()); |
741 | | - const unsigned Factor = getIntrinsicFactor(II); |
| 686 | + const unsigned Factor = getInterleaveIntrinsicFactor(II->getIntrinsicID()); |
| 687 | + assert(Factor && "unexpected interleave intrinsic"); |
742 | 688 |
|
743 | 689 | if (auto *VPStore = dyn_cast<VPIntrinsic>(StoredBy)) { |
744 | 690 | if (VPStore->getIntrinsicID() != Intrinsic::vp_store) |
@@ -792,9 +738,9 @@ bool InterleavedAccessImpl::runOnFunction(Function &F) { |
792 | 738 | Changed |= lowerInterleavedStore(&I, DeadInsts); |
793 | 739 |
|
794 | 740 | if (auto *II = dyn_cast<IntrinsicInst>(&I)) { |
795 | | - if (isDeinterleaveIntrinsic(II->getIntrinsicID())) |
| 741 | + if (getDeinterleaveIntrinsicFactor(II->getIntrinsicID())) |
796 | 742 | Changed |= lowerDeinterleaveIntrinsic(II, DeadInsts); |
797 | | - else if (isInterleaveIntrinsic(II->getIntrinsicID())) |
| 743 | + else if (getInterleaveIntrinsicFactor(II->getIntrinsicID())) |
798 | 744 | Changed |= lowerInterleaveIntrinsic(II, DeadInsts); |
799 | 745 | } |
800 | 746 | } |
|
0 commit comments