@@ -105,7 +105,7 @@ class AArch64InstructionSelector : public InstructionSelector {
105
105
bool earlySelectSHL (MachineInstr &I, MachineRegisterInfo &MRI);
106
106
107
107
// / Eliminate same-sized cross-bank copies into stores before selectImpl().
108
- bool contractCrossBankCopyIntoStore (GStore &I,
108
+ bool contractCrossBankCopyIntoStore (MachineInstr &I,
109
109
MachineRegisterInfo &MRI);
110
110
111
111
bool convertPtrAddToAdd (MachineInstr &I, MachineRegisterInfo &MRI);
@@ -1943,9 +1943,8 @@ bool AArch64InstructionSelector::preISelLower(MachineInstr &I) {
1943
1943
return true ;
1944
1944
}
1945
1945
case TargetOpcode::G_STORE: {
1946
- auto &StoreMI = cast<GStore>(I);
1947
- bool Changed = contractCrossBankCopyIntoStore (StoreMI, MRI);
1948
- MachineOperand &SrcOp = StoreMI.getOperand (0 );
1946
+ bool Changed = contractCrossBankCopyIntoStore (I, MRI);
1947
+ MachineOperand &SrcOp = I.getOperand (0 );
1949
1948
if (MRI.getType (SrcOp.getReg ()).isPointer ()) {
1950
1949
// Allow matching with imported patterns for stores of pointers. Unlike
1951
1950
// G_LOAD/G_PTR_ADD, we may not have selected all users. So, emit a copy
@@ -1956,28 +1955,6 @@ bool AArch64InstructionSelector::preISelLower(MachineInstr &I) {
1956
1955
RBI.constrainGenericRegister (NewSrc, AArch64::GPR64RegClass, MRI);
1957
1956
Changed = true ;
1958
1957
}
1959
- #if 0
1960
- // Now look for truncating stores to the FPR bank. We don't support these,
1961
- // but since truncating store formation happens before RBS, we can only
1962
- // split them up again here. We don't want to assign truncstores to GPR only
1963
- // since that would have a perf impact due to extra moves.
1964
- LLT SrcTy = MRI.getType(SrcReg);
1965
- if (RBI.getRegBank(SrcReg, MRI, TRI)->getID() == AArch64::FPRRegBankID) {
1966
- if (SrcTy.isScalar() &&
1967
- SrcTy.getSizeInBits() > StoreMI.getMemSizeInBits()) {
1968
- // Generate an explicit truncate and make this into a non-truncating
1969
- // store.
1970
- auto Trunc =
1971
- MIB.buildTrunc(LLT::scalar(StoreMI.getMemSizeInBits()), SrcReg);
1972
- MRI.setRegBank(Trunc.getReg(0), RBI.getRegBank(AArch64::FPRRegBankID));
1973
- if (!select(*Trunc)) {
1974
- return false;
1975
- }
1976
- SrcOp.setReg(Trunc.getReg(0));
1977
- return true;
1978
- }
1979
- }
1980
- #endif
1981
1958
return Changed;
1982
1959
}
1983
1960
case TargetOpcode::G_PTR_ADD:
@@ -2113,7 +2090,8 @@ bool AArch64InstructionSelector::earlySelectSHL(MachineInstr &I,
2113
2090
}
2114
2091
2115
2092
bool AArch64InstructionSelector::contractCrossBankCopyIntoStore (
2116
- GStore &StoreMI, MachineRegisterInfo &MRI) {
2093
+ MachineInstr &I, MachineRegisterInfo &MRI) {
2094
+ assert (I.getOpcode () == TargetOpcode::G_STORE && " Expected G_STORE" );
2117
2095
// If we're storing a scalar, it doesn't matter what register bank that
2118
2096
// scalar is on. All that matters is the size.
2119
2097
//
@@ -2128,11 +2106,11 @@ bool AArch64InstructionSelector::contractCrossBankCopyIntoStore(
2128
2106
// G_STORE %x:gpr(s32)
2129
2107
//
2130
2108
// And then continue the selection process normally.
2131
- Register DefDstReg = getSrcRegIgnoringCopies (StoreMI. getValueReg (), MRI);
2109
+ Register DefDstReg = getSrcRegIgnoringCopies (I. getOperand ( 0 ). getReg (), MRI);
2132
2110
if (!DefDstReg.isValid ())
2133
2111
return false ;
2134
2112
LLT DefDstTy = MRI.getType (DefDstReg);
2135
- Register StoreSrcReg = StoreMI. getValueReg ();
2113
+ Register StoreSrcReg = I. getOperand ( 0 ). getReg ();
2136
2114
LLT StoreSrcTy = MRI.getType (StoreSrcReg);
2137
2115
2138
2116
// If we get something strange like a physical register, then we shouldn't
@@ -2144,16 +2122,12 @@ bool AArch64InstructionSelector::contractCrossBankCopyIntoStore(
2144
2122
if (DefDstTy.getSizeInBits () != StoreSrcTy.getSizeInBits ())
2145
2123
return false ;
2146
2124
2147
- // Is this store a truncating one?
2148
- if (StoreSrcTy.getSizeInBits () != StoreMI.getMemSizeInBits ())
2149
- return false ;
2150
-
2151
2125
if (RBI.getRegBank (StoreSrcReg, MRI, TRI) ==
2152
2126
RBI.getRegBank (DefDstReg, MRI, TRI))
2153
2127
return false ;
2154
2128
2155
2129
// We have a cross-bank copy, which is entering a store. Let's fold it.
2156
- StoreMI .getOperand (0 ).setReg (DefDstReg);
2130
+ I .getOperand (0 ).setReg (DefDstReg);
2157
2131
return true ;
2158
2132
}
2159
2133
0 commit comments