[llvm] r368477 - [MC] Don't recreate a label if it's already used
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 13 05:06:29 PDT 2019
Merged to release_90 in r368676.
On Fri, Aug 9, 2019 at 10:15 PM Bill Wendling via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: void
> Date: Fri Aug 9 13:16:31 2019
> New Revision: 368477
>
> URL: http://llvm.org/viewvc/llvm-project?rev=368477&view=rev
> Log:
> [MC] Don't recreate a label if it's already used
>
> Summary:
> This patch keeps track of MCSymbols created for blocks that were
> referenced in inline asm. It prevents creating a new symbol which
> doesn't refer to the block.
>
> Inline asm may have a reference to a label. The asm parser however
> doesn't recognize it as a label and tries to create a new symbol. The
> result being that instead of the original symbol (e.g. ".Ltmp0") the
> parser replaces it in the inline asm with the new one (e.g. ".Ltmp00")
> without updating it in the symbol table. So the machine basic block
> retains the "old" symbol (".Ltmp0"), but the inline asm uses the new one
> (".Ltmp00").
>
> Reviewers: nickdesaulniers, craig.topper
>
> Subscribers: nathanchance, javed.absar, llvm-commits
>
> Tags: #llvm
>
> Differential Revision: https://reviews.llvm.org/D65304
>
> Added:
> llvm/trunk/test/CodeGen/AArch64/callbr-asm-label.ll
> llvm/trunk/test/CodeGen/X86/callbr-asm-label-addr.ll
> Modified:
> llvm/trunk/include/llvm/MC/MCContext.h
> llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
> llvm/trunk/lib/MC/MCContext.cpp
> llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> llvm/trunk/test/CodeGen/X86/callbr-asm.ll
>
> Modified: llvm/trunk/include/llvm/MC/MCContext.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCContext.h?rev=368477&r1=368476&r2=368477&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCContext.h (original)
> +++ llvm/trunk/include/llvm/MC/MCContext.h Fri Aug 9 13:16:31 2019
> @@ -113,6 +113,9 @@ namespace llvm {
> /// number of section symbols with the same name).
> StringMap<bool, BumpPtrAllocator &> UsedNames;
>
> + /// Keeps track of labels that are used in inline assembly.
> + SymbolTable InlineAsmUsedLabelNames;
> +
> /// The next ID to dole out to an unnamed assembler temporary symbol with
> /// a given prefix.
> StringMap<unsigned> NextID;
> @@ -382,6 +385,16 @@ namespace llvm {
> /// APIs.
> const SymbolTable &getSymbols() const { return Symbols; }
>
> + /// isInlineAsmLabel - Return true if the name is a label referenced in
> + /// inline assembly.
> + MCSymbol *getInlineAsmLabel(StringRef Name) const {
> + return InlineAsmUsedLabelNames.lookup(Name);
> + }
> +
> + /// registerInlineAsmLabel - Records that the name is a label referenced in
> + /// inline assembly.
> + void registerInlineAsmLabel(MCSymbol *Sym);
> +
> /// @}
>
> /// \name Section Management
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp?rev=368477&r1=368476&r2=368477&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp Fri Aug 9 13:16:31 2019
> @@ -432,6 +432,7 @@ static void EmitGCCInlineAsmStr(const ch
> const BlockAddress *BA = MI->getOperand(OpNo).getBlockAddress();
> MCSymbol *Sym = AP->GetBlockAddressSymbol(BA);
> Sym->print(OS, AP->MAI);
> + MMI->getContext().registerInlineAsmLabel(Sym);
> } else if (MI->getOperand(OpNo).isMBB()) {
> const MCSymbol *Sym = MI->getOperand(OpNo).getMBB()->getSymbol();
> Sym->print(OS, AP->MAI);
>
> Modified: llvm/trunk/lib/MC/MCContext.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCContext.cpp?rev=368477&r1=368476&r2=368477&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCContext.cpp (original)
> +++ llvm/trunk/lib/MC/MCContext.cpp Fri Aug 9 13:16:31 2019
> @@ -61,6 +61,7 @@ MCContext::MCContext(const MCAsmInfo *ma
> MCTargetOptions const *TargetOpts, bool DoAutoReset)
> : SrcMgr(mgr), InlineSrcMgr(nullptr), MAI(mai), MRI(mri), MOFI(mofi),
> Symbols(Allocator), UsedNames(Allocator),
> + InlineAsmUsedLabelNames(Allocator),
> CurrentDwarfLoc(0, 0, 0, DWARF2_FLAG_IS_STMT, 0, 0),
> AutoReset(DoAutoReset), TargetOptions(TargetOpts) {
> SecureLogFile = AsSecureLogFileName;
> @@ -90,6 +91,7 @@ void MCContext::reset() {
> XCOFFAllocator.DestroyAll();
>
> MCSubtargetAllocator.DestroyAll();
> + InlineAsmUsedLabelNames.clear();
> UsedNames.clear();
> Symbols.clear();
> Allocator.Reset();
> @@ -272,6 +274,10 @@ void MCContext::setSymbolValue(MCStreame
> Streamer.EmitAssignment(Symbol, MCConstantExpr::create(Val, *this));
> }
>
> +void MCContext::registerInlineAsmLabel(MCSymbol *Sym) {
> + InlineAsmUsedLabelNames[Sym->getName()] = Sym;
> +}
> +
> //===----------------------------------------------------------------------===//
> // Section Management
> //===----------------------------------------------------------------------===//
>
> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=368477&r1=368476&r2=368477&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Fri Aug 9 13:16:31 2019
> @@ -1158,7 +1158,9 @@ bool AsmParser::parsePrimaryExpr(const M
> }
> }
>
> - MCSymbol *Sym = getContext().getOrCreateSymbol(SymbolName);
> + MCSymbol *Sym = getContext().getInlineAsmLabel(SymbolName);
> + if (!Sym)
> + Sym = getContext().getOrCreateSymbol(SymbolName);
>
> // If this is an absolute variable reference, substitute it now to preserve
> // semantics in the face of reassignment.
>
> Added: llvm/trunk/test/CodeGen/AArch64/callbr-asm-label.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/callbr-asm-label.ll?rev=368477&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/AArch64/callbr-asm-label.ll (added)
> +++ llvm/trunk/test/CodeGen/AArch64/callbr-asm-label.ll Fri Aug 9 13:16:31 2019
> @@ -0,0 +1,63 @@
> +; RUN: llc < %s -mtriple=aarch64-linux-gnu | FileCheck %s
> +
> + at X = common local_unnamed_addr global i32 0, align 4
> +
> +define i32 @test1() {
> +; CHECK-LABEL: test1:
> +; CHECK: .word b
> +; CHECK-NEXT: .word .Ltmp0
> +; CHECK-LABEL: .Ltmp0:
> +; CHECK-LABEL: .LBB0_1: // %l_yes
> +; CHECK-LABEL: .LBB0_2: // %cleanup
> +entry:
> + callbr void asm sideeffect "1:\0A\09.word b, ${0:l}\0A\09", "X"(i8* blockaddress(@test1, %l_yes))
> + to label %cleanup [label %l_yes]
> +
> +l_yes:
> + br label %cleanup
> +
> +cleanup:
> + %retval.0 = phi i32 [ 1, %l_yes ], [ 0, %entry ]
> + ret i32 %retval.0
> +}
> +
> +define void @test2() {
> +; CHECK-LABEL: test2:
> +entry:
> + %0 = load i32, i32* @X, align 4
> + %and = and i32 %0, 1
> + %tobool = icmp eq i32 %and, 0
> + br i1 %tobool, label %if.end10, label %if.then
> +
> +if.then:
> +; CHECK: .word b
> +; CHECK-NEXT: .word .Ltmp2
> +; CHECK-LABEL: .Ltmp2:
> +; CHECK-NEXT: .LBB1_3: // %if.end6
> + callbr void asm sideeffect "1:\0A\09.word b, ${0:l}\0A\09", "X"(i8* blockaddress(@test2, %if.end6))
> + to label %if.then4 [label %if.end6]
> +
> +if.then4:
> + %call5 = tail call i32 bitcast (i32 (...)* @g to i32 ()*)()
> + br label %if.end6
> +
> +if.end6:
> + %.pre = load i32, i32* @X, align 4
> + %.pre13 = and i32 %.pre, 1
> + %phitmp = icmp eq i32 %.pre13, 0
> + br i1 %phitmp, label %if.end10, label %if.then9
> +
> +if.then9:
> +; CHECK-LABEL: .Ltmp4:
> +; CHECK-NEXT: .LBB1_5: // %l_yes
> + callbr void asm sideeffect "", "X"(i8* blockaddress(@test2, %l_yes))
> + to label %if.end10 [label %l_yes]
> +
> +if.end10:
> + br label %l_yes
> +
> +l_yes:
> + ret void
> +}
> +
> +declare i32 @g(...)
>
> Added: llvm/trunk/test/CodeGen/X86/callbr-asm-label-addr.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/callbr-asm-label-addr.ll?rev=368477&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/callbr-asm-label-addr.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/callbr-asm-label-addr.ll Fri Aug 9 13:16:31 2019
> @@ -0,0 +1,30 @@
> +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
> +
> +define i32 @test1(i32 %x) {
> +; CHECK-LABEL: test1:
> +; CHECK: .quad .Ltmp0
> +; CHECK-NEXT: .quad .Ltmp1
> +; CHECK-LABEL: .Ltmp1:
> +; CHECK-LABEL: .LBB0_1: # %bar
> +; CHECK-NEXT: callq foo
> +; CHECK-LABEL: .Ltmp0:
> +; CHECK-NEXT: # %bb.2: # %baz
> +entry:
> + callbr void asm sideeffect ".quad ${0:l}\0A\09.quad ${1:l}", "i,X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@test1, %baz), i8* blockaddress(@test1, %bar))
> + to label %asm.fallthrough [label %bar]
> +
> +asm.fallthrough:
> + br label %bar
> +
> +bar:
> + %call = tail call i32 @foo(i32 %x)
> + br label %baz
> +
> +baz:
> + %call1 = tail call i32 @mux(i32 %call)
> + ret i32 %call1
> +}
> +
> +declare i32 @foo(i32)
> +
> +declare i32 @mux(i32)
>
> Modified: llvm/trunk/test/CodeGen/X86/callbr-asm.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/callbr-asm.ll?rev=368477&r1=368476&r2=368477&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/callbr-asm.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/callbr-asm.ll Fri Aug 9 13:16:31 2019
> @@ -12,7 +12,7 @@ define i32 @test1(i32 %a) {
> ; CHECK-NEXT: addl $4, %eax
> ; CHECK-NEXT: #APP
> ; CHECK-NEXT: xorl %eax, %eax
> -; CHECK-NEXT: jmp .Ltmp00
> +; CHECK-NEXT: jmp .Ltmp0
> ; CHECK-NEXT: #NO_APP
> ; CHECK-NEXT: .LBB0_1: # %normal
> ; CHECK-NEXT: xorl %eax, %eax
> @@ -87,17 +87,17 @@ define dso_local i32 @test3(i32 %a) {
> ; CHECK-NEXT: # Parent Loop BB2_3 Depth=3
> ; CHECK-NEXT: # => This Inner Loop Header: Depth=4
> ; CHECK-NEXT: #APP
> -; CHECK-NEXT: jmp .Ltmp10
> -; CHECK-NEXT: jmp .Ltmp20
> -; CHECK-NEXT: jmp .Ltmp30
> +; CHECK-NEXT: jmp .Ltmp1
> +; CHECK-NEXT: jmp .Ltmp2
> +; CHECK-NEXT: jmp .Ltmp3
> ; CHECK-NEXT: #NO_APP
> ; CHECK-NEXT: .LBB2_5: # %normal0
> ; CHECK-NEXT: # in Loop: Header=BB2_4 Depth=4
> ; CHECK-NEXT: #APP
> -; CHECK-NEXT: jmp .Ltmp10
> -; CHECK-NEXT: jmp .Ltmp20
> -; CHECK-NEXT: jmp .Ltmp30
> -; CHECK-NEXT: jmp .Ltmp40
> +; CHECK-NEXT: jmp .Ltmp1
> +; CHECK-NEXT: jmp .Ltmp2
> +; CHECK-NEXT: jmp .Ltmp3
> +; CHECK-NEXT: jmp .Ltmp4
> ; CHECK-NEXT: #NO_APP
> ; CHECK-NEXT: .LBB2_6: # %normal1
> ; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list