@@ -2696,27 +2696,22 @@ void AMDGPUInstructionSelector::splitIllegalMUBUFOffset(
2696
2696
ImmOffset = 0 ;
2697
2697
}
2698
2698
2699
- InstructionSelector::ComplexRendererFns
2700
- AMDGPUInstructionSelector::selectMUBUFAddr64 (MachineOperand &Root) const {
2699
+ bool AMDGPUInstructionSelector::selectMUBUFAddr64Impl (
2700
+ MachineOperand &Root, Register &VAddr, Register &RSrcReg,
2701
+ Register &SOffset, int64_t &Offset) const {
2701
2702
// FIXME: Predicates should stop this from reaching here.
2702
2703
// addr64 bit was removed for volcanic islands.
2703
2704
if (!STI.hasAddr64 () || STI.useFlatForGlobal ())
2704
- return {} ;
2705
+ return false ;
2705
2706
2706
2707
MUBUFAddressData AddrData = parseMUBUFAddress (Root.getReg ());
2707
2708
if (!shouldUseAddr64 (AddrData))
2708
- return {} ;
2709
+ return false ;
2709
2710
2710
2711
Register N0 = AddrData.N0 ;
2711
2712
Register N2 = AddrData.N2 ;
2712
2713
Register N3 = AddrData.N3 ;
2713
- int64_t Offset = AddrData.Offset ;
2714
-
2715
- // VGPR pointer
2716
- Register VAddr;
2717
-
2718
- // SGPR offset.
2719
- Register SOffset;
2714
+ Offset = AddrData.Offset ;
2720
2715
2721
2716
// Base pointer for the SRD.
2722
2717
Register SRDPtr;
@@ -2747,8 +2742,40 @@ AMDGPUInstructionSelector::selectMUBUFAddr64(MachineOperand &Root) const {
2747
2742
}
2748
2743
2749
2744
MachineIRBuilder B (*Root.getParent ());
2750
- Register RSrcReg = buildAddr64RSrc (B, *MRI, TII, SRDPtr);
2745
+ RSrcReg = buildAddr64RSrc (B, *MRI, TII, SRDPtr);
2746
+ splitIllegalMUBUFOffset (B, SOffset, Offset);
2747
+ return true ;
2748
+ }
2749
+
2750
+ bool AMDGPUInstructionSelector::selectMUBUFOffsetImpl (
2751
+ MachineOperand &Root, Register &RSrcReg, Register &SOffset,
2752
+ int64_t &Offset) const {
2753
+ MUBUFAddressData AddrData = parseMUBUFAddress (Root.getReg ());
2754
+ if (shouldUseAddr64 (AddrData))
2755
+ return false ;
2756
+
2757
+ // N0 -> offset, or
2758
+ // (N0 + C1) -> offset
2759
+ Register SRDPtr = AddrData.N0 ;
2760
+ Offset = AddrData.Offset ;
2761
+
2762
+ // TODO: Look through extensions for 32-bit soffset.
2763
+ MachineIRBuilder B (*Root.getParent ());
2764
+
2765
+ RSrcReg = buildOffsetSrc (B, *MRI, TII, SRDPtr);
2751
2766
splitIllegalMUBUFOffset (B, SOffset, Offset);
2767
+ return true ;
2768
+ }
2769
+
2770
+ InstructionSelector::ComplexRendererFns
2771
+ AMDGPUInstructionSelector::selectMUBUFAddr64 (MachineOperand &Root) const {
2772
+ Register VAddr;
2773
+ Register RSrcReg;
2774
+ Register SOffset;
2775
+ int64_t Offset = 0 ;
2776
+
2777
+ if (!selectMUBUFAddr64Impl (Root, VAddr, RSrcReg, SOffset, Offset))
2778
+ return {};
2752
2779
2753
2780
// FIXME: Use defaulted operands for trailing 0s and remove from the complex
2754
2781
// pattern.
@@ -2778,21 +2805,12 @@ AMDGPUInstructionSelector::selectMUBUFAddr64(MachineOperand &Root) const {
2778
2805
2779
2806
InstructionSelector::ComplexRendererFns
2780
2807
AMDGPUInstructionSelector::selectMUBUFOffset (MachineOperand &Root) const {
2781
- MUBUFAddressData AddrData = parseMUBUFAddress (Root.getReg ());
2782
- if (shouldUseAddr64 (AddrData))
2783
- return {};
2784
-
2785
- // N0 -> offset, or
2786
- // (N0 + C1) -> offset
2787
- Register SRDPtr = AddrData.N0 ;
2788
- int64_t Offset = AddrData.Offset ;
2808
+ Register RSrcReg;
2789
2809
Register SOffset;
2810
+ int64_t Offset = 0 ;
2790
2811
2791
- // TODO: Look through extensions for 32-bit soffset.
2792
- MachineIRBuilder B (*Root.getParent ());
2793
-
2794
- Register RSrcReg = buildOffsetSrc (B, *MRI, TII, SRDPtr);
2795
- splitIllegalMUBUFOffset (B, SOffset, Offset);
2812
+ if (!selectMUBUFOffsetImpl (Root, RSrcReg, SOffset, Offset))
2813
+ return {};
2796
2814
2797
2815
return {{
2798
2816
[=](MachineInstrBuilder &MIB) { // rsrc
0 commit comments