@@ -4907,9 +4907,19 @@ AArch64InstructionSelector::selectExtendedSHL(
4907
4907
return None;
4908
4908
4909
4909
unsigned OffsetOpc = OffsetInst->getOpcode ();
4910
- if (OffsetOpc != TargetOpcode::G_SHL && OffsetOpc != TargetOpcode::G_MUL)
4911
- return None;
4910
+ bool LookedThroughZExt = false ;
4911
+ if (OffsetOpc != TargetOpcode::G_SHL && OffsetOpc != TargetOpcode::G_MUL) {
4912
+ // Try to look through a ZEXT.
4913
+ if (OffsetOpc != TargetOpcode::G_ZEXT || !WantsExt)
4914
+ return None;
4915
+
4916
+ OffsetInst = MRI.getVRegDef (OffsetInst->getOperand (1 ).getReg ());
4917
+ OffsetOpc = OffsetInst->getOpcode ();
4918
+ LookedThroughZExt = true ;
4912
4919
4920
+ if (OffsetOpc != TargetOpcode::G_SHL && OffsetOpc != TargetOpcode::G_MUL)
4921
+ return None;
4922
+ }
4913
4923
// Make sure that the memory op is a valid size.
4914
4924
int64_t LegalShiftVal = Log2_32 (SizeInBytes);
4915
4925
if (LegalShiftVal == 0 )
@@ -4960,20 +4970,23 @@ AArch64InstructionSelector::selectExtendedSHL(
4960
4970
4961
4971
unsigned SignExtend = 0 ;
4962
4972
if (WantsExt) {
4963
- // Check if the offset is defined by an extend.
4964
- MachineInstr *ExtInst = getDefIgnoringCopies (OffsetReg, MRI);
4965
- auto Ext = getExtendTypeForInst (*ExtInst, MRI, true );
4966
- if (Ext == AArch64_AM::InvalidShiftExtend)
4967
- return None;
4973
+ // Check if the offset is defined by an extend, unless we looked through a
4974
+ // G_ZEXT earlier.
4975
+ if (!LookedThroughZExt) {
4976
+ MachineInstr *ExtInst = getDefIgnoringCopies (OffsetReg, MRI);
4977
+ auto Ext = getExtendTypeForInst (*ExtInst, MRI, true );
4978
+ if (Ext == AArch64_AM::InvalidShiftExtend)
4979
+ return None;
4968
4980
4969
- SignExtend = isSignExtendShiftType (Ext) ? 1 : 0 ;
4970
- // We only support SXTW for signed extension here.
4971
- if (SignExtend && Ext != AArch64_AM::SXTW)
4972
- return None;
4981
+ SignExtend = isSignExtendShiftType (Ext) ? 1 : 0 ;
4982
+ // We only support SXTW for signed extension here.
4983
+ if (SignExtend && Ext != AArch64_AM::SXTW)
4984
+ return None;
4985
+ OffsetReg = ExtInst->getOperand (1 ).getReg ();
4986
+ }
4973
4987
4974
4988
// Need a 32-bit wide register here.
4975
4989
MachineIRBuilder MIB (*MRI.getVRegDef (Root.getReg ()));
4976
- OffsetReg = ExtInst->getOperand (1 ).getReg ();
4977
4990
OffsetReg = narrowExtendRegIfNeeded (OffsetReg, MIB);
4978
4991
}
4979
4992
0 commit comments