@@ -290,7 +290,6 @@ bool XtensaFixupHwLoops::fixupLoopInstrs(MachineLoop *L) {
290
290
Changed = true ;
291
291
break ;
292
292
}
293
-
294
293
if (PII != PIB) {
295
294
LoopEnd = MF->CreateMachineBasicBlock ();
296
295
MF->insert (++(PMBB->getIterator ()), LoopEnd);
@@ -302,10 +301,45 @@ bool XtensaFixupHwLoops::fixupLoopInstrs(MachineLoop *L) {
302
301
.addMBB (LoopEnd);
303
302
LoopEnd->addSuccessor (LoopEnd);
304
303
} else {
305
- BuildMI (*PMBB, PII, DL, TII->get (Xtensa::LOOPEND)).addMBB (PMBB);
306
- PMBB->addSuccessor (PMBB);
307
- BuildMI (*PMBB, PII, DL, TII->get (Xtensa::NOP));
308
- LoopEnd = PMBB;
304
+ bool NeedBlockForJump = false ;
305
+ // Check for branches to the loop end basic block from
306
+ // predecessors
307
+ for (auto I = PMBB->pred_begin (), E = PMBB->pred_end (); I != E;
308
+ ++I) {
309
+ MachineBasicBlock *PLEMBB = *I;
310
+ MachineBasicBlock *TBB = nullptr , *FBB = nullptr ;
311
+ SmallVector<MachineOperand, 4 > Cond;
312
+ if (!TII->analyzeBranch (*PLEMBB, TBB, FBB, Cond)) {
313
+ if (TBB == PMBB) {
314
+ NeedBlockForJump = true ;
315
+ break ;
316
+ }
317
+ } else {
318
+ NeedBlockForJump = true ;
319
+ break ;
320
+ }
321
+ }
322
+ // Create block and insert it before loop end address as
323
+ // target for jump/branch instruction to avoid premature exit from
324
+ // loop
325
+ if (NeedBlockForJump) {
326
+ LoopEnd = MF->CreateMachineBasicBlock ();
327
+ MF->insert (++(PMBB->getIterator ()), LoopEnd);
328
+ LoopEnd->transferSuccessors (PMBB);
329
+ LoopEnd->splice (LoopEnd->end (), PMBB, PII, PMBB->end ());
330
+ PMBB->addSuccessor (LoopEnd);
331
+ BuildMI (*PMBB, PMBB->end (), DL, TII->get (Xtensa::NOP));
332
+
333
+ BuildMI (*LoopEnd, LoopEnd->begin (), DL,
334
+ TII->get (Xtensa::LOOPEND))
335
+ .addMBB (LoopEnd);
336
+ LoopEnd->addSuccessor (LoopEnd);
337
+ } else {
338
+ BuildMI (*PMBB, PII, DL, TII->get (Xtensa::LOOPEND)).addMBB (PMBB);
339
+ PMBB->addSuccessor (PMBB);
340
+ BuildMI (*PMBB, PII, DL, TII->get (Xtensa::NOP));
341
+ LoopEnd = PMBB;
342
+ }
309
343
}
310
344
311
345
Changed = true ;
0 commit comments