Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/CodeGen/BranchRelaxation.cpp
35233 views
1
//===- BranchRelaxation.cpp -----------------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "llvm/ADT/SmallVector.h"
10
#include "llvm/ADT/Statistic.h"
11
#include "llvm/CodeGen/LivePhysRegs.h"
12
#include "llvm/CodeGen/MachineBasicBlock.h"
13
#include "llvm/CodeGen/MachineFunction.h"
14
#include "llvm/CodeGen/MachineFunctionPass.h"
15
#include "llvm/CodeGen/MachineInstr.h"
16
#include "llvm/CodeGen/RegisterScavenging.h"
17
#include "llvm/CodeGen/TargetInstrInfo.h"
18
#include "llvm/CodeGen/TargetRegisterInfo.h"
19
#include "llvm/CodeGen/TargetSubtargetInfo.h"
20
#include "llvm/Config/llvm-config.h"
21
#include "llvm/IR/DebugLoc.h"
22
#include "llvm/InitializePasses.h"
23
#include "llvm/Pass.h"
24
#include "llvm/Support/Compiler.h"
25
#include "llvm/Support/Debug.h"
26
#include "llvm/Support/ErrorHandling.h"
27
#include "llvm/Support/Format.h"
28
#include "llvm/Support/raw_ostream.h"
29
#include "llvm/Target/TargetMachine.h"
30
#include <cassert>
31
#include <cstdint>
32
#include <iterator>
33
#include <memory>
34
35
using namespace llvm;
36
37
#define DEBUG_TYPE "branch-relaxation"
38
39
STATISTIC(NumSplit, "Number of basic blocks split");
40
STATISTIC(NumConditionalRelaxed, "Number of conditional branches relaxed");
41
STATISTIC(NumUnconditionalRelaxed, "Number of unconditional branches relaxed");
42
43
#define BRANCH_RELAX_NAME "Branch relaxation pass"
44
45
namespace {
46
47
class BranchRelaxation : public MachineFunctionPass {
48
/// BasicBlockInfo - Information about the offset and size of a single
49
/// basic block.
50
struct BasicBlockInfo {
51
/// Offset - Distance from the beginning of the function to the beginning
52
/// of this basic block.
53
///
54
/// The offset is always aligned as required by the basic block.
55
unsigned Offset = 0;
56
57
/// Size - Size of the basic block in bytes. If the block contains
58
/// inline assembly, this is a worst case estimate.
59
///
60
/// The size does not include any alignment padding whether from the
61
/// beginning of the block, or from an aligned jump table at the end.
62
unsigned Size = 0;
63
64
BasicBlockInfo() = default;
65
66
/// Compute the offset immediately following this block. \p MBB is the next
67
/// block.
68
unsigned postOffset(const MachineBasicBlock &MBB) const {
69
const unsigned PO = Offset + Size;
70
const Align Alignment = MBB.getAlignment();
71
const Align ParentAlign = MBB.getParent()->getAlignment();
72
if (Alignment <= ParentAlign)
73
return alignTo(PO, Alignment);
74
75
// The alignment of this MBB is larger than the function's alignment, so we
76
// can't tell whether or not it will insert nops. Assume that it will.
77
return alignTo(PO, Alignment) + Alignment.value() - ParentAlign.value();
78
}
79
};
80
81
SmallVector<BasicBlockInfo, 16> BlockInfo;
82
83
// The basic block after which trampolines are inserted. This is the last
84
// basic block that isn't in the cold section.
85
MachineBasicBlock *TrampolineInsertionPoint = nullptr;
86
SmallDenseSet<std::pair<MachineBasicBlock *, MachineBasicBlock *>>
87
RelaxedUnconditionals;
88
std::unique_ptr<RegScavenger> RS;
89
LivePhysRegs LiveRegs;
90
91
MachineFunction *MF = nullptr;
92
const TargetRegisterInfo *TRI = nullptr;
93
const TargetInstrInfo *TII = nullptr;
94
const TargetMachine *TM = nullptr;
95
96
bool relaxBranchInstructions();
97
void scanFunction();
98
99
MachineBasicBlock *createNewBlockAfter(MachineBasicBlock &OrigMBB);
100
MachineBasicBlock *createNewBlockAfter(MachineBasicBlock &OrigMBB,
101
const BasicBlock *BB);
102
103
MachineBasicBlock *splitBlockBeforeInstr(MachineInstr &MI,
104
MachineBasicBlock *DestBB);
105
void adjustBlockOffsets(MachineBasicBlock &Start);
106
bool isBlockInRange(const MachineInstr &MI, const MachineBasicBlock &BB) const;
107
108
bool fixupConditionalBranch(MachineInstr &MI);
109
bool fixupUnconditionalBranch(MachineInstr &MI);
110
uint64_t computeBlockSize(const MachineBasicBlock &MBB) const;
111
unsigned getInstrOffset(const MachineInstr &MI) const;
112
void dumpBBs();
113
void verify();
114
115
public:
116
static char ID;
117
118
BranchRelaxation() : MachineFunctionPass(ID) {}
119
120
bool runOnMachineFunction(MachineFunction &MF) override;
121
122
StringRef getPassName() const override { return BRANCH_RELAX_NAME; }
123
};
124
125
} // end anonymous namespace
126
127
char BranchRelaxation::ID = 0;
128
129
char &llvm::BranchRelaxationPassID = BranchRelaxation::ID;
130
131
INITIALIZE_PASS(BranchRelaxation, DEBUG_TYPE, BRANCH_RELAX_NAME, false, false)
132
133
/// verify - check BBOffsets, BBSizes, alignment of islands
134
void BranchRelaxation::verify() {
135
#ifndef NDEBUG
136
unsigned PrevNum = MF->begin()->getNumber();
137
for (MachineBasicBlock &MBB : *MF) {
138
const unsigned Num = MBB.getNumber();
139
assert(!Num || BlockInfo[PrevNum].postOffset(MBB) <= BlockInfo[Num].Offset);
140
assert(BlockInfo[Num].Size == computeBlockSize(MBB));
141
PrevNum = Num;
142
}
143
144
for (MachineBasicBlock &MBB : *MF) {
145
for (MachineBasicBlock::iterator J = MBB.getFirstTerminator();
146
J != MBB.end(); J = std::next(J)) {
147
MachineInstr &MI = *J;
148
if (!MI.isConditionalBranch() && !MI.isUnconditionalBranch())
149
continue;
150
if (MI.getOpcode() == TargetOpcode::FAULTING_OP)
151
continue;
152
MachineBasicBlock *DestBB = TII->getBranchDestBlock(MI);
153
assert(isBlockInRange(MI, *DestBB) ||
154
RelaxedUnconditionals.contains({&MBB, DestBB}));
155
}
156
}
157
#endif
158
}
159
160
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
161
/// print block size and offset information - debugging
162
LLVM_DUMP_METHOD void BranchRelaxation::dumpBBs() {
163
for (auto &MBB : *MF) {
164
const BasicBlockInfo &BBI = BlockInfo[MBB.getNumber()];
165
dbgs() << format("%%bb.%u\toffset=%08x\t", MBB.getNumber(), BBI.Offset)
166
<< format("size=%#x\n", BBI.Size);
167
}
168
}
169
#endif
170
171
/// scanFunction - Do the initial scan of the function, building up
172
/// information about each block.
173
void BranchRelaxation::scanFunction() {
174
BlockInfo.clear();
175
BlockInfo.resize(MF->getNumBlockIDs());
176
177
TrampolineInsertionPoint = nullptr;
178
RelaxedUnconditionals.clear();
179
180
// First thing, compute the size of all basic blocks, and see if the function
181
// has any inline assembly in it. If so, we have to be conservative about
182
// alignment assumptions, as we don't know for sure the size of any
183
// instructions in the inline assembly. At the same time, place the
184
// trampoline insertion point at the end of the hot portion of the function.
185
for (MachineBasicBlock &MBB : *MF) {
186
BlockInfo[MBB.getNumber()].Size = computeBlockSize(MBB);
187
188
if (MBB.getSectionID() != MBBSectionID::ColdSectionID)
189
TrampolineInsertionPoint = &MBB;
190
}
191
192
// Compute block offsets and known bits.
193
adjustBlockOffsets(*MF->begin());
194
195
if (TrampolineInsertionPoint == nullptr) {
196
LLVM_DEBUG(dbgs() << " No suitable trampoline insertion point found in "
197
<< MF->getName() << ".\n");
198
}
199
}
200
201
/// computeBlockSize - Compute the size for MBB.
202
uint64_t BranchRelaxation::computeBlockSize(const MachineBasicBlock &MBB) const {
203
uint64_t Size = 0;
204
for (const MachineInstr &MI : MBB)
205
Size += TII->getInstSizeInBytes(MI);
206
return Size;
207
}
208
209
/// getInstrOffset - Return the current offset of the specified machine
210
/// instruction from the start of the function. This offset changes as stuff is
211
/// moved around inside the function.
212
unsigned BranchRelaxation::getInstrOffset(const MachineInstr &MI) const {
213
const MachineBasicBlock *MBB = MI.getParent();
214
215
// The offset is composed of two things: the sum of the sizes of all MBB's
216
// before this instruction's block, and the offset from the start of the block
217
// it is in.
218
unsigned Offset = BlockInfo[MBB->getNumber()].Offset;
219
220
// Sum instructions before MI in MBB.
221
for (MachineBasicBlock::const_iterator I = MBB->begin(); &*I != &MI; ++I) {
222
assert(I != MBB->end() && "Didn't find MI in its own basic block?");
223
Offset += TII->getInstSizeInBytes(*I);
224
}
225
226
return Offset;
227
}
228
229
void BranchRelaxation::adjustBlockOffsets(MachineBasicBlock &Start) {
230
unsigned PrevNum = Start.getNumber();
231
for (auto &MBB :
232
make_range(std::next(MachineFunction::iterator(Start)), MF->end())) {
233
unsigned Num = MBB.getNumber();
234
// Get the offset and known bits at the end of the layout predecessor.
235
// Include the alignment of the current block.
236
BlockInfo[Num].Offset = BlockInfo[PrevNum].postOffset(MBB);
237
238
PrevNum = Num;
239
}
240
}
241
242
/// Insert a new empty MachineBasicBlock and insert it after \p OrigMBB
243
MachineBasicBlock *
244
BranchRelaxation::createNewBlockAfter(MachineBasicBlock &OrigBB) {
245
return createNewBlockAfter(OrigBB, OrigBB.getBasicBlock());
246
}
247
248
/// Insert a new empty MachineBasicBlock with \p BB as its BasicBlock
249
/// and insert it after \p OrigMBB
250
MachineBasicBlock *
251
BranchRelaxation::createNewBlockAfter(MachineBasicBlock &OrigMBB,
252
const BasicBlock *BB) {
253
// Create a new MBB for the code after the OrigBB.
254
MachineBasicBlock *NewBB = MF->CreateMachineBasicBlock(BB);
255
MF->insert(++OrigMBB.getIterator(), NewBB);
256
257
// Place the new block in the same section as OrigBB
258
NewBB->setSectionID(OrigMBB.getSectionID());
259
NewBB->setIsEndSection(OrigMBB.isEndSection());
260
OrigMBB.setIsEndSection(false);
261
262
// Insert an entry into BlockInfo to align it properly with the block numbers.
263
BlockInfo.insert(BlockInfo.begin() + NewBB->getNumber(), BasicBlockInfo());
264
265
return NewBB;
266
}
267
268
/// Split the basic block containing MI into two blocks, which are joined by
269
/// an unconditional branch. Update data structures and renumber blocks to
270
/// account for this change and returns the newly created block.
271
MachineBasicBlock *
272
BranchRelaxation::splitBlockBeforeInstr(MachineInstr &MI,
273
MachineBasicBlock *DestBB) {
274
MachineBasicBlock *OrigBB = MI.getParent();
275
276
// Create a new MBB for the code after the OrigBB.
277
MachineBasicBlock *NewBB =
278
MF->CreateMachineBasicBlock(OrigBB->getBasicBlock());
279
MF->insert(++OrigBB->getIterator(), NewBB);
280
281
// Place the new block in the same section as OrigBB.
282
NewBB->setSectionID(OrigBB->getSectionID());
283
NewBB->setIsEndSection(OrigBB->isEndSection());
284
OrigBB->setIsEndSection(false);
285
286
// Splice the instructions starting with MI over to NewBB.
287
NewBB->splice(NewBB->end(), OrigBB, MI.getIterator(), OrigBB->end());
288
289
// Add an unconditional branch from OrigBB to NewBB.
290
// Note the new unconditional branch is not being recorded.
291
// There doesn't seem to be meaningful DebugInfo available; this doesn't
292
// correspond to anything in the source.
293
TII->insertUnconditionalBranch(*OrigBB, NewBB, DebugLoc());
294
295
// Insert an entry into BlockInfo to align it properly with the block numbers.
296
BlockInfo.insert(BlockInfo.begin() + NewBB->getNumber(), BasicBlockInfo());
297
298
NewBB->transferSuccessors(OrigBB);
299
OrigBB->addSuccessor(NewBB);
300
OrigBB->addSuccessor(DestBB);
301
302
// Cleanup potential unconditional branch to successor block.
303
// Note that updateTerminator may change the size of the blocks.
304
OrigBB->updateTerminator(NewBB);
305
306
// Figure out how large the OrigBB is. As the first half of the original
307
// block, it cannot contain a tablejump. The size includes
308
// the new jump we added. (It should be possible to do this without
309
// recounting everything, but it's very confusing, and this is rarely
310
// executed.)
311
BlockInfo[OrigBB->getNumber()].Size = computeBlockSize(*OrigBB);
312
313
// Figure out how large the NewMBB is. As the second half of the original
314
// block, it may contain a tablejump.
315
BlockInfo[NewBB->getNumber()].Size = computeBlockSize(*NewBB);
316
317
// All BBOffsets following these blocks must be modified.
318
adjustBlockOffsets(*OrigBB);
319
320
// Need to fix live-in lists if we track liveness.
321
if (TRI->trackLivenessAfterRegAlloc(*MF))
322
computeAndAddLiveIns(LiveRegs, *NewBB);
323
324
++NumSplit;
325
326
return NewBB;
327
}
328
329
/// isBlockInRange - Returns true if the distance between specific MI and
330
/// specific BB can fit in MI's displacement field.
331
bool BranchRelaxation::isBlockInRange(
332
const MachineInstr &MI, const MachineBasicBlock &DestBB) const {
333
int64_t BrOffset = getInstrOffset(MI);
334
int64_t DestOffset = BlockInfo[DestBB.getNumber()].Offset;
335
336
const MachineBasicBlock *SrcBB = MI.getParent();
337
338
if (TII->isBranchOffsetInRange(MI.getOpcode(),
339
SrcBB->getSectionID() != DestBB.getSectionID()
340
? TM->getMaxCodeSize()
341
: DestOffset - BrOffset))
342
return true;
343
344
LLVM_DEBUG(dbgs() << "Out of range branch to destination "
345
<< printMBBReference(DestBB) << " from "
346
<< printMBBReference(*MI.getParent()) << " to "
347
<< DestOffset << " offset " << DestOffset - BrOffset << '\t'
348
<< MI);
349
350
return false;
351
}
352
353
/// fixupConditionalBranch - Fix up a conditional branch whose destination is
354
/// too far away to fit in its displacement field. It is converted to an inverse
355
/// conditional branch + an unconditional branch to the destination.
356
bool BranchRelaxation::fixupConditionalBranch(MachineInstr &MI) {
357
DebugLoc DL = MI.getDebugLoc();
358
MachineBasicBlock *MBB = MI.getParent();
359
MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
360
MachineBasicBlock *NewBB = nullptr;
361
SmallVector<MachineOperand, 4> Cond;
362
363
auto insertUncondBranch = [&](MachineBasicBlock *MBB,
364
MachineBasicBlock *DestBB) {
365
unsigned &BBSize = BlockInfo[MBB->getNumber()].Size;
366
int NewBrSize = 0;
367
TII->insertUnconditionalBranch(*MBB, DestBB, DL, &NewBrSize);
368
BBSize += NewBrSize;
369
};
370
auto insertBranch = [&](MachineBasicBlock *MBB, MachineBasicBlock *TBB,
371
MachineBasicBlock *FBB,
372
SmallVectorImpl<MachineOperand>& Cond) {
373
unsigned &BBSize = BlockInfo[MBB->getNumber()].Size;
374
int NewBrSize = 0;
375
TII->insertBranch(*MBB, TBB, FBB, Cond, DL, &NewBrSize);
376
BBSize += NewBrSize;
377
};
378
auto removeBranch = [&](MachineBasicBlock *MBB) {
379
unsigned &BBSize = BlockInfo[MBB->getNumber()].Size;
380
int RemovedSize = 0;
381
TII->removeBranch(*MBB, &RemovedSize);
382
BBSize -= RemovedSize;
383
};
384
385
auto finalizeBlockChanges = [&](MachineBasicBlock *MBB,
386
MachineBasicBlock *NewBB) {
387
// Keep the block offsets up to date.
388
adjustBlockOffsets(*MBB);
389
390
// Need to fix live-in lists if we track liveness.
391
if (NewBB && TRI->trackLivenessAfterRegAlloc(*MF))
392
computeAndAddLiveIns(LiveRegs, *NewBB);
393
};
394
395
bool Fail = TII->analyzeBranch(*MBB, TBB, FBB, Cond);
396
assert(!Fail && "branches to be relaxed must be analyzable");
397
(void)Fail;
398
399
// Since cross-section conditional branches to the cold section are rarely
400
// taken, try to avoid inverting the condition. Instead, add a "trampoline
401
// branch", which unconditionally branches to the branch destination. Place
402
// the trampoline branch at the end of the function and retarget the
403
// conditional branch to the trampoline.
404
// tbz L1
405
// =>
406
// tbz L1Trampoline
407
// ...
408
// L1Trampoline: b L1
409
if (MBB->getSectionID() != TBB->getSectionID() &&
410
TBB->getSectionID() == MBBSectionID::ColdSectionID &&
411
TrampolineInsertionPoint != nullptr) {
412
// If the insertion point is out of range, we can't put a trampoline there.
413
NewBB =
414
createNewBlockAfter(*TrampolineInsertionPoint, MBB->getBasicBlock());
415
416
if (isBlockInRange(MI, *NewBB)) {
417
LLVM_DEBUG(dbgs() << " Retarget destination to trampoline at "
418
<< NewBB->back());
419
420
insertUncondBranch(NewBB, TBB);
421
422
// Update the successor lists to include the trampoline.
423
MBB->replaceSuccessor(TBB, NewBB);
424
NewBB->addSuccessor(TBB);
425
426
// Replace branch in the current (MBB) block.
427
removeBranch(MBB);
428
insertBranch(MBB, NewBB, FBB, Cond);
429
430
TrampolineInsertionPoint = NewBB;
431
finalizeBlockChanges(MBB, NewBB);
432
return true;
433
}
434
435
LLVM_DEBUG(
436
dbgs() << " Trampoline insertion point out of range for Bcc from "
437
<< printMBBReference(*MBB) << " to " << printMBBReference(*TBB)
438
<< ".\n");
439
TrampolineInsertionPoint->setIsEndSection(NewBB->isEndSection());
440
MF->erase(NewBB);
441
}
442
443
// Add an unconditional branch to the destination and invert the branch
444
// condition to jump over it:
445
// tbz L1
446
// =>
447
// tbnz L2
448
// b L1
449
// L2:
450
451
bool ReversedCond = !TII->reverseBranchCondition(Cond);
452
if (ReversedCond) {
453
if (FBB && isBlockInRange(MI, *FBB)) {
454
// Last MI in the BB is an unconditional branch. We can simply invert the
455
// condition and swap destinations:
456
// beq L1
457
// b L2
458
// =>
459
// bne L2
460
// b L1
461
LLVM_DEBUG(dbgs() << " Invert condition and swap "
462
"its destination with "
463
<< MBB->back());
464
465
removeBranch(MBB);
466
insertBranch(MBB, FBB, TBB, Cond);
467
finalizeBlockChanges(MBB, nullptr);
468
return true;
469
}
470
if (FBB) {
471
// We need to split the basic block here to obtain two long-range
472
// unconditional branches.
473
NewBB = createNewBlockAfter(*MBB);
474
475
insertUncondBranch(NewBB, FBB);
476
// Update the succesor lists according to the transformation to follow.
477
// Do it here since if there's no split, no update is needed.
478
MBB->replaceSuccessor(FBB, NewBB);
479
NewBB->addSuccessor(FBB);
480
}
481
482
// We now have an appropriate fall-through block in place (either naturally or
483
// just created), so we can use the inverted the condition.
484
MachineBasicBlock &NextBB = *std::next(MachineFunction::iterator(MBB));
485
486
LLVM_DEBUG(dbgs() << " Insert B to " << printMBBReference(*TBB)
487
<< ", invert condition and change dest. to "
488
<< printMBBReference(NextBB) << '\n');
489
490
removeBranch(MBB);
491
// Insert a new conditional branch and a new unconditional branch.
492
insertBranch(MBB, &NextBB, TBB, Cond);
493
494
finalizeBlockChanges(MBB, NewBB);
495
return true;
496
}
497
// Branch cond can't be inverted.
498
// In this case we always add a block after the MBB.
499
LLVM_DEBUG(dbgs() << " The branch condition can't be inverted. "
500
<< " Insert a new BB after " << MBB->back());
501
502
if (!FBB)
503
FBB = &(*std::next(MachineFunction::iterator(MBB)));
504
505
// This is the block with cond. branch and the distance to TBB is too long.
506
// beq L1
507
// L2:
508
509
// We do the following transformation:
510
// beq NewBB
511
// b L2
512
// NewBB:
513
// b L1
514
// L2:
515
516
NewBB = createNewBlockAfter(*MBB);
517
insertUncondBranch(NewBB, TBB);
518
519
LLVM_DEBUG(dbgs() << " Insert cond B to the new BB "
520
<< printMBBReference(*NewBB)
521
<< " Keep the exiting condition.\n"
522
<< " Insert B to " << printMBBReference(*FBB) << ".\n"
523
<< " In the new BB: Insert B to "
524
<< printMBBReference(*TBB) << ".\n");
525
526
// Update the successor lists according to the transformation to follow.
527
MBB->replaceSuccessor(TBB, NewBB);
528
NewBB->addSuccessor(TBB);
529
530
// Replace branch in the current (MBB) block.
531
removeBranch(MBB);
532
insertBranch(MBB, NewBB, FBB, Cond);
533
534
finalizeBlockChanges(MBB, NewBB);
535
return true;
536
}
537
538
bool BranchRelaxation::fixupUnconditionalBranch(MachineInstr &MI) {
539
MachineBasicBlock *MBB = MI.getParent();
540
SmallVector<MachineOperand, 4> Cond;
541
unsigned OldBrSize = TII->getInstSizeInBytes(MI);
542
MachineBasicBlock *DestBB = TII->getBranchDestBlock(MI);
543
544
int64_t DestOffset = BlockInfo[DestBB->getNumber()].Offset;
545
int64_t SrcOffset = getInstrOffset(MI);
546
547
assert(!TII->isBranchOffsetInRange(
548
MI.getOpcode(), MBB->getSectionID() != DestBB->getSectionID()
549
? TM->getMaxCodeSize()
550
: DestOffset - SrcOffset));
551
552
BlockInfo[MBB->getNumber()].Size -= OldBrSize;
553
554
MachineBasicBlock *BranchBB = MBB;
555
556
// If this was an expanded conditional branch, there is already a single
557
// unconditional branch in a block.
558
if (!MBB->empty()) {
559
BranchBB = createNewBlockAfter(*MBB);
560
561
// Add live outs.
562
for (const MachineBasicBlock *Succ : MBB->successors()) {
563
for (const MachineBasicBlock::RegisterMaskPair &LiveIn : Succ->liveins())
564
BranchBB->addLiveIn(LiveIn);
565
}
566
567
BranchBB->sortUniqueLiveIns();
568
BranchBB->addSuccessor(DestBB);
569
MBB->replaceSuccessor(DestBB, BranchBB);
570
if (TrampolineInsertionPoint == MBB)
571
TrampolineInsertionPoint = BranchBB;
572
}
573
574
DebugLoc DL = MI.getDebugLoc();
575
MI.eraseFromParent();
576
577
// Create the optional restore block and, initially, place it at the end of
578
// function. That block will be placed later if it's used; otherwise, it will
579
// be erased.
580
MachineBasicBlock *RestoreBB = createNewBlockAfter(MF->back(),
581
DestBB->getBasicBlock());
582
std::prev(RestoreBB->getIterator())
583
->setIsEndSection(RestoreBB->isEndSection());
584
RestoreBB->setIsEndSection(false);
585
586
TII->insertIndirectBranch(*BranchBB, *DestBB, *RestoreBB, DL,
587
BranchBB->getSectionID() != DestBB->getSectionID()
588
? TM->getMaxCodeSize()
589
: DestOffset - SrcOffset,
590
RS.get());
591
592
BlockInfo[BranchBB->getNumber()].Size = computeBlockSize(*BranchBB);
593
adjustBlockOffsets(*MBB);
594
595
// If RestoreBB is required, place it appropriately.
596
if (!RestoreBB->empty()) {
597
// If the jump is Cold -> Hot, don't place the restore block (which is
598
// cold) in the middle of the function. Place it at the end.
599
if (MBB->getSectionID() == MBBSectionID::ColdSectionID &&
600
DestBB->getSectionID() != MBBSectionID::ColdSectionID) {
601
MachineBasicBlock *NewBB = createNewBlockAfter(*TrampolineInsertionPoint);
602
TII->insertUnconditionalBranch(*NewBB, DestBB, DebugLoc());
603
BlockInfo[NewBB->getNumber()].Size = computeBlockSize(*NewBB);
604
605
// New trampolines should be inserted after NewBB.
606
TrampolineInsertionPoint = NewBB;
607
608
// Retarget the unconditional branch to the trampoline block.
609
BranchBB->replaceSuccessor(DestBB, NewBB);
610
NewBB->addSuccessor(DestBB);
611
612
DestBB = NewBB;
613
}
614
615
// In all other cases, try to place just before DestBB.
616
617
// TODO: For multiple far branches to the same destination, there are
618
// chances that some restore blocks could be shared if they clobber the
619
// same registers and share the same restore sequence. So far, those
620
// restore blocks are just duplicated for each far branch.
621
assert(!DestBB->isEntryBlock());
622
MachineBasicBlock *PrevBB = &*std::prev(DestBB->getIterator());
623
// Fall through only if PrevBB has no unconditional branch as one of its
624
// terminators.
625
if (auto *FT = PrevBB->getLogicalFallThrough()) {
626
assert(FT == DestBB);
627
TII->insertUnconditionalBranch(*PrevBB, FT, DebugLoc());
628
BlockInfo[PrevBB->getNumber()].Size = computeBlockSize(*PrevBB);
629
}
630
// Now, RestoreBB could be placed directly before DestBB.
631
MF->splice(DestBB->getIterator(), RestoreBB->getIterator());
632
// Update successors and predecessors.
633
RestoreBB->addSuccessor(DestBB);
634
BranchBB->replaceSuccessor(DestBB, RestoreBB);
635
if (TRI->trackLivenessAfterRegAlloc(*MF))
636
computeAndAddLiveIns(LiveRegs, *RestoreBB);
637
// Compute the restore block size.
638
BlockInfo[RestoreBB->getNumber()].Size = computeBlockSize(*RestoreBB);
639
// Update the offset starting from the previous block.
640
adjustBlockOffsets(*PrevBB);
641
642
// Fix up section information for RestoreBB and DestBB
643
RestoreBB->setSectionID(DestBB->getSectionID());
644
RestoreBB->setIsBeginSection(DestBB->isBeginSection());
645
DestBB->setIsBeginSection(false);
646
RelaxedUnconditionals.insert({BranchBB, RestoreBB});
647
} else {
648
// Remove restore block if it's not required.
649
MF->erase(RestoreBB);
650
RelaxedUnconditionals.insert({BranchBB, DestBB});
651
}
652
653
return true;
654
}
655
656
bool BranchRelaxation::relaxBranchInstructions() {
657
bool Changed = false;
658
659
// Relaxing branches involves creating new basic blocks, so re-eval
660
// end() for termination.
661
for (MachineBasicBlock &MBB : *MF) {
662
// Empty block?
663
MachineBasicBlock::iterator Last = MBB.getLastNonDebugInstr();
664
if (Last == MBB.end())
665
continue;
666
667
// Expand the unconditional branch first if necessary. If there is a
668
// conditional branch, this will end up changing the branch destination of
669
// it to be over the newly inserted indirect branch block, which may avoid
670
// the need to try expanding the conditional branch first, saving an extra
671
// jump.
672
if (Last->isUnconditionalBranch()) {
673
// Unconditional branch destination might be unanalyzable, assume these
674
// are OK.
675
if (MachineBasicBlock *DestBB = TII->getBranchDestBlock(*Last)) {
676
if (!isBlockInRange(*Last, *DestBB) && !TII->isTailCall(*Last) &&
677
!RelaxedUnconditionals.contains({&MBB, DestBB})) {
678
fixupUnconditionalBranch(*Last);
679
++NumUnconditionalRelaxed;
680
Changed = true;
681
}
682
}
683
}
684
685
// Loop over the conditional branches.
686
MachineBasicBlock::iterator Next;
687
for (MachineBasicBlock::iterator J = MBB.getFirstTerminator();
688
J != MBB.end(); J = Next) {
689
Next = std::next(J);
690
MachineInstr &MI = *J;
691
692
if (!MI.isConditionalBranch())
693
continue;
694
695
if (MI.getOpcode() == TargetOpcode::FAULTING_OP)
696
// FAULTING_OP's destination is not encoded in the instruction stream
697
// and thus never needs relaxed.
698
continue;
699
700
MachineBasicBlock *DestBB = TII->getBranchDestBlock(MI);
701
if (!isBlockInRange(MI, *DestBB)) {
702
if (Next != MBB.end() && Next->isConditionalBranch()) {
703
// If there are multiple conditional branches, this isn't an
704
// analyzable block. Split later terminators into a new block so
705
// each one will be analyzable.
706
707
splitBlockBeforeInstr(*Next, DestBB);
708
} else {
709
fixupConditionalBranch(MI);
710
++NumConditionalRelaxed;
711
}
712
713
Changed = true;
714
715
// This may have modified all of the terminators, so start over.
716
Next = MBB.getFirstTerminator();
717
}
718
}
719
}
720
721
return Changed;
722
}
723
724
bool BranchRelaxation::runOnMachineFunction(MachineFunction &mf) {
725
MF = &mf;
726
727
LLVM_DEBUG(dbgs() << "***** BranchRelaxation *****\n");
728
729
const TargetSubtargetInfo &ST = MF->getSubtarget();
730
TII = ST.getInstrInfo();
731
TM = &MF->getTarget();
732
733
TRI = ST.getRegisterInfo();
734
if (TRI->trackLivenessAfterRegAlloc(*MF))
735
RS.reset(new RegScavenger());
736
737
// Renumber all of the machine basic blocks in the function, guaranteeing that
738
// the numbers agree with the position of the block in the function.
739
MF->RenumberBlocks();
740
741
// Do the initial scan of the function, building up information about the
742
// sizes of each block.
743
scanFunction();
744
745
LLVM_DEBUG(dbgs() << " Basic blocks before relaxation\n"; dumpBBs(););
746
747
bool MadeChange = false;
748
while (relaxBranchInstructions())
749
MadeChange = true;
750
751
// After a while, this might be made debug-only, but it is not expensive.
752
verify();
753
754
LLVM_DEBUG(dbgs() << " Basic blocks after relaxation\n\n"; dumpBBs());
755
756
BlockInfo.clear();
757
RelaxedUnconditionals.clear();
758
759
return MadeChange;
760
}
761
762