Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[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 fc69ad0)
- Loading branch information
Showing
2 changed files
with
93 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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@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@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) |