| ; 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} |
| ;. |