Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / ThinLTO / X86 / memprof_direct_recursion.ll
blob102ee64d4638d8657bf8e1cd1813c6e42ca14214
1 ;; Test to make sure that memprof works and do cloning right when exists direct recursion.
2 ;; Original code looks like:
3 ;; After modify alloc type, there are two direct recursion with hot and cold alloc type.
4 ;; a.cpp
5 ;; extern void foo(int);
6 ;; int b = 10;
7 ;; int* a;
8 ;; int main(){
9 ;;     foo(1);
10 ;;     b = 10;
11 ;;     foo(2);
12 ;;     return 0;
13 ;; }
14 ;; b.cpp
15 ;; extern int b;
16 ;; extern int *a;
17 ;; void foo(int c){
18 ;;     a = new int[1];
19 ;;     if (c&1) {
20 ;;         for (int i = 0; i < 100; ++i)
21 ;;             a[0] = 1;
22 ;;     }
23 ;;     --b;
24 ;;     if (b) {
25 ;;         foo(c);
26 ;;     }
27 ;; }
29 ; RUN: split-file %s %t
30 ; RUN: opt -thinlto-bc %t/b.ll >%t/b.o
31 ; RUN: opt -thinlto-bc %t/a.ll >%t/a.o
33 ; RUN: llvm-lto2 run %t/b.o %t/a.o -enable-memprof-context-disambiguation \
34 ; RUN:  -supports-hot-cold-new \
35 ; RUN:  -thinlto-distributed-indexes \
36 ; RUN:  -r=%t/b.o,_Z3fooi,plx \
37 ; RUN:  -r=%t/b.o,a \
38 ; RUN:  -r=%t/b.o,b \
39 ; RUN:  -r=%t/b.o,_Znam \
40 ; RUN:  -r=%t/a.o,main,plx \
41 ; RUN:  -r=%t/a.o,_Z3fooi \
42 ; RUN:  -r=%t/a.o,a,plx \
43 ; RUN:  -r=%t/a.o,b,plx \
44 ; RUN:  -memprof-dump-ccg \
45 ; RUN:  -o %t2.out 2>&1
47 ; RUN: llvm-dis %t/b.o.thinlto.bc -o - | FileCheck %s --check-prefix=SUMMARY
49 ;; Test direct recursion don't cause assert failed and do cloning right.
50 ; RUN: opt -passes=memprof-context-disambiguation \
51 ; RUN:  -memprof-import-summary=%t/b.o.thinlto.bc \
52 ; RUN:  %t/b.o -S | FileCheck %s --check-prefix=IR
54 ; SUMMARY: stackIds: (1985258834072910425, 2841526434899864997)
55 ; SUMMARY-NOT: stackIds: (1985258834072910425, 1985258834072910425, 2841526434899864997)
57 ; IR: _Z3fooi
58 ; IR: _Z3fooi.memprof.1
59 ; IR: "memprof"="notcold" 
60 ; IR: "memprof"="cold" 
62 ;--- b.ll
63 ; ModuleID = 'b.cpp'
64 source_filename = "b.cpp"
65 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
66 target triple = "x86_64-unknown-linux-gnu"
68 @a = external local_unnamed_addr global ptr, align 8
69 @b = external local_unnamed_addr global i32, align 4
71 ; Function Attrs: mustprogress uwtable
72 define dso_local void @_Z3fooi(i32 noundef %0) local_unnamed_addr #0 !dbg !9 {
73   br label %2, !dbg !12
75 2:                                                ; preds = %7, %1
76   %3 = tail call noalias noundef nonnull dereferenceable(4) ptr @_Znam(i64 noundef 4) #2, !dbg !13, !memprof !14, !callsite !55
77   store ptr %3, ptr @a, align 8, !dbg !56, !tbaa !57
78   %4 = and i32 %0, 1, !dbg !61
79   %5 = icmp eq i32 %4, 0, !dbg !62
80   br i1 %5, label %7, label %6, !dbg !62
82 6:                                                ; preds = %2
83   store i32 1, ptr %3, align 4, !tbaa !63
84   br label %7, !dbg !65
86 7:                                                ; preds = %6, %2
87   %8 = load i32, ptr @b, align 4, !dbg !65, !tbaa !63
88   %9 = add nsw i32 %8, -1, !dbg !65
89   store i32 %9, ptr @b, align 4, !dbg !65, !tbaa !63
90   %10 = icmp eq i32 %9, 0, !dbg !66
91   br i1 %10, label %11, label %2, !dbg !66
93 11:                                               ; preds = %7
94   ret void, !dbg !67
97 ; Function Attrs: nobuiltin allocsize(0)
98 declare noundef nonnull ptr @_Znam(i64 noundef) local_unnamed_addr #1
100 attributes #0 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
101 attributes #1 = { nobuiltin allocsize(0) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
102 attributes #2 = { builtin allocsize(0) }
104 !llvm.dbg.cu = !{!0}
105 !llvm.module.flags = !{!2, !3, !4, !5, !6, !7}
106 !llvm.ident = !{!8}
108 !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 18.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, splitDebugInlining: false, debugInfoForProfiling: true, nameTableKind: None)
109 !1 = !DIFile(filename: "b.cpp", directory: "/", checksumkind: CSK_MD5, checksum: "8fa6c585f9d2c35f1a82b920e64bbda2")
110 !2 = !{i32 7, !"Dwarf Version", i32 5}
111 !3 = !{i32 2, !"Debug Info Version", i32 3}
112 !4 = !{i32 1, !"wchar_size", i32 4}
113 !5 = !{i32 8, !"PIC Level", i32 2}
114 !6 = !{i32 7, !"PIE Level", i32 2}
115 !7 = !{i32 7, !"uwtable", i32 2}
116 !8 = !{!"clang version 18.0.0"}
117 !9 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !1, file: !1, line: 4, type: !10, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
118 !10 = !DISubroutineType(types: !11)
119 !11 = !{}
120 !12 = !DILocation(line: 12, column: 9, scope: !9)
121 !13 = !DILocation(line: 5, column: 9, scope: !9)
122 !14 = !{!15, !17, !19, !21, !23, !25, !27, !29, !31, !33, !35, !37, !39, !41, !43, !45, !47, !49, !51, !53}
123 !15 = !{!16, !"hot"}
124 !16 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 2841526434899864997}
125 !17 = !{!18, !"cold"}
126 !18 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 8256520048276991898}
127 !19 = !{!20, !"hot"}
128 !20 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 2841526434899864997}
129 !21 = !{!22, !"cold"}
130 !22 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 8256520048276991898}
131 !23 = !{!24, !"hot"}
132 !24 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 2841526434899864997}
133 !25 = !{!26, !"cold"}
134 !26 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 8256520048276991898}
135 !27 = !{!28, !"hot"}
136 !28 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 2841526434899864997}
137 !29 = !{!30, !"cold"}
138 !30 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 8256520048276991898}
139 !31 = !{!32, !"hot"}
140 !32 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 2841526434899864997}
141 !33 = !{!34, !"cold"}
142 !34 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 8256520048276991898}
143 !35 = !{!36, !"hot"}
144 !36 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 2841526434899864997}
145 !37 = !{!38, !"cold"}
146 !38 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 8256520048276991898}
147 !39 = !{!40, !"hot"}
148 !40 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 2841526434899864997}
149 !41 = !{!42, !"cold"}
150 !42 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 1985258834072910425, i64 8256520048276991898}
151 !43 = !{!44, !"hot"}
152 !44 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 2841526434899864997}
153 !45 = !{!46, !"cold"}
154 !46 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 1985258834072910425, i64 8256520048276991898}
155 !47 = !{!48, !"hot"}
156 !48 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 2841526434899864997}
157 !49 = !{!50, !"cold"}
158 !50 = !{i64 -1057479539165743997, i64 1985258834072910425, i64 8256520048276991898}
159 !51 = !{!52, !"hot"}
160 !52 = !{i64 -1057479539165743997, i64 2841526434899864997}
161 !53 = !{!54, !"cold"}
162 !54 = !{i64 -1057479539165743997, i64 8256520048276991898}
163 !55 = !{i64 -1057479539165743997}
164 !56 = !DILocation(line: 5, column: 7, scope: !9)
165 !57 = !{!58, !58, i64 0}
166 !58 = !{!"any pointer", !59, i64 0}
167 !59 = !{!"omnipotent char", !60, i64 0}
168 !60 = !{!"Simple C++ TBAA"}
169 !61 = !DILocation(line: 6, column: 10, scope: !9)
170 !62 = !DILocation(line: 6, column: 9, scope: !9)
171 !63 = !{!64, !64, i64 0}
172 !64 = !{!"int", !59, i64 0}
173 !65 = !DILocation(line: 10, column: 5, scope: !9)
174 !66 = !DILocation(line: 11, column: 9, scope: !9)
175 !67 = !DILocation(line: 14, column: 1, scope: !9)
177 ;--- a.ll
178 ; ModuleID = 'a.cpp'
179 source_filename = "a.cpp"
180 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
181 target triple = "x86_64-unknown-linux-gnu"
183 @b = dso_local local_unnamed_addr global i32 10, align 4
184 @a = dso_local local_unnamed_addr global ptr null, align 8
186 ; Function Attrs: mustprogress norecurse uwtable
187 define dso_local noundef i32 @main() local_unnamed_addr #0 !dbg !9 {
188   tail call void @_Z3fooi(i32 noundef 1), !dbg !12, !callsite !13
189   store i32 10, ptr @b, align 4, !dbg !14, !tbaa !15
190   tail call void @_Z3fooi(i32 noundef 2), !dbg !19, !callsite !20
191   ret i32 0, !dbg !21
194 declare !dbg !22 void @_Z3fooi(i32 noundef) local_unnamed_addr #1
196 attributes #0 = { mustprogress norecurse uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
197 attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
199 !llvm.dbg.cu = !{!0}
200 !llvm.module.flags = !{!2, !3, !4, !5, !6, !7}
201 !llvm.ident = !{!8}
203 !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 18.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, splitDebugInlining: false, debugInfoForProfiling: true, nameTableKind: None)
204 !1 = !DIFile(filename: "a.cpp", directory: "/", checksumkind: CSK_MD5, checksum: "16ecbfa723a07d69c0374cfc704a7c44")
205 !2 = !{i32 7, !"Dwarf Version", i32 5}
206 !3 = !{i32 2, !"Debug Info Version", i32 3}
207 !4 = !{i32 1, !"wchar_size", i32 4}
208 !5 = !{i32 8, !"PIC Level", i32 2}
209 !6 = !{i32 7, !"PIE Level", i32 2}
210 !7 = !{i32 7, !"uwtable", i32 2}
211 !8 = !{!"clang version 18.0.0"}
212 !9 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 4, type: !10, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
213 !10 = !DISubroutineType(types: !11)
214 !11 = !{}
215 !12 = !DILocation(line: 5, column: 5, scope: !9)
216 !13 = !{i64 2841526434899864997}
217 !14 = !DILocation(line: 6, column: 7, scope: !9)
218 !15 = !{!16, !16, i64 0}
219 !16 = !{!"int", !17, i64 0}
220 !17 = !{!"omnipotent char", !18, i64 0}
221 !18 = !{!"Simple C++ TBAA"}
222 !19 = !DILocation(line: 7, column: 5, scope: !9)
223 !20 = !{i64 8256520048276991898}
224 !21 = !DILocation(line: 8, column: 5, scope: !9)
225 !22 = !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !1, file: !1, line: 1, type: !10, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized)