@@ -5035,9 +5035,19 @@ AArch64InstructionSelector::selectExtendedSHL(
5035
5035
return None;
5036
5036
5037
5037
unsigned OffsetOpc = OffsetInst->getOpcode ();
5038
- if (OffsetOpc != TargetOpcode::G_SHL && OffsetOpc != TargetOpcode::G_MUL)
5039
- return None;
5038
+ bool LookedThroughZExt = false ;
5039
+ if (OffsetOpc != TargetOpcode::G_SHL && OffsetOpc != TargetOpcode::G_MUL) {
5040
+ // Try to look through a ZEXT.
5041
+ if (OffsetOpc != TargetOpcode::G_ZEXT || !WantsExt)
5042
+ return None;
5043
+
5044
+ OffsetInst = MRI.getVRegDef (OffsetInst->getOperand (1 ).getReg ());
5045
+ OffsetOpc = OffsetInst->getOpcode ();
5046
+ LookedThroughZExt = true ;
5040
5047
5048
+ if (OffsetOpc != TargetOpcode::G_SHL && OffsetOpc != TargetOpcode::G_MUL)
5049
+ return None;
5050
+ }
5041
5051
// Make sure that the memory op is a valid size.
5042
5052
int64_t LegalShiftVal = Log2_32 (SizeInBytes);
5043
5053
if (LegalShiftVal == 0 )
@@ -5088,20 +5098,23 @@ AArch64InstructionSelector::selectExtendedSHL(
5088
5098
5089
5099
unsigned SignExtend = 0 ;
5090
5100
if (WantsExt) {
5091
- // Check if the offset is defined by an extend.
5092
- MachineInstr *ExtInst = getDefIgnoringCopies (OffsetReg, MRI);
5093
- auto Ext = getExtendTypeForInst (*ExtInst, MRI, true );
5094
- if (Ext == AArch64_AM::InvalidShiftExtend)
5095
- return None;
5101
+ // Check if the offset is defined by an extend, unless we looked through a
5102
+ // G_ZEXT earlier.
5103
+ if (!LookedThroughZExt) {
5104
+ MachineInstr *ExtInst = getDefIgnoringCopies (OffsetReg, MRI);
5105
+ auto Ext = getExtendTypeForInst (*ExtInst, MRI, true );
5106
+ if (Ext == AArch64_AM::InvalidShiftExtend)
5107
+ return None;
5096
5108
5097
- SignExtend = isSignExtendShiftType (Ext) ? 1 : 0 ;
5098
- // We only support SXTW for signed extension here.
5099
- if (SignExtend && Ext != AArch64_AM::SXTW)
5100
- return None;
5109
+ SignExtend = isSignExtendShiftType (Ext) ? 1 : 0 ;
5110
+ // We only support SXTW for signed extension here.
5111
+ if (SignExtend && Ext != AArch64_AM::SXTW)
5112
+ return None;
5113
+ OffsetReg = ExtInst->getOperand (1 ).getReg ();
5114
+ }
5101
5115
5102
5116
// Need a 32-bit wide register here.
5103
5117
MachineIRBuilder MIB (*MRI.getVRegDef (Root.getReg ()));
5104
- OffsetReg = ExtInst->getOperand (1 ).getReg ();
5105
5118
OffsetReg = narrowExtendRegIfNeeded (OffsetReg, MIB);
5106
5119
}
5107
5120
0 commit comments