@@ -140,36 +140,48 @@ bool LoongArchRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
140140
141141 bool FrameRegIsKill = false ;
142142
143- int fixed_offset = Offset.getFixed ();
144- bool OffsetLegal = false ;
143+ int FixedOffset = Offset.getFixed ();
144+ bool OffsetLegal = true ;
145145
146- // Handle offsets that exceed the immediate range of the instruction
146+ // Handle offsets that exceed the immediate range of the instruction.
147147 switch (MIOpc) {
148148 case LoongArch::VSTELM_B:
149149 case LoongArch::XVSTELM_B: {
150- OffsetLegal = isInt<8 >(fixed_offset );
150+ OffsetLegal = isInt<8 >(FixedOffset );
151151 break ;
152152 }
153153 case LoongArch::VSTELM_H:
154154 case LoongArch::XVSTELM_H: {
155- OffsetLegal = isShiftedInt<8 , 1 >(fixed_offset );
155+ OffsetLegal = isShiftedInt<8 , 1 >(FixedOffset );
156156 break ;
157157 }
158158 case LoongArch::VSTELM_W:
159159 case LoongArch::XVSTELM_W: {
160- OffsetLegal = isShiftedInt<8 , 2 >(fixed_offset );
160+ OffsetLegal = isShiftedInt<8 , 2 >(FixedOffset );
161161 break ;
162162 }
163163 case LoongArch::VSTELM_D:
164164 case LoongArch::XVSTELM_D: {
165- OffsetLegal = isShiftedInt<8 , 3 >(fixed_offset );
165+ OffsetLegal = isShiftedInt<8 , 3 >(FixedOffset );
166166 break ;
167167 }
168- default :
169- OffsetLegal = isInt<12 >(fixed_offset);
170168 }
171169
172- if (!OffsetLegal) {
170+ if (!OffsetLegal && isInt<12 >(FixedOffset)) {
171+ unsigned Addi = IsLA64 ? LoongArch::ADDI_D : LoongArch::ADDI_W;
172+
173+ // The offset fits in si12 but is not legal for the instruction,
174+ // so use only one scratch register instead.
175+ Register ScratchReg = MRI.createVirtualRegister (&LoongArch::GPRRegClass);
176+ BuildMI (MBB, II, DL, TII->get (Addi), ScratchReg)
177+ .addReg (FrameReg)
178+ .addImm (FixedOffset);
179+ Offset = StackOffset::getFixed (0 );
180+ FrameReg = ScratchReg;
181+ FrameRegIsKill = true ;
182+ }
183+
184+ if (!isInt<12 >(FixedOffset)) {
173185 unsigned Addi = IsLA64 ? LoongArch::ADDI_D : LoongArch::ADDI_W;
174186 unsigned Add = IsLA64 ? LoongArch::ADD_D : LoongArch::ADD_W;
175187
0 commit comments