Skip to content

Commit f389074

Browse files
committed
[Xtensa] Fixup hwloop pass
Create block and insert it before loop end address as target for jump/branch instruction to avoid premature exit from loop.
1 parent a07cafd commit f389074

File tree

2 files changed

+40
-6
lines changed

2 files changed

+40
-6
lines changed

llvm/lib/Target/Xtensa/XtensaFixupHWLoops.cpp

+39-5
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,6 @@ bool XtensaFixupHwLoops::fixupLoopInstrs(MachineLoop *L) {
290290
Changed = true;
291291
break;
292292
}
293-
294293
if (PII != PIB) {
295294
LoopEnd = MF->CreateMachineBasicBlock();
296295
MF->insert(++(PMBB->getIterator()), LoopEnd);
@@ -302,10 +301,45 @@ bool XtensaFixupHwLoops::fixupLoopInstrs(MachineLoop *L) {
302301
.addMBB(LoopEnd);
303302
LoopEnd->addSuccessor(LoopEnd);
304303
} 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+
}
309343
}
310344

311345
Changed = true;

llvm/lib/Target/Xtensa/XtensaHardwareLoops.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ bool XtensaHardwareLoops::processLoop(MachineLoop *L) {
360360
}
361361

362362
bool XtensaHardwareLoops::checkLoopSize(MachineLoop *L) {
363-
uint64_t LoopSize = 0;
363+
uint64_t LoopSize = 3; //Reserve space for possible NOP
364364

365365
for (auto *MBB : L->getBlocks()) {
366366
uint64_t BlockSize = 0;

0 commit comments

Comments
 (0)