[llvm-branch-commits] [llvm] a4b77f5 - [codeview] Workaround for PR43479, don't re-emit instr labels

Reid Kleckner via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Oct 28 16:25:53 PDT 2019


Author: Reid Kleckner
Date: 2019-10-28T16:22:29-07:00
New Revision: a4b77f5ffb167fb2d41ec5c14f8ace6d4f5832bf

URL: https://github.com/llvm/llvm-project/commit/a4b77f5ffb167fb2d41ec5c14f8ace6d4f5832bf
DIFF: https://github.com/llvm/llvm-project/commit/a4b77f5ffb167fb2d41ec5c14f8ace6d4f5832bf.diff

LOG: [codeview] Workaround for PR43479, don't re-emit instr labels

Summary:
In the long run we should come up with another mechanism for marking
call instructions as heap allocation sites, and remove this workaround.
For now, we've had two bug reports about this, so let's apply this
workaround. SLH (the other client of instruction labels) probably has
the same bug, but the solution there is more likely to be to mark the
call instruction as not duplicatable, which doesn't work for debug info.

Reviewers: akhuang

Subscribers: aprantl, hiraditya, aganea, chandlerc, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D69068

llvm-svn: 375137
(cherry picked from commit fc69ad09882ccfbedc2d06afc971d59eb6a24ee0)

Added: 
    llvm/test/CodeGen/X86/taildup-heapallocsite.ll

Modified: 
    llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 54f6cc2d5571..21b1fb8f8675 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -1052,9 +1052,13 @@ void AsmPrinter::EmitFunctionBody() {
         ++NumInstsInFunction;
       }
 
-      // If there is a pre-instruction symbol, emit a label for it here.
+      // If there is a pre-instruction symbol, emit a label for it here. If the
+      // instruction was duplicated and the label has already been emitted,
+      // don't re-emit the same label.
+      // FIXME: Consider strengthening that to an assertion.
       if (MCSymbol *S = MI.getPreInstrSymbol())
-        OutStreamer->EmitLabel(S);
+        if (S->isUndefined())
+          OutStreamer->EmitLabel(S);
 
       if (ShouldPrintDebugScopes) {
         for (const HandlerInfo &HI : Handlers) {
@@ -1107,9 +1111,13 @@ void AsmPrinter::EmitFunctionBody() {
         break;
       }
 
-      // If there is a post-instruction symbol, emit a label for it here.
+      // If there is a post-instruction symbol, emit a label for it here.  If
+      // the instruction was duplicated and the label has already been emitted,
+      // don't re-emit the same label.
+      // FIXME: Consider strengthening that to an assertion.
       if (MCSymbol *S = MI.getPostInstrSymbol())
-        OutStreamer->EmitLabel(S);
+        if (S->isUndefined())
+          OutStreamer->EmitLabel(S);
 
       if (ShouldPrintDebugScopes) {
         for (const HandlerInfo &HI : Handlers) {

diff  --git a/llvm/test/CodeGen/X86/taildup-heapallocsite.ll b/llvm/test/CodeGen/X86/taildup-heapallocsite.ll
new file mode 100644
index 000000000000..378efe2deec2
--- /dev/null
+++ b/llvm/test/CodeGen/X86/taildup-heapallocsite.ll
@@ -0,0 +1,81 @@
+; RUN: llc < %s -tail-dup-placement-threshold=4 | FileCheck %s
+
+; Based on test case from PR43695:
+; __declspec(allocator) void *alloc(unsigned int size);
+; void f2();
+; void f1(unsigned int *size_ptr) {
+;     void *hg = alloc(size_ptr ? *size_ptr : 1UL);
+;     f2();
+; }
+
+; In this case, block placement duplicates the heap allocation site. For now,
+; LLVM drops the labels from one call site. Eventually, we should track both.
+
+; ModuleID = 't.cpp'
+source_filename = "t.cpp"
+target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-windows-msvc19.22.27905"
+
+define dso_local void @taildupit(i32* readonly %size_ptr) !dbg !8 {
+entry:
+  call void @llvm.dbg.value(metadata i32* %size_ptr, metadata !14, metadata !DIExpression()), !dbg !17
+  %tobool = icmp eq i32* %size_ptr, null, !dbg !18
+  br i1 %tobool, label %cond.end, label %cond.true, !dbg !18
+
+cond.true:                                        ; preds = %entry
+  %0 = load i32, i32* %size_ptr, align 4, !dbg !18, !tbaa !19
+  br label %cond.end, !dbg !18
+
+cond.end:                                         ; preds = %entry, %cond.true
+  %cond = phi i32 [ %0, %cond.true ], [ 1, %entry ], !dbg !18
+  %call = tail call i8* @alloc(i32 %cond), !dbg !18, !heapallocsite !2
+  call void @llvm.dbg.value(metadata i8* %call, metadata !15, metadata !DIExpression()), !dbg !17
+  tail call void @f2(), !dbg !23
+  ret void, !dbg !24
+}
+
+; CHECK-LABEL: taildupit: # @taildupit
+; CHECK: testq
+; CHECK: je
+; CHECK: .Lheapallocsite0:
+; CHECK: callq alloc
+; CHECK: .Lheapallocsite1:
+; CHECK: jmp f2 # TAILCALL
+; CHECK-NOT: Lheapallocsite
+; CHECK: callq alloc
+; CHECK-NOT: Lheapallocsite
+; CHECK: jmp f2 # TAILCALL
+
+declare dso_local i8* @alloc(i32)
+
+declare dso_local void @f2()
+
+declare void @llvm.dbg.value(metadata, metadata, metadata)
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4, !5, !6}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 10.0.0 (git at github.com:llvm/llvm-project.git 0650355c09ab8e6605ae37b818270a7a7c8ce2c7)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None)
+!1 = !DIFile(filename: "t.cpp", directory: "C:\\src\\llvm-project\\build", checksumkind: CSK_MD5, checksum: "b227901e92d848fa564190b0762d757c")
+!2 = !{}
+!3 = !{i32 2, !"CodeView", i32 1}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = !{i32 1, !"wchar_size", i32 2}
+!6 = !{i32 7, !"PIC Level", i32 2}
+!8 = distinct !DISubprogram(name: "f1", linkageName: "?f1@@YAXPEAI at Z", scope: !1, file: !1, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !13)
+!9 = !DISubroutineType(types: !10)
+!10 = !{null, !11}
+!11 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !12, size: 64)
+!12 = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)
+!13 = !{!14, !15}
+!14 = !DILocalVariable(name: "size_ptr", arg: 1, scope: !8, file: !1, line: 5, type: !11)
+!15 = !DILocalVariable(name: "hg", scope: !8, file: !1, line: 6, type: !16)
+!16 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
+!17 = !DILocation(line: 0, scope: !8)
+!18 = !DILocation(line: 6, scope: !8)
+!19 = !{!20, !20, i64 0}
+!20 = !{!"int", !21, i64 0}
+!21 = !{!"omnipotent char", !22, i64 0}
+!22 = !{!"Simple C++ TBAA"}
+!23 = !DILocation(line: 7, scope: !8)
+!24 = !DILocation(line: 8, scope: !8)


        


More information about the llvm-branch-commits mailing list