Skip to content

Commit

Permalink
[CodeGen] Use temp symbol for MBBs (#95031)
Browse files Browse the repository at this point in the history
Internal label names never occur in the symbol table, so when using an
object streamer, there's no point in constructing these names and then
adding them to hash tables -- they are never visible in the output.

It's not possible to reuse createTempSymbol, because on BPF has a
different prefix for globals and basic blocks right now.
  • Loading branch information
aengelke authored Jun 20, 2024
1 parent b18bf8f commit 6859685
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 20 deletions.
6 changes: 6 additions & 0 deletions llvm/include/llvm/MC/MCContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,12 @@ class MCContext {
MCSymbol *createNamedTempSymbol();
MCSymbol *createNamedTempSymbol(const Twine &Name);

/// Get or create a symbol for a basic block. For non-always-emit symbols,
/// this behaves like createTempSymbol, except that it uses the
/// PrivateLabelPrefix instead of the PrivateGlobalPrefix. When AlwaysEmit is
/// true, behaves like getOrCreateSymbol, prefixed with PrivateLabelPrefix.
MCSymbol *createBlockSymbol(const Twine &Name, bool AlwaysEmit = false);

/// Create the definition of a directional local symbol for numbered label
/// (used for "1:" definitions).
MCSymbol *createDirectionalLocalSymbol(unsigned LocalLabelVal);
Expand Down
16 changes: 8 additions & 8 deletions llvm/lib/CodeGen/MachineBasicBlock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,11 @@ MCSymbol *MachineBasicBlock::getSymbol() const {
}
CachedMCSymbol = Ctx.getOrCreateSymbol(MF->getName() + Suffix);
} else {
const StringRef Prefix = Ctx.getAsmInfo()->getPrivateLabelPrefix();
CachedMCSymbol = Ctx.getOrCreateSymbol(Twine(Prefix) + "BB" +
Twine(MF->getFunctionNumber()) +
"_" + Twine(getNumber()));
// If the block occurs as label in inline assembly, parsing the assembly
// needs an actual label name => set AlwaysEmit in these cases.
CachedMCSymbol = Ctx.createBlockSymbol(
"BB" + Twine(MF->getFunctionNumber()) + "_" + Twine(getNumber()),
/*AlwaysEmit=*/hasLabelMustBeEmitted());
}
}
return CachedMCSymbol;
Expand All @@ -104,10 +105,9 @@ MCSymbol *MachineBasicBlock::getEndSymbol() const {
if (!CachedEndMCSymbol) {
const MachineFunction *MF = getParent();
MCContext &Ctx = MF->getContext();
auto Prefix = Ctx.getAsmInfo()->getPrivateLabelPrefix();
CachedEndMCSymbol = Ctx.getOrCreateSymbol(Twine(Prefix) + "BB_END" +
Twine(MF->getFunctionNumber()) +
"_" + Twine(getNumber()));
CachedEndMCSymbol = Ctx.createBlockSymbol(
"BB_END" + Twine(MF->getFunctionNumber()) + "_" + Twine(getNumber()),
/*AlwaysEmit=*/false);
}
return CachedEndMCSymbol;
}
Expand Down
11 changes: 11 additions & 0 deletions llvm/lib/MC/MCContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,17 @@ MCSymbol *MCContext::createNamedTempSymbol(const Twine &Name) {
/*IsTemporary=*/!SaveTempLabels);
}

MCSymbol *MCContext::createBlockSymbol(const Twine &Name, bool AlwaysEmit) {
if (AlwaysEmit)
return getOrCreateSymbol(MAI->getPrivateLabelPrefix() + Name);

bool IsTemporary = !SaveTempLabels;
if (IsTemporary && !UseNamesOnTempLabels)
return createSymbolImpl(nullptr, IsTemporary);
return createRenamableSymbol(MAI->getPrivateLabelPrefix() << Name,
/*AlwaysAddSuffix=*/false, IsTemporary);
}

MCSymbol *MCContext::createLinkerPrivateTempSymbol() {
return createLinkerPrivateSymbol("tmp");
}
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/CodeGen/AArch64/branch-relax-cross-section.mir
Original file line number Diff line number Diff line change
Expand Up @@ -473,8 +473,8 @@ body: |
; INDIRECT-NEXT: successors: %bb.1
; INDIRECT-NEXT: liveins: $x16
; INDIRECT-NEXT: {{ $}}
; INDIRECT-NEXT: $[[SCAVENGED_REGISTER:x[0-9]+]] = ADRP target-flags(aarch64-page) <mcsymbol .LBB5_1>
; INDIRECT-NEXT: $[[SCAVENGED_REGISTER]] = ADDXri $[[SCAVENGED_REGISTER]], target-flags(aarch64-pageoff, aarch64-nc) <mcsymbol .LBB5_1>, 0
; INDIRECT-NEXT: $[[SCAVENGED_REGISTER:x[0-9]+]] = ADRP target-flags(aarch64-page) <mcsymbol >
; INDIRECT-NEXT: $[[SCAVENGED_REGISTER]] = ADDXri $[[SCAVENGED_REGISTER]], target-flags(aarch64-pageoff, aarch64-nc) <mcsymbol >, 0
; INDIRECT-NEXT: BR $[[SCAVENGED_REGISTER]]
bb.0.entry:
Expand Down
9 changes: 3 additions & 6 deletions llvm/test/CodeGen/BPF/objdump_cond_op.ll
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ define i32 @test(i32, i32) local_unnamed_addr #0 {
br label %13
; CHECK: r1 <<= 32
; CHECK: r1 >>= 32
; CHECK: if r1 != 2 goto +6 <LBB0_2>
; CHECK: if r1 != 2 goto +6 <test+0x48>

; <label>:8: ; preds = %2
%9 = icmp eq i32 %0, %1
Expand All @@ -38,32 +38,29 @@ define i32 @test(i32, i32) local_unnamed_addr #0 {
; CHECK: r0 = *(u32 *)(r1 + 0)
; CHECK: r0 *= r0
; CHECK: r0 <<= 1
; CHECK: goto +7 <LBB0_4>
; CHECK: goto +7 <test+0x80>

; <label>:11: ; preds = %8
%12 = shl nsw i32 %10, 2
br label %13

; CHECK-LABEL: <LBB0_2>:
; CHECK: r3 = 0 ll
; CHECK: r0 = *(u32 *)(r3 + 0)
; CHECK: r2 <<= 32
; CHECK: r2 >>= 32
; CHECK: if r1 == r2 goto +4 <LBB0_5>
; CHECK: if r1 == r2 goto +4 <test+0x98>
; CHECK: r0 <<= 2

; <label>:13: ; preds = %4, %11
%14 = phi i32 [ %12, %11 ], [ %7, %4 ]
store i32 %14, ptr @gbl, align 4
br label %15
; CHECK-LABEL: <LBB0_4>:
; CHECK: r1 = 0 ll
; CHECK: *(u32 *)(r1 + 0) = r0

; <label>:15: ; preds = %8, %13
%16 = phi i32 [ %14, %13 ], [ %10, %8 ]
ret i32 %16
; CHECK-LABEL: <LBB0_5>:
; CHECK: exit
}
attributes #0 = { norecurse nounwind }
6 changes: 2 additions & 4 deletions llvm/test/CodeGen/BPF/objdump_cond_op_2.ll
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ define i32 @test(i32, i32) local_unnamed_addr #0 {

; <label>:4: ; preds = %2
br label %5
; CHECK: if r4 s>= r3 goto +10 <LBB0_2>
; CHECK-LABEL: <LBB0_1>:
; CHECK: if r4 s>= r3 goto +10 <test+0x90>

; <label>:5: ; preds = %4, %5
%6 = phi i32 [ %9, %5 ], [ 0, %4 ]
Expand All @@ -27,12 +26,11 @@ define i32 @test(i32, i32) local_unnamed_addr #0 {
%12 = icmp slt i32 %10, %11
br i1 %12, label %5, label %13
; CHECK: r1 = r3
; CHECK: if r2 s> r3 goto -10 <LBB0_1>
; CHECK: if r2 s> r3 goto -10 <test+0x40>

; <label>:13: ; preds = %5, %2
%14 = phi i32 [ 0, %2 ], [ %9, %5 ]
ret i32 %14
; CHECK-LABEL: <LBB0_2>:
; CHECK: exit
}
attributes #0 = { norecurse nounwind readnone }

0 comments on commit 6859685

Please sign in to comment.