|
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