Skip to content

Commit 6015a04

Browse files
committed
[Propeller] Use Fixed MBB ID instead of volatile MachineBasicBlock::Number.
Let Propeller use specialized IDs for basic blocks, instead of MBB number. This allows optimizations not just prior to asm-printer, but throughout the entire codegen. This patch only implements the functionality under the new `LLVM_BB_ADDR_MAP` version, but the old version is still being used. A later patch will change the used version. ####Background Today Propeller uses machine basic block (MBB) numbers, which already exist, to map native assembly to machine IR. This is done as follows. - Basic block addresses are captured and dumped into the `LLVM_BB_ADDR_MAP` section just before the AsmPrinter pass which writes out object files. This ensures that we have a mapping that is close to assembly. - Profiling mapping works by taking a virtual address of an instruction and looking up the `LLVM_BB_ADDR_MAP` section to find the MBB number it corresponds to. - While this works well today, we need to do better when we scale Propeller to target other Machine IR optimizations like spill code optimization. Register allocation happens earlier in the Machine IR pipeline and we need an annotation mechanism that is valid at that point. - The current scheme will not work in this scenario because the MBB number of a particular basic block is not fixed and changes over the course of codegen (via renumbering, adding, and removing the basic blocks). - In other words, the volatile MBB numbers do not provide a one-to-one correspondence throughout the lifetime of Machine IR. Profile annotation using MBB numbers is restricted to a fixed point; only valid at the exact point where it was dumped. - Further, the object file can only be dumped before AsmPrinter and cannot be dumped at an arbitrary point in the Machine IR pass pipeline. Hence, MBB numbers are not suitable and we need something else. ####Solution We propose using fixed unique incremental MBB IDs for basic blocks instead of volatile MBB numbers. These IDs are assigned upon the creation of machine basic blocks. We modify `MachineFunction::CreateMachineBasicBlock` to assign the fixed ID to every newly created basic block. It assigns `MachineFunction::NextMBBID` to the MBB ID and then increments it, which ensures having unique IDs. To ensure correct profile attribution, multiple equivalent compilations must generate the same Propeller IDs. This is guaranteed as long as the MachineFunction passes run in the same order. Since the `NextBBID` variable is scoped to `MachineFunction`, interleaving of codegen for different functions won't cause any inconsistencies. The new encoding is generated under the new version number 2 and we keep backward-compatibility with older versions. ####Impact on Size of the `LLVM_BB_ADDR_MAP` Section Emitting the Propeller ID results in a 23% increase in the size of the `LLVM_BB_ADDR_MAP` section for the clang binary. Reviewed By: tmsriram Differential Revision: https://reviews.llvm.org/D100808
1 parent 1f421b6 commit 6015a04

24 files changed

+506
-143
lines changed

llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ namespace llvm {
3131

3232
// The cluster information for a machine basic block.
3333
struct BBClusterInfo {
34-
// MachineBasicBlock ID.
35-
unsigned MBBNumber;
34+
// Unique ID for this basic block.
35+
unsigned BBID;
3636
// Cluster ID this basic block belongs to.
3737
unsigned ClusterID;
3838
// Position of basic block within the cluster.

llvm/include/llvm/CodeGen/MachineBasicBlock.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,10 @@ class MachineBasicBlock
169169
/// Indicate that this basic block is the entry block of a cleanup funclet.
170170
bool IsCleanupFuncletEntry = false;
171171

172+
/// Fixed unique ID assigned to this basic block upon creation. Used with
173+
/// basic block sections and basic block labels.
174+
Optional<unsigned> BBID;
175+
172176
/// With basic block sections, this stores the Section ID of the basic block.
173177
MBBSectionID SectionID{0};
174178

@@ -620,6 +624,14 @@ class MachineBasicBlock
620624

621625
void setIsEndSection(bool V = true) { IsEndSection = V; }
622626

627+
Optional<unsigned> getBBID() const { return BBID; }
628+
629+
/// Returns the BBID of the block when BBAddrMapVersion >= 2, otherwise
630+
/// returns `MachineBasicBlock::Number`.
631+
/// TODO: Remove this function when version 1 is deprecated and replace its
632+
/// uses with `getBBID()`.
633+
unsigned getBBIDOrNumber() const;
634+
623635
/// Returns the section ID of this basic block.
624636
MBBSectionID getSectionID() const { return SectionID; }
625637

@@ -629,6 +641,12 @@ class MachineBasicBlock
629641
((unsigned)SectionID.Type) + SectionID.Number;
630642
}
631643

644+
/// Sets the fixed BBID of this basic block.
645+
void setBBID(unsigned V) {
646+
assert(!BBID.has_value() && "Cannot change BBID.");
647+
BBID = V;
648+
}
649+
632650
/// Sets the section ID for this basic block.
633651
void setSectionID(MBBSectionID V) { SectionID = V; }
634652

llvm/include/llvm/CodeGen/MachineFunction.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,9 @@ class LLVM_EXTERNAL_VISIBILITY MachineFunction {
374374
bool HasEHScopes = false;
375375
bool HasEHFunclets = false;
376376

377+
/// BBID to assign to the next basic block of this function.
378+
unsigned NextBBID = 0;
379+
377380
/// Section Type for basic blocks, only relevant with basic block sections.
378381
BasicBlockSection BBSectionsType = BasicBlockSection::None;
379382

llvm/include/llvm/Object/ELFTypes.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,7 @@ struct BBAddrMap {
799799
uint64_t Addr; // Function address
800800
// Struct representing the BBAddrMap information for one basic block.
801801
struct BBEntry {
802+
uint32_t ID; // Unique ID of this basic block.
802803
uint32_t Offset; // Offset of basic block relative to function start.
803804
uint32_t Size; // Size of the basic block.
804805

@@ -809,13 +810,13 @@ struct BBAddrMap {
809810
bool IsEHPad; // If this is an exception handling block.
810811
bool CanFallThrough; // If this block can fall through to its next.
811812

812-
BBEntry(uint32_t Offset, uint32_t Size, uint32_t Metadata)
813-
: Offset(Offset), Size(Size), HasReturn(Metadata & 1),
813+
BBEntry(uint32_t ID, uint32_t Offset, uint32_t Size, uint32_t Metadata)
814+
: ID(ID), Offset(Offset), Size(Size), HasReturn(Metadata & 1),
814815
HasTailCall(Metadata & (1 << 1)), IsEHPad(Metadata & (1 << 2)),
815816
CanFallThrough(Metadata & (1 << 3)){};
816817

817818
bool operator==(const BBEntry &Other) const {
818-
return Offset == Other.Offset && Size == Other.Size &&
819+
return ID == Other.ID && Offset == Other.Offset && Size == Other.Size &&
819820
HasReturn == Other.HasReturn && HasTailCall == Other.HasTailCall &&
820821
IsEHPad == Other.IsEHPad && CanFallThrough == Other.CanFallThrough;
821822
}

llvm/include/llvm/ObjectYAML/ELFYAML.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ struct DynamicEntry {
158158

159159
struct BBAddrMapEntry {
160160
struct BBEntry {
161+
uint32_t ID;
161162
llvm::yaml::Hex64 AddressOffset;
162163
llvm::yaml::Hex64 Size;
163164
llvm::yaml::Hex64 Metadata;

llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1347,7 +1347,8 @@ void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) {
13471347
OutStreamer->pushSection();
13481348
OutStreamer->switchSection(BBAddrMapSection);
13491349
OutStreamer->AddComment("version");
1350-
OutStreamer->emitInt8(OutStreamer->getContext().getBBAddrMapVersion());
1350+
uint8_t BBAddrMapVersion = OutStreamer->getContext().getBBAddrMapVersion();
1351+
OutStreamer->emitInt8(BBAddrMapVersion);
13511352
OutStreamer->AddComment("feature");
13521353
OutStreamer->emitInt8(0);
13531354
OutStreamer->AddComment("function address");
@@ -1359,12 +1360,19 @@ void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) {
13591360
for (const MachineBasicBlock &MBB : MF) {
13601361
const MCSymbol *MBBSymbol =
13611362
MBB.isEntryBlock() ? FunctionSymbol : MBB.getSymbol();
1363+
// TODO: Remove this check when version 1 is deprecated.
1364+
if (BBAddrMapVersion > 1) {
1365+
OutStreamer->AddComment("BB id");
1366+
// Emit the BB ID for this basic block.
1367+
OutStreamer->emitULEB128IntValue(*MBB.getBBID());
1368+
}
13621369
// Emit the basic block offset relative to the end of the previous block.
13631370
// This is zero unless the block is padded due to alignment.
13641371
emitLabelDifferenceAsULEB128(MBBSymbol, PrevMBBEndSymbol);
13651372
// Emit the basic block size. When BBs have alignments, their size cannot
13661373
// always be computed from their offsets.
13671374
emitLabelDifferenceAsULEB128(MBB.getEndSymbol(), MBBSymbol);
1375+
// Emit the Metadata.
13681376
OutStreamer->emitULEB128IntValue(getBBAddrMapMetadata(MBB));
13691377
PrevMBBEndSymbol = MBB.getEndSymbol();
13701378
}

llvm/lib/CodeGen/BasicBlockSections.cpp

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@
7171
#include "llvm/ADT/Optional.h"
7272
#include "llvm/ADT/SmallVector.h"
7373
#include "llvm/ADT/StringRef.h"
74-
#include "llvm/CodeGen/BasicBlockSectionsProfileReader.h"
7574
#include "llvm/CodeGen/BasicBlockSectionUtils.h"
75+
#include "llvm/CodeGen/BasicBlockSectionsProfileReader.h"
7676
#include "llvm/CodeGen/MachineFunction.h"
7777
#include "llvm/CodeGen/MachineFunctionPass.h"
7878
#include "llvm/CodeGen/Passes.h"
@@ -131,9 +131,9 @@ INITIALIZE_PASS(BasicBlockSections, "bbsections-prepare",
131131

132132
// This function updates and optimizes the branching instructions of every basic
133133
// block in a given function to account for changes in the layout.
134-
static void updateBranches(
135-
MachineFunction &MF,
136-
const SmallVector<MachineBasicBlock *, 4> &PreLayoutFallThroughs) {
134+
static void
135+
updateBranches(MachineFunction &MF,
136+
const SmallVector<MachineBasicBlock *> &PreLayoutFallThroughs) {
137137
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
138138
SmallVector<MachineOperand, 4> Cond;
139139
for (auto &MBB : MF) {
@@ -168,7 +168,7 @@ static void updateBranches(
168168
bool getBBClusterInfoForFunction(
169169
const MachineFunction &MF,
170170
BasicBlockSectionsProfileReader *BBSectionsProfileReader,
171-
std::vector<Optional<BBClusterInfo>> &V) {
171+
DenseMap<unsigned, BBClusterInfo> &V) {
172172

173173
// Find the assoicated cluster information.
174174
std::pair<bool, SmallVector<BBClusterInfo, 4>> P =
@@ -183,13 +183,8 @@ bool getBBClusterInfoForFunction(
183183
return true;
184184
}
185185

186-
V.resize(MF.getNumBlockIDs());
187-
for (auto bbClusterInfo : P.second) {
188-
// Bail out if the cluster information contains invalid MBB numbers.
189-
if (bbClusterInfo.MBBNumber >= MF.getNumBlockIDs())
190-
return false;
191-
V[bbClusterInfo.MBBNumber] = bbClusterInfo;
192-
}
186+
for (const BBClusterInfo &BBCI : P.second)
187+
V[BBCI.BBID] = BBCI;
193188
return true;
194189
}
195190

@@ -200,11 +195,12 @@ bool getBBClusterInfoForFunction(
200195
// clusters, they are moved into a single "Exception" section. Eventually,
201196
// clusters are ordered in increasing order of their IDs, with the "Exception"
202197
// and "Cold" succeeding all other clusters.
203-
// FuncBBClusterInfo represent the cluster information for basic blocks. If this
204-
// is empty, it means unique sections for all basic blocks in the function.
198+
// FuncBBClusterInfo represent the cluster information for basic blocks. It
199+
// maps from BBID of basic blocks to their cluster information. If this is
200+
// empty, it means unique sections for all basic blocks in the function.
205201
static void
206202
assignSections(MachineFunction &MF,
207-
const std::vector<Optional<BBClusterInfo>> &FuncBBClusterInfo) {
203+
const DenseMap<unsigned, BBClusterInfo> &FuncBBClusterInfo) {
208204
assert(MF.hasBBSections() && "BB Sections is not set for function.");
209205
// This variable stores the section ID of the cluster containing eh_pads (if
210206
// all eh_pads are one cluster). If more than one cluster contain eh_pads, we
@@ -219,15 +215,21 @@ assignSections(MachineFunction &MF,
219215
if (MF.getTarget().getBBSectionsType() == llvm::BasicBlockSection::All ||
220216
FuncBBClusterInfo.empty()) {
221217
// If unique sections are desired for all basic blocks of the function, we
222-
// set every basic block's section ID equal to its number (basic block
223-
// id). This further ensures that basic blocks are ordered canonically.
224-
MBB.setSectionID({static_cast<unsigned int>(MBB.getNumber())});
225-
} else if (FuncBBClusterInfo[MBB.getNumber()])
226-
MBB.setSectionID(FuncBBClusterInfo[MBB.getNumber()]->ClusterID);
227-
else {
228-
// BB goes into the special cold section if it is not specified in the
229-
// cluster info map.
230-
MBB.setSectionID(MBBSectionID::ColdSectionID);
218+
// set every basic block's section ID equal to its original position in
219+
// the layout (which is equal to its number). This ensures that basic
220+
// blocks are ordered canonically.
221+
MBB.setSectionID(MBB.getNumber());
222+
} else {
223+
// TODO: Replace `getBBIDOrNumber` with `getBBID` once version 1 is
224+
// deprecated.
225+
auto I = FuncBBClusterInfo.find(MBB.getBBIDOrNumber());
226+
if (I != FuncBBClusterInfo.end()) {
227+
MBB.setSectionID(I->second.ClusterID);
228+
} else {
229+
// BB goes into the special cold section if it is not specified in the
230+
// cluster info map.
231+
MBB.setSectionID(MBBSectionID::ColdSectionID);
232+
}
231233
}
232234

233235
if (MBB.isEHPad() && EHPadsSectionID != MBB.getSectionID() &&
@@ -250,12 +252,14 @@ assignSections(MachineFunction &MF,
250252

251253
void llvm::sortBasicBlocksAndUpdateBranches(
252254
MachineFunction &MF, MachineBasicBlockComparator MBBCmp) {
253-
SmallVector<MachineBasicBlock *, 4> PreLayoutFallThroughs(
254-
MF.getNumBlockIDs());
255+
[[maybe_unused]] const MachineBasicBlock *EntryBlock = &MF.front();
256+
SmallVector<MachineBasicBlock *> PreLayoutFallThroughs(MF.getNumBlockIDs());
255257
for (auto &MBB : MF)
256258
PreLayoutFallThroughs[MBB.getNumber()] = MBB.getFallThrough();
257259

258260
MF.sort(MBBCmp);
261+
assert(&MF.front() == EntryBlock &&
262+
"Entry block should not be displaced by basic block sections");
259263

260264
// Set IsBeginSection and IsEndSection according to the assigned section IDs.
261265
MF.assignBeginEndSections();
@@ -318,11 +322,14 @@ bool BasicBlockSections::runOnMachineFunction(MachineFunction &MF) {
318322
if (BBSectionsType == BasicBlockSection::List &&
319323
hasInstrProfHashMismatch(MF))
320324
return true;
321-
322-
// Renumber blocks before sorting them for basic block sections. This is
323-
// useful during sorting, basic blocks in the same section will retain the
324-
// default order. This renumbering should also be done for basic block
325-
// labels to match the profiles with the correct blocks.
325+
// Renumber blocks before sorting them. This is useful during sorting,
326+
// basic blocks in the same section will retain the default order.
327+
// This renumbering should also be done for basic block labels to match the
328+
// profiles with the correct blocks.
329+
// For LLVM_BB_ADDR_MAP versions 2 and higher, this renumbering serves
330+
// the different purpose of accessing the original layout positions and
331+
// finding the original fallthroughs.
332+
// TODO: Change the above comment accordingly when version 1 is deprecated.
326333
MF.RenumberBlocks();
327334

328335
if (BBSectionsType == BasicBlockSection::Labels) {
@@ -332,7 +339,8 @@ bool BasicBlockSections::runOnMachineFunction(MachineFunction &MF) {
332339

333340
BBSectionsProfileReader = &getAnalysis<BasicBlockSectionsProfileReader>();
334341

335-
std::vector<Optional<BBClusterInfo>> FuncBBClusterInfo;
342+
// Map from BBID of blocks to their cluster information.
343+
DenseMap<unsigned, BBClusterInfo> FuncBBClusterInfo;
336344
if (BBSectionsType == BasicBlockSection::List &&
337345
!getBBClusterInfoForFunction(MF, BBSectionsProfileReader,
338346
FuncBBClusterInfo))
@@ -372,8 +380,8 @@ bool BasicBlockSections::runOnMachineFunction(MachineFunction &MF) {
372380
// If the two basic block are in the same section, the order is decided by
373381
// their position within the section.
374382
if (XSectionID.Type == MBBSectionID::SectionType::Default)
375-
return FuncBBClusterInfo[X.getNumber()]->PositionInCluster <
376-
FuncBBClusterInfo[Y.getNumber()]->PositionInCluster;
383+
return FuncBBClusterInfo.lookup(X.getBBIDOrNumber()).PositionInCluster <
384+
FuncBBClusterInfo.lookup(Y.getBBIDOrNumber()).PositionInCluster;
377385
return X.getNumber() < Y.getNumber();
378386
};
379387

llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -93,23 +93,23 @@ static Error getBBClusterInfo(const MemoryBuffer *MBuf,
9393
if (FI == ProgramBBClusterInfo.end())
9494
return invalidProfileError(
9595
"Cluster list does not follow a function name specifier.");
96-
SmallVector<StringRef, 4> BBIndexes;
97-
S.split(BBIndexes, ' ');
96+
SmallVector<StringRef, 4> BBIDs;
97+
S.split(BBIDs, ' ');
9898
// Reset current cluster position.
9999
CurrentPosition = 0;
100-
for (auto BBIndexStr : BBIndexes) {
101-
unsigned long long BBIndex;
102-
if (getAsUnsignedInteger(BBIndexStr, 10, BBIndex))
100+
for (auto BBIDStr : BBIDs) {
101+
unsigned long long BBID;
102+
if (getAsUnsignedInteger(BBIDStr, 10, BBID))
103103
return invalidProfileError(Twine("Unsigned integer expected: '") +
104-
BBIndexStr + "'.");
105-
if (!FuncBBIDs.insert(BBIndex).second)
104+
BBIDStr + "'.");
105+
if (!FuncBBIDs.insert(BBID).second)
106106
return invalidProfileError(Twine("Duplicate basic block id found '") +
107-
BBIndexStr + "'.");
108-
if (!BBIndex && CurrentPosition)
107+
BBIDStr + "'.");
108+
if (BBID == 0 && CurrentPosition)
109109
return invalidProfileError("Entry BB (0) does not begin a cluster.");
110110

111-
FI->second.emplace_back(BBClusterInfo{
112-
((unsigned)BBIndex), CurrentCluster, CurrentPosition++});
111+
FI->second.emplace_back(
112+
BBClusterInfo{((unsigned)BBID), CurrentCluster, CurrentPosition++});
113113
}
114114
CurrentCluster++;
115115
} else { // This is a function name specifier.

llvm/lib/CodeGen/MIRParser/MILexer.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,11 +272,13 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) {
272272
.Case("pcsections", MIToken::kw_pcsections)
273273
.Case("cfi-type", MIToken::kw_cfi_type)
274274
.Case("bbsections", MIToken::kw_bbsections)
275+
.Case("bb_id", MIToken::kw_bb_id)
275276
.Case("unknown-size", MIToken::kw_unknown_size)
276277
.Case("unknown-address", MIToken::kw_unknown_address)
277278
.Case("distinct", MIToken::kw_distinct)
278279
.Case("ir-block-address-taken", MIToken::kw_ir_block_address_taken)
279-
.Case("machine-block-address-taken", MIToken::kw_machine_block_address_taken)
280+
.Case("machine-block-address-taken",
281+
MIToken::kw_machine_block_address_taken)
280282
.Default(MIToken::Identifier);
281283
}
282284

llvm/lib/CodeGen/MIRParser/MILexer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ struct MIToken {
128128
kw_pcsections,
129129
kw_cfi_type,
130130
kw_bbsections,
131+
kw_bb_id,
131132
kw_unknown_size,
132133
kw_unknown_address,
133134
kw_ir_block_address_taken,

llvm/lib/CodeGen/MIRParser/MIParser.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,7 @@ class MIParser {
499499
bool parseAlignment(uint64_t &Alignment);
500500
bool parseAddrspace(unsigned &Addrspace);
501501
bool parseSectionID(Optional<MBBSectionID> &SID);
502+
bool parseBBID(Optional<unsigned> &BBID);
502503
bool parseOperandsOffset(MachineOperand &Op);
503504
bool parseIRValue(const Value *&V);
504505
bool parseMemoryOperandFlag(MachineMemOperand::Flags &Flags);
@@ -662,6 +663,18 @@ bool MIParser::parseSectionID(Optional<MBBSectionID> &SID) {
662663
return false;
663664
}
664665

666+
// Parse Machine Basic Block ID.
667+
bool MIParser::parseBBID(Optional<unsigned> &BBID) {
668+
assert(Token.is(MIToken::kw_bb_id));
669+
lex();
670+
unsigned Value = 0;
671+
if (getUnsigned(Value))
672+
return error("Unknown BB ID");
673+
BBID = Value;
674+
lex();
675+
return false;
676+
}
677+
665678
bool MIParser::parseBasicBlockDefinition(
666679
DenseMap<unsigned, MachineBasicBlock *> &MBBSlots) {
667680
assert(Token.is(MIToken::MachineBasicBlockLabel));
@@ -678,6 +691,7 @@ bool MIParser::parseBasicBlockDefinition(
678691
bool IsEHFuncletEntry = false;
679692
Optional<MBBSectionID> SectionID;
680693
uint64_t Alignment = 0;
694+
Optional<unsigned> BBID;
681695
BasicBlock *BB = nullptr;
682696
if (consumeIfPresent(MIToken::lparen)) {
683697
do {
@@ -718,6 +732,10 @@ bool MIParser::parseBasicBlockDefinition(
718732
if (parseSectionID(SectionID))
719733
return true;
720734
break;
735+
case MIToken::kw_bb_id:
736+
if (parseBBID(BBID))
737+
return true;
738+
break;
721739
default:
722740
break;
723741
}
@@ -755,6 +773,13 @@ bool MIParser::parseBasicBlockDefinition(
755773
MBB->setSectionID(SectionID.value());
756774
MF.setBBSectionsType(BasicBlockSection::List);
757775
}
776+
if (BBID.has_value()) {
777+
// BBSectionsType is set to `List` if any basic blocks has `SectionID`.
778+
// Here, we set it to `Labels` if it hasn't been set above.
779+
if (!MF.hasBBSections())
780+
MF.setBBSectionsType(BasicBlockSection::Labels);
781+
MBB->setBBID(BBID.value());
782+
}
758783
return false;
759784
}
760785

0 commit comments

Comments
 (0)