xref: /llvm-project/llvm/test/CodeGen/Generic/machine-function-splitter.ll (revision 68f7b075c07197803625431ba92c337af7470c85)
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