1eeac4321SJonas Hahnfeld; REQUIRES: aarch64-registered-target 22c43d591SDaniel Hoekwater; REQUIRES: x86-registered-target 32c43d591SDaniel Hoekwater 42c43d591SDaniel Hoekwater; COM: Machine function splitting with FDO profiles 5*68f7b075SRahman Lavaee; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions | FileCheck %s -check-prefixes=MFS-DEFAULTS,MFS-DEFAULTS-X86,MFS-NOBBSECTIONS 62c43d591SDaniel Hoekwater; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions -mfs-psi-cutoff=0 -mfs-count-threshold=2000 | FileCheck %s --dump-input=always -check-prefixes=MFS-OPTS1,MFS-OPTS1-X86 72c43d591SDaniel Hoekwater; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions -mfs-psi-cutoff=950000 | FileCheck %s -check-prefixes=MFS-OPTS2,MFS-OPTS2-X86 82c43d591SDaniel Hoekwater; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions -mfs-split-ehcode | FileCheck %s -check-prefixes=MFS-EH-SPLIT,MFS-EH-SPLIT-X86 9c9f32884SDaniel Hoekwater; RUN: llc < %s -mtriple=x86_64 -split-machine-functions -O0 -mfs-psi-cutoff=0 -mfs-count-threshold=10000 | FileCheck %s -check-prefixes=MFS-O0,MFS-O0-X86 102c43d591SDaniel Hoekwater 11*68f7b075SRahman Lavaee; COM: Machine function splitting along with -basic-block-sections profile 12*68f7b075SRahman Lavaee; RUN: echo 'v1' > %t 13*68f7b075SRahman Lavaee; RUN: echo 'ffoo21' >> %t 14*68f7b075SRahman Lavaee; RUN: echo 'c0' >> %t 15*68f7b075SRahman Lavaee; RUN: echo 'ffoo22' >> %t 16*68f7b075SRahman Lavaee; RUN: echo 'c0 1' >> %t 17*68f7b075SRahman Lavaee; RUN: echo 'c2' >> %t 18*68f7b075SRahman Lavaee; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -basic-block-sections=%t -split-machine-functions | FileCheck %s --check-prefixes=MFS-BBSECTIONS 19*68f7b075SRahman Lavaee 20bdc0afc8SDavid Sherwood; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -aarch64-min-jump-table-entries=4 -enable-split-machine-functions | FileCheck %s -check-prefixes=MFS-DEFAULTS,MFS-DEFAULTS-AARCH64 21bdc0afc8SDavid Sherwood; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -aarch64-min-jump-table-entries=4 -enable-split-machine-functions -mfs-psi-cutoff=0 -mfs-count-threshold=2000 | FileCheck %s --dump-input=always -check-prefixes=MFS-OPTS1,MFS-OPTS1-AARCH64 22bdc0afc8SDavid Sherwood; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -aarch64-min-jump-table-entries=4 -enable-split-machine-functions -mfs-psi-cutoff=950000 | FileCheck %s -check-prefixes=MFS-OPTS2,MFS-OPTS2-AARCH64 23bdc0afc8SDavid Sherwood; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -aarch64-min-jump-table-entries=4 -enable-split-machine-functions -mfs-split-ehcode | FileCheck %s -check-prefixes=MFS-EH-SPLIT,MFS-EH-SPLIT-AARCH64 24def42537SDaniel Hoekwater; RUN: llc < %s -mtriple=aarch64 -split-machine-functions -O0 -mfs-psi-cutoff=0 -mfs-count-threshold=10000 | FileCheck %s -check-prefixes=MFS-O0,MFS-O0-AARCH64 253dbabeadSSnehasish Kumar; RUN: llc < %s -mtriple=aarch64 -enable-split-machine-functions -aarch64-redzone | FileCheck %s -check-prefixes=MFS-REDZONE-AARCH64 2690ab85a1SDaniel Hoekwater 272c43d591SDaniel Hoekwater; COM: Machine function splitting with AFDO profiles 282c43d591SDaniel Hoekwater; RUN: sed 's/InstrProf/SampleProfile/g' %s > %t.ll 292c43d591SDaniel Hoekwater; RUN: llc < %t.ll -mtriple=x86_64-unknown-linux-gnu -split-machine-functions | FileCheck %s --check-prefix=FSAFDO-MFS 302c43d591SDaniel Hoekwater; RUN: llc < %t.ll -mtriple=x86_64-unknown-linux-gnu -split-machine-functions | FileCheck %s --check-prefix=FSAFDO-MFS2 312c43d591SDaniel Hoekwater 322c43d591SDaniel Hoekwaterdefine void @foo1(i1 zeroext %0) nounwind !prof !14 !section_prefix !15 { 332c43d591SDaniel Hoekwater;; Check that cold block is moved to .text.split. 342c43d591SDaniel Hoekwater; MFS-DEFAULTS-LABEL: foo1 352c43d591SDaniel Hoekwater; MFS-DEFAULTS: .section .text.split.foo1 362c43d591SDaniel Hoekwater; MFS-DEFAULTS-NEXT: foo1.cold: 372c43d591SDaniel Hoekwater; MFS-DEFAULTS-X86-NOT: callq bar 382c43d591SDaniel Hoekwater; MFS-DEFAULTS-X86-NEXT: callq baz 3990ab85a1SDaniel Hoekwater; MFS-DEFAULTS-AARCH64-NOT: bl bar 4090ab85a1SDaniel Hoekwater; MFS-DEFAULTS-AARCH64-NEXT: bl baz 412c43d591SDaniel Hoekwater br i1 %0, label %2, label %4, !prof !17 422c43d591SDaniel Hoekwater 432c43d591SDaniel Hoekwater2: ; preds = %1 442c43d591SDaniel Hoekwater %3 = call i32 @bar() 452c43d591SDaniel Hoekwater br label %6 462c43d591SDaniel Hoekwater 472c43d591SDaniel Hoekwater4: ; preds = %1 482c43d591SDaniel Hoekwater %5 = call i32 @baz() 492c43d591SDaniel Hoekwater br label %6 502c43d591SDaniel Hoekwater 512c43d591SDaniel Hoekwater6: ; preds = %4, %2 522c43d591SDaniel Hoekwater %7 = tail call i32 @qux() 532c43d591SDaniel Hoekwater ret void 542c43d591SDaniel Hoekwater} 552c43d591SDaniel Hoekwater 562c43d591SDaniel Hoekwaterdefine void @foo2(i1 zeroext %0) nounwind !prof !23 !section_prefix !16 { 572c43d591SDaniel Hoekwater;; Check that function marked unlikely is not split. 582c43d591SDaniel Hoekwater; MFS-DEFAULTS-LABEL: foo2 592c43d591SDaniel Hoekwater; MFS-DEFAULTS-NOT: foo2.cold: 602c43d591SDaniel Hoekwater br i1 %0, label %2, label %4, !prof !17 612c43d591SDaniel Hoekwater 622c43d591SDaniel Hoekwater2: ; preds = %1 632c43d591SDaniel Hoekwater %3 = call i32 @bar() 642c43d591SDaniel Hoekwater br label %6 652c43d591SDaniel Hoekwater 662c43d591SDaniel Hoekwater4: ; preds = %1 672c43d591SDaniel Hoekwater %5 = call i32 @baz() 682c43d591SDaniel Hoekwater br label %6 692c43d591SDaniel Hoekwater 702c43d591SDaniel Hoekwater6: ; preds = %4, %2 712c43d591SDaniel Hoekwater %7 = tail call i32 @qux() 722c43d591SDaniel Hoekwater ret void 732c43d591SDaniel Hoekwater} 742c43d591SDaniel Hoekwater 752c43d591SDaniel Hoekwaterdefine void @foo3(i1 zeroext %0) nounwind !section_prefix !15 { 762c43d591SDaniel Hoekwater;; Check that function without profile data is not split. 772c43d591SDaniel Hoekwater; MFS-DEFAULTS-LABEL: foo3 782c43d591SDaniel Hoekwater; MFS-DEFAULTS-NOT: foo3.cold: 792c43d591SDaniel Hoekwater br i1 %0, label %2, label %4 802c43d591SDaniel Hoekwater 812c43d591SDaniel Hoekwater2: ; preds = %1 822c43d591SDaniel Hoekwater %3 = call i32 @bar() 832c43d591SDaniel Hoekwater br label %6 842c43d591SDaniel Hoekwater 852c43d591SDaniel Hoekwater4: ; preds = %1 862c43d591SDaniel Hoekwater %5 = call i32 @baz() 872c43d591SDaniel Hoekwater br label %6 882c43d591SDaniel Hoekwater 892c43d591SDaniel Hoekwater6: ; preds = %4, %2 902c43d591SDaniel Hoekwater %7 = tail call i32 @qux() 912c43d591SDaniel Hoekwater ret void 922c43d591SDaniel Hoekwater} 932c43d591SDaniel Hoekwater 942c43d591SDaniel Hoekwaterdefine void @foo4(i1 zeroext %0, i1 zeroext %1) nounwind !prof !20 { 952c43d591SDaniel Hoekwater;; Check that count threshold works. 962c43d591SDaniel Hoekwater; MFS-OPTS1-LABEL: foo4 972c43d591SDaniel Hoekwater; MFS-OPTS1: .section .text.split.foo4 982c43d591SDaniel Hoekwater; MFS-OPTS1-NEXT: foo4.cold: 992c43d591SDaniel Hoekwater; MFS-OPTS1-X86-NOT: callq bar 1002c43d591SDaniel Hoekwater; MFS-OPTS1-X86-NOT: callq baz 1012c43d591SDaniel Hoekwater; MFS-OPTS1-X86-NEXT: callq bam 10290ab85a1SDaniel Hoekwater; MFS-OPTS1-AARCH64-NOT: bl bar 10390ab85a1SDaniel Hoekwater; MFS-OPTS1-AARCH64-NOT: bl baz 10490ab85a1SDaniel Hoekwater; MFS-OPTS1-AARCH64-NEXT: bl bam 1052c43d591SDaniel Hoekwater br i1 %0, label %3, label %7, !prof !18 1062c43d591SDaniel Hoekwater 1072c43d591SDaniel Hoekwater3: 1082c43d591SDaniel Hoekwater %4 = call i32 @bar() 1092c43d591SDaniel Hoekwater br label %7 1102c43d591SDaniel Hoekwater 1112c43d591SDaniel Hoekwater5: 1122c43d591SDaniel Hoekwater %6 = call i32 @baz() 1132c43d591SDaniel Hoekwater br label %7 1142c43d591SDaniel Hoekwater 1152c43d591SDaniel Hoekwater7: 1162c43d591SDaniel Hoekwater br i1 %1, label %8, label %10, !prof !19 1172c43d591SDaniel Hoekwater 1182c43d591SDaniel Hoekwater8: 1192c43d591SDaniel Hoekwater %9 = call i32 @bam() 1202c43d591SDaniel Hoekwater br label %12 1212c43d591SDaniel Hoekwater 1222c43d591SDaniel Hoekwater10: 1232c43d591SDaniel Hoekwater %11 = call i32 @baz() 1242c43d591SDaniel Hoekwater br label %12 1252c43d591SDaniel Hoekwater 1262c43d591SDaniel Hoekwater12: 1272c43d591SDaniel Hoekwater %13 = tail call i32 @qux() 1282c43d591SDaniel Hoekwater ret void 1292c43d591SDaniel Hoekwater} 1302c43d591SDaniel Hoekwater 1312c43d591SDaniel Hoekwaterdefine void @foo5(i1 zeroext %0, i1 zeroext %1) nounwind !prof !20 { 1322c43d591SDaniel Hoekwater;; Check that profile summary info cutoff works. 1332c43d591SDaniel Hoekwater; MFS-OPTS2-LABEL: foo5 1342c43d591SDaniel Hoekwater; MFS-OPTS2: .section .text.split.foo5 1352c43d591SDaniel Hoekwater; MFS-OPTS2-NEXT: foo5.cold: 1362c43d591SDaniel Hoekwater; MFS-OPTS2-X86-NOT: callq bar 1372c43d591SDaniel Hoekwater; MFS-OPTS2-X86-NOT: callq baz 1382c43d591SDaniel Hoekwater; MFS-OPTS2-X86-NEXT: callq bam 13990ab85a1SDaniel Hoekwater; MFS-OPTS2-AARCH64-NOT: bl bar 14090ab85a1SDaniel Hoekwater; MFS-OPTS2-AARCH64-NOT: bl baz 14190ab85a1SDaniel Hoekwater; MFS-OPTS2-AARCH64-NEXT: bl bam 1422c43d591SDaniel Hoekwater br i1 %0, label %3, label %7, !prof !21 1432c43d591SDaniel Hoekwater 1442c43d591SDaniel Hoekwater3: 1452c43d591SDaniel Hoekwater %4 = call i32 @bar() 1462c43d591SDaniel Hoekwater br label %7 1472c43d591SDaniel Hoekwater 1482c43d591SDaniel Hoekwater5: 1492c43d591SDaniel Hoekwater %6 = call i32 @baz() 1502c43d591SDaniel Hoekwater br label %7 1512c43d591SDaniel Hoekwater 1522c43d591SDaniel Hoekwater7: 1532c43d591SDaniel Hoekwater br i1 %1, label %8, label %10, !prof !22 1542c43d591SDaniel Hoekwater 1552c43d591SDaniel Hoekwater8: 1562c43d591SDaniel Hoekwater %9 = call i32 @bam() 1572c43d591SDaniel Hoekwater br label %12 1582c43d591SDaniel Hoekwater 1592c43d591SDaniel Hoekwater10: 1602c43d591SDaniel Hoekwater %11 = call i32 @baz() 1612c43d591SDaniel Hoekwater br label %12 1622c43d591SDaniel Hoekwater 1632c43d591SDaniel Hoekwater12: 1642c43d591SDaniel Hoekwater %13 = call i32 @qux() 1652c43d591SDaniel Hoekwater ret void 1662c43d591SDaniel Hoekwater} 1672c43d591SDaniel Hoekwater 1682c43d591SDaniel Hoekwaterdefine void @foo6(i1 zeroext %0) nounwind section "nosplit" !prof !14 { 1692c43d591SDaniel Hoekwater;; Check that function with section attribute is not split. 1702c43d591SDaniel Hoekwater; MFS-DEFAULTS-LABEL: foo6 1712c43d591SDaniel Hoekwater; MFS-DEFAULTS-NOT: foo6.cold: 1722c43d591SDaniel Hoekwater br i1 %0, label %2, label %4, !prof !17 1732c43d591SDaniel Hoekwater 1742c43d591SDaniel Hoekwater2: ; preds = %1 1752c43d591SDaniel Hoekwater %3 = call i32 @bar() 1762c43d591SDaniel Hoekwater br label %6 1772c43d591SDaniel Hoekwater 1782c43d591SDaniel Hoekwater4: ; preds = %1 1792c43d591SDaniel Hoekwater %5 = call i32 @baz() 1802c43d591SDaniel Hoekwater br label %6 1812c43d591SDaniel Hoekwater 1822c43d591SDaniel Hoekwater6: ; preds = %4, %2 1832c43d591SDaniel Hoekwater %7 = tail call i32 @qux() 1842c43d591SDaniel Hoekwater ret void 1852c43d591SDaniel Hoekwater} 1862c43d591SDaniel Hoekwater 1872c43d591SDaniel Hoekwaterdefine i32 @foo7(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 { 1882c43d591SDaniel Hoekwater;; Check that a single cold ehpad is split out. 1892c43d591SDaniel Hoekwater; MFS-DEFAULTS-LABEL: foo7 1902c43d591SDaniel Hoekwater; MFS-DEFAULTS: .section .text.split.foo7,"ax",@progbits 1912c43d591SDaniel Hoekwater; MFS-DEFAULTS-NEXT: foo7.cold: 1922c43d591SDaniel Hoekwater; MFS-DEFAULTS-X86: callq baz 1932c43d591SDaniel Hoekwater; MFS-DEFAULTS-X86: callq _Unwind_Resume@PLT 19490ab85a1SDaniel Hoekwater; MFS-DEFAULTS-AARCH64: bl baz 1952c43d591SDaniel Hoekwaterentry: 1962c43d591SDaniel Hoekwater invoke void @_Z1fv() 1972c43d591SDaniel Hoekwater to label %try.cont unwind label %lpad 1982c43d591SDaniel Hoekwater 1992c43d591SDaniel Hoekwaterlpad: 2002c43d591SDaniel Hoekwater %1 = landingpad { ptr, i32 } 2012c43d591SDaniel Hoekwater cleanup 2022c43d591SDaniel Hoekwater catch ptr @_ZTIi 2032c43d591SDaniel Hoekwater resume { ptr, i32 } %1 2042c43d591SDaniel Hoekwater 2052c43d591SDaniel Hoekwatertry.cont: 2062c43d591SDaniel Hoekwater br i1 %0, label %2, label %4, !prof !17 2072c43d591SDaniel Hoekwater 2082c43d591SDaniel Hoekwater2: ; preds = try.cont 2092c43d591SDaniel Hoekwater %3 = call i32 @bar() 2102c43d591SDaniel Hoekwater br label %6 2112c43d591SDaniel Hoekwater 2122c43d591SDaniel Hoekwater4: ; preds = %1 2132c43d591SDaniel Hoekwater %5 = call i32 @baz() 2142c43d591SDaniel Hoekwater br label %6 2152c43d591SDaniel Hoekwater 2162c43d591SDaniel Hoekwater6: ; preds = %4, %2 2172c43d591SDaniel Hoekwater %7 = tail call i32 @qux() 2182c43d591SDaniel Hoekwater ret i32 %7 2192c43d591SDaniel Hoekwater} 2202c43d591SDaniel Hoekwater 2212c43d591SDaniel Hoekwaterdefine i32 @foo8(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 { 2222c43d591SDaniel Hoekwater;; Check that all ehpads are treated as hot if one of them is hot. 2232c43d591SDaniel Hoekwater; MFS-DEFAULTS-LABEL: foo8 2242c43d591SDaniel Hoekwater; MFS-DEFAULTS-X86: callq _Unwind_Resume@PLT 2252c43d591SDaniel Hoekwater; MFS-DEFAULTS-X86: callq _Unwind_Resume@PLT 2262c43d591SDaniel Hoekwater; MFS-DEFAULTS: .section .text.split.foo8,"ax",@progbits 2272c43d591SDaniel Hoekwater; MFS-DEFAULTS-NEXT: foo8.cold: 2282c43d591SDaniel Hoekwater; MFS-DEFAULTS-X86: callq baz 22990ab85a1SDaniel Hoekwater; MFS-DEFAULTS-AARCH64: bl baz 2302c43d591SDaniel Hoekwater 2312c43d591SDaniel Hoekwater;; Check that all ehpads are by default treated as cold with -mfs-split-ehcode. 2322c43d591SDaniel Hoekwater; MFS-EH-SPLIT-LABEL: foo8 2332c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: callq baz 23490ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-AARCH64: bl baz 23590ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-X86: .section .text.split.foo8,"ax",@progbits 23690ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-X86-NEXT: foo8.cold: 2372c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: callq _Unwind_Resume@PLT 2382c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: callq _Unwind_Resume@PLT 2392c43d591SDaniel Hoekwaterentry: 2402c43d591SDaniel Hoekwater invoke void @_Z1fv() 2412c43d591SDaniel Hoekwater to label %try.cont unwind label %lpad1 2422c43d591SDaniel Hoekwater 2432c43d591SDaniel Hoekwaterlpad1: 2442c43d591SDaniel Hoekwater %1 = landingpad { ptr, i32 } 2452c43d591SDaniel Hoekwater cleanup 2462c43d591SDaniel Hoekwater catch ptr @_ZTIi 2472c43d591SDaniel Hoekwater resume { ptr, i32 } %1 2482c43d591SDaniel Hoekwater 2492c43d591SDaniel Hoekwatertry.cont: 2502c43d591SDaniel Hoekwater br i1 %0, label %hot, label %cold, !prof !17 2512c43d591SDaniel Hoekwater 2522c43d591SDaniel Hoekwaterhot: 2532c43d591SDaniel Hoekwater %2 = call i32 @bar() 2542c43d591SDaniel Hoekwater invoke void @_Z1fv() 2552c43d591SDaniel Hoekwater to label %exit unwind label %lpad2, !prof !21 2562c43d591SDaniel Hoekwater 2572c43d591SDaniel Hoekwaterlpad2: 2582c43d591SDaniel Hoekwater %3 = landingpad { ptr, i32 } 2592c43d591SDaniel Hoekwater cleanup 2602c43d591SDaniel Hoekwater catch ptr @_ZTIi 2612c43d591SDaniel Hoekwater resume { ptr, i32 } %3 2622c43d591SDaniel Hoekwater 2632c43d591SDaniel Hoekwatercold: 2642c43d591SDaniel Hoekwater %4 = call i32 @baz() 2652c43d591SDaniel Hoekwater br label %exit 2662c43d591SDaniel Hoekwater 2672c43d591SDaniel Hoekwaterexit: 2682c43d591SDaniel Hoekwater %5 = tail call i32 @qux() 2692c43d591SDaniel Hoekwater ret i32 %5 2702c43d591SDaniel Hoekwater} 2712c43d591SDaniel Hoekwater 2722c43d591SDaniel Hoekwaterdefine i32 @foo10(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 { 2732c43d591SDaniel Hoekwater;; Check that nop is inserted just before the EH pad if it's beginning a section. 2742c43d591SDaniel Hoekwater; MFS-DEFAULTS-LABEL: foo10 2752c43d591SDaniel Hoekwater; MFS-DEFAULTS-X86-LABEL: callq baz 27690ab85a1SDaniel Hoekwater; MFS-DEFAULTS-AARCH64: bl baz 27790ab85a1SDaniel Hoekwater; MFS-DEFAULTS-X86: .section .text.split.foo10,"ax",@progbits 27890ab85a1SDaniel Hoekwater; MFS-DEFAULTS-X86-NEXT: foo10.cold: 2792c43d591SDaniel Hoekwater; MFS-DEFAULTS-X86: nop 2802c43d591SDaniel Hoekwater; MFS-DEFAULTS-X86: callq _Unwind_Resume@PLT 2812c43d591SDaniel Hoekwaterentry: 2822c43d591SDaniel Hoekwater invoke void @_Z1fv() 2832c43d591SDaniel Hoekwater to label %try.cont unwind label %lpad, !prof !17 2842c43d591SDaniel Hoekwater 2852c43d591SDaniel Hoekwaterlpad: 2862c43d591SDaniel Hoekwater %1 = landingpad { ptr, i32 } 2872c43d591SDaniel Hoekwater cleanup 2882c43d591SDaniel Hoekwater catch ptr @_ZTIi 2892c43d591SDaniel Hoekwater resume { ptr, i32 } %1 2902c43d591SDaniel Hoekwater 2912c43d591SDaniel Hoekwatertry.cont: 2922c43d591SDaniel Hoekwater %2 = call i32 @baz() 2932c43d591SDaniel Hoekwater ret i32 %2 2942c43d591SDaniel Hoekwater} 2952c43d591SDaniel Hoekwater 2962c43d591SDaniel Hoekwaterdefine void @foo11(i1 zeroext %0) personality ptr @__gxx_personality_v0 { 2972c43d591SDaniel Hoekwater;; Check that function having landing pads are split with mfs-split-ehcode 2982c43d591SDaniel Hoekwater;; even in the absence of profile data 2992c43d591SDaniel Hoekwater; MFS-EH-SPLIT-LABEL: foo11 30090ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-X86: .section .text.split.foo11,"ax",@progbits 30190ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-X86-NEXT: foo11.cold: 3022c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: nop 3032c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: callq _Unwind_Resume@PLT 3042c43d591SDaniel Hoekwaterentry: 3052c43d591SDaniel Hoekwater invoke void @_Z1fv() 3062c43d591SDaniel Hoekwater to label %2 unwind label %lpad 3072c43d591SDaniel Hoekwater 3082c43d591SDaniel Hoekwaterlpad: 3092c43d591SDaniel Hoekwater %1 = landingpad { ptr, i32 } 3102c43d591SDaniel Hoekwater cleanup 3112c43d591SDaniel Hoekwater catch ptr @_ZTIi 3122c43d591SDaniel Hoekwater resume { ptr, i32 } %1 3132c43d591SDaniel Hoekwater 3142c43d591SDaniel Hoekwater2: ; preds = entry 3152c43d591SDaniel Hoekwater %3 = tail call i32 @qux() 3162c43d591SDaniel Hoekwater ret void 3172c43d591SDaniel Hoekwater} 3182c43d591SDaniel Hoekwater 3192c43d591SDaniel Hoekwaterdefine i32 @foo12(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 { 3202c43d591SDaniel Hoekwater;; Check that all code reachable from ehpad is split out with cycles. 3212c43d591SDaniel Hoekwater; MFS-EH-SPLIT-LABEL: foo12 3222c43d591SDaniel Hoekwater; MFS-EH-SPLIT: .section .text.split.foo12,"ax",@progbits 3232c43d591SDaniel Hoekwater; MFS-EH-SPLIT-NEXT: foo12.cold: 3242c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: callq bar 3252c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: callq baz 3262c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: callq qux 32790ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-AARCH64: bl bar 32890ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-AARCH64: bl baz 32990ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-AARCH64: bl qux 3302c43d591SDaniel Hoekwaterentry: 3312c43d591SDaniel Hoekwater invoke void @_Z1fv() 3322c43d591SDaniel Hoekwater to label %8 unwind label %lpad 3332c43d591SDaniel Hoekwater 3342c43d591SDaniel Hoekwaterlpad: 3352c43d591SDaniel Hoekwater %1 = landingpad { ptr, i32 } 3362c43d591SDaniel Hoekwater cleanup 3372c43d591SDaniel Hoekwater catch ptr @_ZTIi 3382c43d591SDaniel Hoekwater br label %2 3392c43d591SDaniel Hoekwater 3402c43d591SDaniel Hoekwater2: ; preds = lpad 3412c43d591SDaniel Hoekwater %3 = call i32 @bar() 3422c43d591SDaniel Hoekwater br i1 %0, label %4, label %6 3432c43d591SDaniel Hoekwater 3442c43d591SDaniel Hoekwater4: ; preds = lpad 3452c43d591SDaniel Hoekwater %5 = call i32 @baz() 3462c43d591SDaniel Hoekwater br label %6 3472c43d591SDaniel Hoekwater 3482c43d591SDaniel Hoekwater6: ; preds = %4, %2 3492c43d591SDaniel Hoekwater %7 = tail call i32 @qux() 3502c43d591SDaniel Hoekwater br i1 %0, label %2, label %8 3512c43d591SDaniel Hoekwater 3522c43d591SDaniel Hoekwater8: ; preds = %6 3532c43d591SDaniel Hoekwater ret i32 0 3542c43d591SDaniel Hoekwater} 3552c43d591SDaniel Hoekwater 3562c43d591SDaniel Hoekwaterdefine i32 @foo13(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14{ 3572c43d591SDaniel Hoekwater;; Check that all code reachable from EH 3582c43d591SDaniel Hoekwater;; that is also reachable from outside EH pad 3592c43d591SDaniel Hoekwater;; is not touched. 3602c43d591SDaniel Hoekwater; MFS-EH-SPLIT-LABEL: foo13 3612c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: callq bam 36290ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-AARCH64: bl bam 3632c43d591SDaniel Hoekwater; MFS-EH-SPLIT: .section .text.split.foo13,"ax",@progbits 3642c43d591SDaniel Hoekwater; MFS-EH-SPLIT-NEXT: foo13.cold: 3652c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: callq baz 3662c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: callq bar 3672c43d591SDaniel Hoekwater; MFS-EH-SPLIT-X86: callq qux 36890ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-AARCH64: bl baz 36990ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-AARCH64: bl bar 37090ab85a1SDaniel Hoekwater; MFS-EH-SPLIT-AARCH64: bl qux 3712c43d591SDaniel Hoekwaterentry: 3722c43d591SDaniel Hoekwater invoke void @_Z1fv() 3732c43d591SDaniel Hoekwater to label %try.cont unwind label %lpad, !prof !17 3742c43d591SDaniel Hoekwater 3752c43d591SDaniel Hoekwaterlpad: 3762c43d591SDaniel Hoekwater %1 = landingpad { ptr, i32 } 3772c43d591SDaniel Hoekwater cleanup 3782c43d591SDaniel Hoekwater catch ptr @_ZTIi 3792c43d591SDaniel Hoekwater br i1 %0, label %2, label %4, !prof !17 3802c43d591SDaniel Hoekwater 3812c43d591SDaniel Hoekwater2: ; preds = lpad 3822c43d591SDaniel Hoekwater %3 = call i32 @bar() 3832c43d591SDaniel Hoekwater br label %6 3842c43d591SDaniel Hoekwater 3852c43d591SDaniel Hoekwater4: ; preds = lpad 3862c43d591SDaniel Hoekwater %5 = call i32 @baz() 3872c43d591SDaniel Hoekwater br label %6 3882c43d591SDaniel Hoekwater 3892c43d591SDaniel Hoekwater6: ; preds = %4, %2 3902c43d591SDaniel Hoekwater %7 = tail call i32 @qux() 3912c43d591SDaniel Hoekwater br i1 %0, label %2, label %try.cont, !prof !17 3922c43d591SDaniel Hoekwater 3932c43d591SDaniel Hoekwatertry.cont: ; preds = %entry 3942c43d591SDaniel Hoekwater %8 = call i32 @bam() 3952c43d591SDaniel Hoekwater ret i32 %8 3962c43d591SDaniel Hoekwater} 3972c43d591SDaniel Hoekwater 3982c43d591SDaniel Hoekwaterdefine void @foo14(i1 zeroext %0, i1 zeroext %1) nounwind !prof !24 { 3992c43d591SDaniel Hoekwater; FSAFDO-MFS: .section .text.split.foo14,"ax" 4002c43d591SDaniel Hoekwater; FSAFDO-MFS: foo14.cold: 4012c43d591SDaniel Hoekwater br i1 %0, label %3, label %7, !prof !25 4022c43d591SDaniel Hoekwater 4032c43d591SDaniel Hoekwater3: 4042c43d591SDaniel Hoekwater %4 = call i32 @bar() 4052c43d591SDaniel Hoekwater br label %7 4062c43d591SDaniel Hoekwater 4072c43d591SDaniel Hoekwater5: 4082c43d591SDaniel Hoekwater %6 = call i32 @baz() 4092c43d591SDaniel Hoekwater br label %7 4102c43d591SDaniel Hoekwater 4112c43d591SDaniel Hoekwater7: 4122c43d591SDaniel Hoekwater br i1 %1, label %8, label %10, !prof !26 4132c43d591SDaniel Hoekwater 4142c43d591SDaniel Hoekwater8: 4152c43d591SDaniel Hoekwater %9 = call i32 @bam() 4162c43d591SDaniel Hoekwater br label %12 4172c43d591SDaniel Hoekwater 4182c43d591SDaniel Hoekwater10: 4192c43d591SDaniel Hoekwater %11 = call i32 @baz() 4202c43d591SDaniel Hoekwater br label %12 4212c43d591SDaniel Hoekwater 4222c43d591SDaniel Hoekwater12: 4232c43d591SDaniel Hoekwater %13 = tail call i32 @qux() 4242c43d591SDaniel Hoekwater ret void 4252c43d591SDaniel Hoekwater} 4262c43d591SDaniel Hoekwater 4272c43d591SDaniel Hoekwaterdefine void @foo15(i1 zeroext %0, i1 zeroext %1) nounwind !prof !27 { 4282c43d591SDaniel Hoekwater;; HasAccurateProfile is false, foo15 is hot, but no profile data for 4292c43d591SDaniel Hoekwater;; blocks, no split should happen. 4302c43d591SDaniel Hoekwater; FSAFDO-MFS2-NOT: .section .text.split.foo15,"ax" 4312c43d591SDaniel Hoekwater; FSAFDO-MFS2-NOT: foo15.cold: 4322c43d591SDaniel Hoekwater br i1 %0, label %3, label %7 4332c43d591SDaniel Hoekwater 4342c43d591SDaniel Hoekwater3: 4352c43d591SDaniel Hoekwater %4 = call i32 @bar() 4362c43d591SDaniel Hoekwater br label %7 4372c43d591SDaniel Hoekwater 4382c43d591SDaniel Hoekwater5: 4392c43d591SDaniel Hoekwater %6 = call i32 @baz() 4402c43d591SDaniel Hoekwater br label %7 4412c43d591SDaniel Hoekwater 4422c43d591SDaniel Hoekwater7: 4432c43d591SDaniel Hoekwater br i1 %1, label %8, label %10 4442c43d591SDaniel Hoekwater 4452c43d591SDaniel Hoekwater8: 4462c43d591SDaniel Hoekwater %9 = call i32 @bam() 4472c43d591SDaniel Hoekwater br label %12 4482c43d591SDaniel Hoekwater 4492c43d591SDaniel Hoekwater10: 4502c43d591SDaniel Hoekwater %11 = call i32 @baz() 4512c43d591SDaniel Hoekwater br label %12 4522c43d591SDaniel Hoekwater 4532c43d591SDaniel Hoekwater12: 4542c43d591SDaniel Hoekwater %13 = tail call i32 @qux() 4552c43d591SDaniel Hoekwater ret void 4562c43d591SDaniel Hoekwater} 4572c43d591SDaniel Hoekwater 458c9f32884SDaniel Hoekwaterdefine void @foo16(i1 zeroext %0) nounwind !prof !14 !section_prefix !15 { 459c9f32884SDaniel Hoekwater;; Check that an unconditional branch is only appended to a block 460c9f32884SDaniel Hoekwater;; if it would fall through to the wrong block otherwise. 461c9f32884SDaniel Hoekwater; MFS-O0-LABEL: foo16 462c9f32884SDaniel Hoekwater; MFS-O0-X86: jmp 463c9f32884SDaniel Hoekwater; MFS-O0-X86-NOT: jmp 464def42537SDaniel Hoekwater; MFS-O0-AARCH64: b foo16.cold 465def42537SDaniel Hoekwater; MFS-O0-AARCH64-NOT: b foo16.cold 466c9f32884SDaniel Hoekwater; MFS-O0: .section .text.split.foo16 467c9f32884SDaniel Hoekwater; MFS-O0-NEXT: foo16.cold 468c9f32884SDaniel Hoekwater %2 = call i32 @baz() 469c9f32884SDaniel Hoekwater br i1 false, label %3, label %5, !prof !25 470c9f32884SDaniel Hoekwater 471c9f32884SDaniel Hoekwater3: ; preds = %1 472c9f32884SDaniel Hoekwater %4 = call i32 @bar() 473c9f32884SDaniel Hoekwater unreachable 474c9f32884SDaniel Hoekwater 475c9f32884SDaniel Hoekwater5: ; preds = %1 476c9f32884SDaniel Hoekwater %6 = tail call i32 @qux() 477c9f32884SDaniel Hoekwater ret void 478c9f32884SDaniel Hoekwater} 479c9f32884SDaniel Hoekwater 4808c249c44SDaniel Hoekwaterdefine i32 @foo17(i1 zeroext %0, i32 %a, i32 %b) nounwind !prof !14 !section_prefix !15 { 4818c249c44SDaniel Hoekwater;; Check that cold blocks in functions with red zones aren't split. 4828c249c44SDaniel Hoekwater; MFS-DEFAULTS-LABEL: foo17 4838c249c44SDaniel Hoekwater; MFS-DEFAULTS-X86: foo17.cold: 4848c249c44SDaniel Hoekwater; MFS-REDZONE-AARCH64-NOT: foo17.cold: 4858c249c44SDaniel Hoekwater %a.addr = alloca i32, align 4 4868c249c44SDaniel Hoekwater %b.addr = alloca i32, align 4 4878c249c44SDaniel Hoekwater %x = alloca i32, align 4 4888c249c44SDaniel Hoekwater 4898c249c44SDaniel Hoekwater br i1 %0, label %2, label %3, !prof !17 4908c249c44SDaniel Hoekwater 4918c249c44SDaniel Hoekwater2: ; preds = %1 4928c249c44SDaniel Hoekwater store i32 %a, ptr %a.addr, align 4 4938c249c44SDaniel Hoekwater store i32 %b, ptr %b.addr, align 4 4948c249c44SDaniel Hoekwater br label %4 4958c249c44SDaniel Hoekwater 4968c249c44SDaniel Hoekwater3: ; preds = %1 4978c249c44SDaniel Hoekwater store i32 %a, ptr %b.addr, align 4 4988c249c44SDaniel Hoekwater store i32 %b, ptr %a.addr, align 4 4998c249c44SDaniel Hoekwater br label %4 5008c249c44SDaniel Hoekwater 5018c249c44SDaniel Hoekwater4: ; preds = %3, %2 5028c249c44SDaniel Hoekwater %tmp = load i32, ptr %a.addr, align 4 5038c249c44SDaniel Hoekwater %tmp1 = load i32, ptr %b.addr, align 4 5048c249c44SDaniel Hoekwater %add = add nsw i32 %tmp, %tmp1 5058c249c44SDaniel Hoekwater store i32 %add, ptr %x, align 4 5068c249c44SDaniel Hoekwater %tmp2 = load i32, ptr %x, align 4 5078c249c44SDaniel Hoekwater ret i32 %tmp2 5088c249c44SDaniel Hoekwater} 5098c249c44SDaniel Hoekwater 510ef1c25ebSDaniel Hoekwaterdefine i32 @foo18(i32 %in) !prof !14 !section_prefix !15 { 511ef1c25ebSDaniel Hoekwater;; Check that a cold block targeted by a jump table is not split 512ef1c25ebSDaniel Hoekwater;; on AArch64. 513ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS-LABEL: foo18 514ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS: .section .text.split.foo18 515ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS-NEXT: foo18.cold: 516ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS-SAME: %common.ret 517ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS-X86-DAG: jmp qux 518ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS-X86-DAG: jmp bam 519ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS-AARCH64-NOT: b bar 520ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS-AARCH64-NOT: b baz 521ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS-AARCH64-NOT: b qux 522ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS-AARCH64-NOT: b bam 523ef1c25ebSDaniel Hoekwater 524ef1c25ebSDaniel Hoekwater switch i32 %in, label %common.ret [ 525ef1c25ebSDaniel Hoekwater i32 0, label %hot1 526ef1c25ebSDaniel Hoekwater i32 1, label %hot2 527ef1c25ebSDaniel Hoekwater i32 2, label %cold1 528ef1c25ebSDaniel Hoekwater i32 3, label %cold2 529ef1c25ebSDaniel Hoekwater ], !prof !28 530ef1c25ebSDaniel Hoekwater 531ef1c25ebSDaniel Hoekwatercommon.ret: ; preds = %0 532ef1c25ebSDaniel Hoekwater ret i32 0 533ef1c25ebSDaniel Hoekwater 534ef1c25ebSDaniel Hoekwaterhot1: ; preds = %0 535ef1c25ebSDaniel Hoekwater %1 = tail call i32 @bar() 536ef1c25ebSDaniel Hoekwater ret i32 %1 537ef1c25ebSDaniel Hoekwater 538ef1c25ebSDaniel Hoekwaterhot2: ; preds = %0 539ef1c25ebSDaniel Hoekwater %2 = tail call i32 @baz() 540ef1c25ebSDaniel Hoekwater ret i32 %2 541ef1c25ebSDaniel Hoekwater 542ef1c25ebSDaniel Hoekwatercold1: ; preds = %0 543ef1c25ebSDaniel Hoekwater %3 = tail call i32 @bam() 544ef1c25ebSDaniel Hoekwater ret i32 %3 545ef1c25ebSDaniel Hoekwater 546ef1c25ebSDaniel Hoekwatercold2: ; preds = %0 547ef1c25ebSDaniel Hoekwater %4 = tail call i32 @qux() 548ef1c25ebSDaniel Hoekwater ret i32 %4 549ef1c25ebSDaniel Hoekwater} 550ef1c25ebSDaniel Hoekwater 551ef1c25ebSDaniel Hoekwaterdefine i32 @foo19(i32 %in) !prof !14 !section_prefix !15 { 552ef1c25ebSDaniel Hoekwater;; Check that a cold block that contains a jump table dispatch is 553ef1c25ebSDaniel Hoekwater;; not split on AArch64. 554ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS-LABEL: foo19 555ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS: .section .text.split.foo19 556ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS-NEXT: foo19.cold: 5575d6d8dcdSArthur Eubanks; MFS-DEFAULTS-X86: .LJTI17_0 5585d6d8dcdSArthur Eubanks; MFS-DEFAULTS-AARCH64-NOT: .LJTI17_0 559ef1c25ebSDaniel Hoekwater; MFS-DEFAULTS: .section .rodata 5605d6d8dcdSArthur Eubanks; MFS-DEFAULTS: .LJTI17_0 561ef1c25ebSDaniel Hoekwater %cmp = icmp sgt i32 %in, 3 562ef1c25ebSDaniel Hoekwater br i1 %cmp, label %hot, label %cold_switch, !prof !17 563ef1c25ebSDaniel Hoekwater 564ef1c25ebSDaniel Hoekwaterhot: ; preds = %0 565ef1c25ebSDaniel Hoekwaterret i32 1 566ef1c25ebSDaniel Hoekwater 567ef1c25ebSDaniel Hoekwatercold_switch: ; preds = %0 568ef1c25ebSDaniel Hoekwater switch i32 %in, label %common.ret [ 569ef1c25ebSDaniel Hoekwater i32 0, label %hot1 570ef1c25ebSDaniel Hoekwater i32 1, label %hot2 571ef1c25ebSDaniel Hoekwater i32 2, label %cold1 572ef1c25ebSDaniel Hoekwater i32 3, label %cold2 573ef1c25ebSDaniel Hoekwater ], !prof !28 574ef1c25ebSDaniel Hoekwater 575ef1c25ebSDaniel Hoekwatercommon.ret: ; preds = %0 576ef1c25ebSDaniel Hoekwater ret i32 0 577ef1c25ebSDaniel Hoekwater 578ef1c25ebSDaniel Hoekwaterhot1: ; preds = %0 579ef1c25ebSDaniel Hoekwater %1 = tail call i32 @bar() 580ef1c25ebSDaniel Hoekwater ret i32 %1 581ef1c25ebSDaniel Hoekwater 582ef1c25ebSDaniel Hoekwaterhot2: ; preds = %0 583ef1c25ebSDaniel Hoekwater %2 = tail call i32 @baz() 584ef1c25ebSDaniel Hoekwater ret i32 %2 585ef1c25ebSDaniel Hoekwater 586ef1c25ebSDaniel Hoekwatercold1: ; preds = %0 587ef1c25ebSDaniel Hoekwater %3 = tail call i32 @bam() 588ef1c25ebSDaniel Hoekwater ret i32 %3 589ef1c25ebSDaniel Hoekwater 590ef1c25ebSDaniel Hoekwatercold2: ; preds = %0 591ef1c25ebSDaniel Hoekwater %4 = tail call i32 @qux() 592ef1c25ebSDaniel Hoekwater ret i32 %4 593ef1c25ebSDaniel Hoekwater} 594ef1c25ebSDaniel Hoekwater 5950982d961SDaniel Hoekwaterdefine void @foo20(i1 zeroext %0) !prof !14 !section_prefix !15 { 5960982d961SDaniel Hoekwater;; Check that blocks containing or targeted by asm goto aren't split. 5970982d961SDaniel Hoekwater; MFS-DEFAULTS-LABEL: foo20 5980982d961SDaniel Hoekwater; MFS-DEFAULTS-AARCH64-NOT: foo20.cold: 5990982d961SDaniel Hoekwater; MFS-DEFAULTS-X86: .section .text.split.foo20 6000982d961SDaniel Hoekwater; MFS-DEFAULTS-X86: foo20.cold: 6010982d961SDaniel Hoekwater; MFS-DEFAULTS-X86-DAG: # %cold_asm 6020982d961SDaniel Hoekwater; MFS-DEFAULTS-X86-DAG: # %cold_asm_target 6030982d961SDaniel Hoekwater 6040982d961SDaniel Hoekwater br i1 %0, label %hot, label %cold_asm, !prof !17 6050982d961SDaniel Hoekwater 6060982d961SDaniel Hoekwaterhot: 6070982d961SDaniel Hoekwater %2 = call i32 @bar() 6080982d961SDaniel Hoekwater ret void 6090982d961SDaniel Hoekwater 6100982d961SDaniel Hoekwatercold_asm: 6110982d961SDaniel Hoekwater callbr void asm sideeffect "nop", "!i"() #3 6120982d961SDaniel Hoekwater to label %asm.fallthrough [label %cold_asm_target] 6130982d961SDaniel Hoekwater 6140982d961SDaniel Hoekwaterasm.fallthrough: 6150982d961SDaniel Hoekwater br label %cold_asm_target 6160982d961SDaniel Hoekwater 6170982d961SDaniel Hoekwatercold_asm_target: 6180982d961SDaniel Hoekwater %3 = call i32 @baz() 6190982d961SDaniel Hoekwater ret void 6200982d961SDaniel Hoekwater} 6210982d961SDaniel Hoekwater 622*68f7b075SRahman Lavaeedefine void @foo21(i1 zeroext %0) { 623*68f7b075SRahman Lavaee;; Check that a function with basic-block-sections profile (but no pgo profile) 624*68f7b075SRahman Lavaee;; is properly split when the profile is used along with mfs. 625*68f7b075SRahman Lavaee; MFS-BBSECTIONS: .section .text.hot.foo21 626*68f7b075SRahman Lavaee; MFS-NOBBSECTIONS-NOT: .section .text.hot.foo21 627*68f7b075SRahman Lavaee; MFS-BBSECTIONS-LABEL: foo21: 628*68f7b075SRahman Lavaee; MFS-NOBBSECTIONS-NOT: foo21.cold: 629*68f7b075SRahman Lavaee; MFS-BBSECTIONS: .section .text.split.foo21 630*68f7b075SRahman Lavaee; MFS-BBSECTIONS: foo21.cold 631*68f7b075SRahman Lavaee %2 = alloca i8, align 1 632*68f7b075SRahman Lavaee %3 = zext i1 %0 to i8 633*68f7b075SRahman Lavaee store i8 %3, ptr %2, align 1 634*68f7b075SRahman Lavaee %4 = load i8, ptr %2, align 1 635*68f7b075SRahman Lavaee %5 = trunc i8 %4 to i1 636*68f7b075SRahman Lavaee br i1 %5, label %6, label %8 637*68f7b075SRahman Lavaee 638*68f7b075SRahman Lavaee6: ; preds = %1 639*68f7b075SRahman Lavaee %7 = call i32 @bar() 640*68f7b075SRahman Lavaee br label %10 641*68f7b075SRahman Lavaee 642*68f7b075SRahman Lavaee8: ; preds = %1 643*68f7b075SRahman Lavaee %9 = call i32 @baz() 644*68f7b075SRahman Lavaee br label %10 645*68f7b075SRahman Lavaee 646*68f7b075SRahman Lavaee10: ; preds = %8, %6 647*68f7b075SRahman Lavaee ret void 648*68f7b075SRahman Lavaee} 649*68f7b075SRahman Lavaee 650*68f7b075SRahman Lavaeedefine void @foo22(i1 zeroext %0) nounwind !prof !14 !section_prefix !15 { 651*68f7b075SRahman Lavaee;; Check that when a function has both basic-block-section and pgo profiles 652*68f7b075SRahman Lavaee;; only the basic-block-section profile is used for splitting. 653*68f7b075SRahman Lavaee 654*68f7b075SRahman Lavaee;; Check that we create two hot sections with -basic-block-sections. 655*68f7b075SRahman Lavaee; MFS-BBSECTIONS: .section .text.hot.foo22 656*68f7b075SRahman Lavaee; MFS-BBSECTIONS-LABEL: foo22: 657*68f7b075SRahman Lavaee; MFS-BBSECTIONS: callq bar 658*68f7b075SRahman Lavaee; MFS-BBSECTIONS: .section .text.hot.foo22 659*68f7b075SRahman Lavaee; MFS-BBSECTIONS-NEXT: foo22.__part.1: 660*68f7b075SRahman Lavaee; MFS-BBSECTIONS: callq baz 661*68f7b075SRahman Lavaee; MFS-BBSECTIONS-NOT: .section .text.split.foo22 662*68f7b075SRahman Lavaee br i1 %0, label %2, label %4, !prof !17 663*68f7b075SRahman Lavaee 664*68f7b075SRahman Lavaee2: ; preds = %1 665*68f7b075SRahman Lavaee %3 = call i32 @bar() 666*68f7b075SRahman Lavaee br label %6 667*68f7b075SRahman Lavaee 668*68f7b075SRahman Lavaee4: ; preds = %1 669*68f7b075SRahman Lavaee %5 = call i32 @baz() 670*68f7b075SRahman Lavaee br label %6 671*68f7b075SRahman Lavaee 672*68f7b075SRahman Lavaee6: ; preds = %4, %2 673*68f7b075SRahman Lavaee %7 = tail call i32 @qux() 674*68f7b075SRahman Lavaee ret void 675*68f7b075SRahman Lavaee} 676*68f7b075SRahman Lavaee 6772c43d591SDaniel Hoekwaterdeclare i32 @bar() 6782c43d591SDaniel Hoekwaterdeclare i32 @baz() 6792c43d591SDaniel Hoekwaterdeclare i32 @bam() 6802c43d591SDaniel Hoekwaterdeclare i32 @qux() 6812c43d591SDaniel Hoekwaterdeclare void @_Z1fv() 6822c43d591SDaniel Hoekwaterdeclare i32 @__gxx_personality_v0(...) 6832c43d591SDaniel Hoekwater 6842c43d591SDaniel Hoekwater@_ZTIi = external constant ptr 6852c43d591SDaniel Hoekwater 6862c43d591SDaniel Hoekwater!llvm.module.flags = !{!0} 6872c43d591SDaniel Hoekwater!0 = !{i32 1, !"ProfileSummary", !1} 6882c43d591SDaniel Hoekwater!1 = !{!2, !3, !4, !5, !6, !7, !8, !9} 6892c43d591SDaniel Hoekwater!2 = !{!"ProfileFormat", !"InstrProf"} 6902c43d591SDaniel Hoekwater!3 = !{!"TotalCount", i64 10000} 6912c43d591SDaniel Hoekwater!4 = !{!"MaxCount", i64 10} 6922c43d591SDaniel Hoekwater!5 = !{!"MaxInternalCount", i64 1} 6932c43d591SDaniel Hoekwater!6 = !{!"MaxFunctionCount", i64 1000} 6942c43d591SDaniel Hoekwater!7 = !{!"NumCounts", i64 3} 6952c43d591SDaniel Hoekwater!8 = !{!"NumFunctions", i64 5} 6962c43d591SDaniel Hoekwater!9 = !{!"DetailedSummary", !10} 6972c43d591SDaniel Hoekwater!10 = !{!11, !12, !13} 6982c43d591SDaniel Hoekwater!11 = !{i32 10000, i64 100, i32 1} 6992c43d591SDaniel Hoekwater!12 = !{i32 999900, i64 100, i32 1} 7002c43d591SDaniel Hoekwater!13 = !{i32 999999, i64 1, i32 2} 7012c43d591SDaniel Hoekwater!14 = !{!"function_entry_count", i64 7000} 7022c43d591SDaniel Hoekwater!15 = !{!"function_section_prefix", !"hot"} 7032c43d591SDaniel Hoekwater!16 = !{!"function_section_prefix", !"unlikely"} 7042c43d591SDaniel Hoekwater!17 = !{!"branch_weights", i32 7000, i32 0} 7052c43d591SDaniel Hoekwater!18 = !{!"branch_weights", i32 3000, i32 4000} 7062c43d591SDaniel Hoekwater!19 = !{!"branch_weights", i32 1000, i32 6000} 7072c43d591SDaniel Hoekwater!20 = !{!"function_entry_count", i64 10000} 7082c43d591SDaniel Hoekwater!21 = !{!"branch_weights", i32 6000, i32 4000} 7092c43d591SDaniel Hoekwater!22 = !{!"branch_weights", i32 80, i32 9920} 7102c43d591SDaniel Hoekwater!23 = !{!"function_entry_count", i64 7} 7112c43d591SDaniel Hoekwater!24 = !{!"function_entry_count", i64 10000} 7122c43d591SDaniel Hoekwater!25 = !{!"branch_weights", i32 0, i32 7000} 7132c43d591SDaniel Hoekwater!26 = !{!"branch_weights", i32 1000, i32 6000} 7142c43d591SDaniel Hoekwater!27 = !{!"function_entry_count", i64 10000} 715ef1c25ebSDaniel Hoekwater!28 = !{!"branch_weights", i32 0, i32 4000, i32 4000, i32 0, i32 0} 716