| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt -S -passes=hotcoldsplit < %s | FileCheck %s | |
| ; Reproducer for https://github.com/llvm/llvm-project/issues/197982 | |
| @g = external global ptr | |
| declare void @ext() | |
| define void @ctor(ptr %this) cold !prof !14 { | |
| ; CHECK-LABEL: define void @ctor( | |
| ; CHECK-SAME: ptr [[THIS:%.*]]) #[[ATTR0:[0-9]+]] !prof [[PROF14:![0-9]+]] { | |
| ; CHECK-NEXT: tail call void @ext() | |
| ; CHECK-NEXT: store ptr null, ptr [[THIS]], align 16 | |
| ; CHECK-NEXT: [[P:%.*]] = getelementptr i8, ptr [[THIS]], i64 16 | |
| ; CHECK-NEXT: store ptr null, ptr [[P]], align 16 | |
| ; CHECK-NEXT: store i8 0, ptr [[THIS]], align 16 | |
| ; CHECK-NEXT: tail call void @ext() | |
| ; CHECK-NEXT: store i32 0, ptr [[THIS]], align 16 | |
| ; CHECK-NEXT: ret void | |
| ; | |
| tail call void @ext() | |
| store ptr null, ptr %this, align 16 | |
| %p = getelementptr i8, ptr %this, i64 16 | |
| store ptr null, ptr %p, align 16 | |
| store i8 0, ptr %this, align 16 | |
| tail call void @ext() | |
| store i32 0, ptr %this, align 16 | |
| ret void | |
| } | |
| define void @writeAsOperandInternal(ptr %WriterCtx, i1 %cond) { | |
| ; CHECK-LABEL: define void @writeAsOperandInternal( | |
| ; CHECK-SAME: ptr [[WRITERCTX:%.*]], i1 [[COND:%.*]]) { | |
| ; CHECK-NEXT: [[ENTRY:.*]]: | |
| ; CHECK-NEXT: br i1 [[COND]], label %[[CODEREPL:.*]], label %[[IF_END:.*]] | |
| ; CHECK: [[CODEREPL]]: | |
| ; CHECK-NEXT: [[TMP0:%.*]] = call ptr @writeAsOperandInternal.cold.1() #[[ATTR2:[0-9]+]] | |
| ; CHECK-NEXT: br label %[[IF_END]] | |
| ; CHECK: [[IF_END]]: | |
| ; CHECK-NEXT: [[S_SROA_0_0:%.*]] = phi ptr [ [[TMP0]], %[[CODEREPL]] ], [ @g, %[[ENTRY]] ] | |
| ; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[TMP0]], %[[CODEREPL]] ], [ @g, %[[ENTRY]] ] | |
| ; CHECK-NEXT: [[FP:%.*]] = load ptr, ptr [[WRITERCTX]], align 8 | |
| ; CHECK-NEXT: [[R:%.*]] = tail call i32 [[FP]](ptr [[P]], ptr @g) | |
| ; CHECK-NEXT: store volatile i32 0, ptr [[S_SROA_0_0]], align 4 | |
| ; CHECK-NEXT: ret void | |
| ; | |
| entry: | |
| br i1 %cond, label %if.then, label %if.end | |
| if.then: | |
| tail call void @ctor(ptr @g) | |
| %call.i = load volatile ptr, ptr @g, align 8 | |
| store volatile i32 0, ptr @g, align 4 | |
| br label %if.end | |
| if.end: | |
| %s.sroa.0.0 = phi ptr [ %call.i, %if.then ], [ @g, %entry ] | |
| %p = phi ptr [ %call.i, %if.then ], [ @g, %entry ] | |
| %fp = load ptr, ptr %WriterCtx, align 8 | |
| %r = tail call i32 %fp(ptr %p, ptr @g) | |
| store volatile i32 0, ptr %s.sroa.0.0, align 4 | |
| ret void | |
| } | |
| !llvm.module.flags = !{!0} | |
| !0 = !{i32 1, !"ProfileSummary", !1} | |
| !1 = !{!2, !3, !4, !5, !6, !7, !8, !9, !10, !11} | |
| !2 = !{!"ProfileFormat", !"InstrProf"} | |
| !3 = !{!"TotalCount", i64 436329363820} | |
| !4 = !{!"MaxCount", i64 7373450795} | |
| !5 = !{!"MaxInternalCount", i64 502022957} | |
| !6 = !{!"MaxFunctionCount", i64 7373450795} | |
| !7 = !{!"NumCounts", i64 3070596} | |
| !8 = !{!"NumFunctions", i64 874091} | |
| !9 = !{!"IsPartialProfile", i64 0} | |
| !10 = !{!"PartialProfileRatio", double 0.000000e+00} | |
| !11 = !{!"DetailedSummary", !12} | |
| !12 = !{!13} | |
| !13 = !{i32 999999, i64 24, i32 423785} | |
| !14 = !{!"function_entry_count", i64 0} | |
| ;. | |
| ; CHECK: [[PROF14]] = !{!"function_entry_count", i64 0} | |
| ;. |