brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.0 KiB · 1a8c9ed Raw
716 lines · plain
1; REQUIRES: aarch64-registered-target2; REQUIRES: x86-registered-target3 4; COM: Machine function splitting with FDO profiles5; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions | FileCheck %s -check-prefixes=MFS-DEFAULTS,MFS-DEFAULTS-X86,MFS-NOBBSECTIONS6; 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-X867; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions -mfs-psi-cutoff=950000 | FileCheck %s -check-prefixes=MFS-OPTS2,MFS-OPTS2-X868; 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-X869; 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-X8610 11; COM: Machine function splitting along with -basic-block-sections profile12; RUN: echo 'v1' > %t13; RUN: echo 'ffoo21' >> %t14; RUN: echo 'c0' >> %t15; RUN: echo 'ffoo22' >> %t16; RUN: echo 'c0 1' >> %t17; RUN: echo 'c2' >> %t18; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -basic-block-sections=%t -split-machine-functions | FileCheck %s --check-prefixes=MFS-BBSECTIONS19 20; 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-AARCH6421; 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-AARCH6422; 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-AARCH6423; 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-AARCH6424; 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-AARCH6425; RUN: llc < %s -mtriple=aarch64 -enable-split-machine-functions -aarch64-redzone | FileCheck %s -check-prefixes=MFS-REDZONE-AARCH6426 27; COM: Machine function splitting with AFDO profiles28; RUN: sed 's/InstrProf/SampleProfile/g' %s > %t.ll29; RUN: llc < %t.ll -mtriple=x86_64-unknown-linux-gnu -split-machine-functions | FileCheck %s --check-prefix=FSAFDO-MFS30; RUN: llc < %t.ll -mtriple=x86_64-unknown-linux-gnu -split-machine-functions | FileCheck %s --check-prefix=FSAFDO-MFS231 32define void @foo1(i1 zeroext %0) nounwind !prof !14 !section_prefix !15 {33;; Check that cold block is moved to .text.split.34; MFS-DEFAULTS-LABEL:         foo135; MFS-DEFAULTS:               .section        .text.split.foo136; MFS-DEFAULTS-NEXT:          foo1.cold:37; MFS-DEFAULTS-X86-NOT:       callq   bar38; MFS-DEFAULTS-X86-NEXT:      callq   baz39; MFS-DEFAULTS-AARCH64-NOT:   bl      bar40; MFS-DEFAULTS-AARCH64-NEXT:  bl      baz41  br i1 %0, label %2, label %4, !prof !1742 432:                                                ; preds = %144  %3 = call i32 @bar()45  br label %646 474:                                                ; preds = %148  %5 = call i32 @baz()49  br label %650 516:                                                ; preds = %4, %252  %7 = tail call i32 @qux()53  ret void54}55 56define void @foo2(i1 zeroext %0) nounwind !prof !23 !section_prefix !16 {57;; Check that function marked unlikely is not split.58; MFS-DEFAULTS-LABEL: foo259; MFS-DEFAULTS-NOT:   foo2.cold:60  br i1 %0, label %2, label %4, !prof !1761 622:                                                ; preds = %163  %3 = call i32 @bar()64  br label %665 664:                                                ; preds = %167  %5 = call i32 @baz()68  br label %669 706:                                                ; preds = %4, %271  %7 = tail call i32 @qux()72  ret void73}74 75define void @foo3(i1 zeroext %0) nounwind !section_prefix !15 {76;; Check that function without profile data is not split.77; MFS-DEFAULTS-LABEL: foo378; MFS-DEFAULTS-NOT:   foo3.cold:79  br i1 %0, label %2, label %480 812:                                                ; preds = %182  %3 = call i32 @bar()83  br label %684 854:                                                ; preds = %186  %5 = call i32 @baz()87  br label %688 896:                                                ; preds = %4, %290  %7 = tail call i32 @qux()91  ret void92}93 94define void @foo4(i1 zeroext %0, i1 zeroext %1) nounwind !prof !20 {95;; Check that count threshold works.96; MFS-OPTS1-LABEL:         foo497; MFS-OPTS1:               .section        .text.split.foo498; MFS-OPTS1-NEXT:          foo4.cold:99; MFS-OPTS1-X86-NOT:       callq    bar100; MFS-OPTS1-X86-NOT:       callq    baz101; MFS-OPTS1-X86-NEXT:      callq    bam102; MFS-OPTS1-AARCH64-NOT:   bl       bar103; MFS-OPTS1-AARCH64-NOT:   bl       baz104; MFS-OPTS1-AARCH64-NEXT:  bl       bam105  br i1 %0, label %3, label %7, !prof !18106 1073:108  %4 = call i32 @bar()109  br label %7110 1115:112  %6 = call i32 @baz()113  br label %7114 1157:116  br i1 %1, label %8, label %10, !prof !19117 1188:119  %9 = call i32 @bam()120  br label %12121 12210:123  %11 = call i32 @baz()124  br label %12125 12612:127  %13 = tail call i32 @qux()128  ret void129}130 131define void @foo5(i1 zeroext %0, i1 zeroext %1) nounwind !prof !20 {132;; Check that profile summary info cutoff works.133; MFS-OPTS2-LABEL:         foo5134; MFS-OPTS2:               .section        .text.split.foo5135; MFS-OPTS2-NEXT:               foo5.cold:136; MFS-OPTS2-X86-NOT:       callq    bar137; MFS-OPTS2-X86-NOT:       callq    baz138; MFS-OPTS2-X86-NEXT:      callq    bam139; MFS-OPTS2-AARCH64-NOT:   bl       bar140; MFS-OPTS2-AARCH64-NOT:   bl       baz141; MFS-OPTS2-AARCH64-NEXT:  bl       bam142  br i1 %0, label %3, label %7, !prof !21143 1443:145  %4 = call i32 @bar()146  br label %7147 1485:149  %6 = call i32 @baz()150  br label %7151 1527:153  br i1 %1, label %8, label %10, !prof !22154 1558:156  %9 = call i32 @bam()157  br label %12158 15910:160  %11 = call i32 @baz()161  br label %12162 16312:164  %13 = call i32 @qux()165  ret void166}167 168define void @foo6(i1 zeroext %0) nounwind section "nosplit" !prof !14 {169;; Check that function with section attribute is not split.170; MFS-DEFAULTS-LABEL: foo6171; MFS-DEFAULTS-NOT:   foo6.cold:172  br i1 %0, label %2, label %4, !prof !17173 1742:                                                ; preds = %1175  %3 = call i32 @bar()176  br label %6177 1784:                                                ; preds = %1179  %5 = call i32 @baz()180  br label %6181 1826:                                                ; preds = %4, %2183  %7 = tail call i32 @qux()184  ret void185}186 187define i32 @foo7(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 {188;; Check that a single cold ehpad is split out.189; MFS-DEFAULTS-LABEL:         foo7190; MFS-DEFAULTS:               .section        .text.split.foo7,"ax",@progbits191; MFS-DEFAULTS-NEXT:          foo7.cold:192; MFS-DEFAULTS-X86:           callq   baz193; MFS-DEFAULTS-X86:           callq   _Unwind_Resume@PLT194; MFS-DEFAULTS-AARCH64:       bl      baz195entry:196  invoke void @_Z1fv()197          to label %try.cont unwind label %lpad198 199lpad:200  %1 = landingpad { ptr, i32 }201          cleanup202          catch ptr @_ZTIi203  resume { ptr, i32 } %1204 205try.cont:206  br i1 %0, label %2, label %4, !prof !17207 2082:                                                ; preds = try.cont209  %3 = call i32 @bar()210  br label %6211 2124:                                                ; preds = %1213  %5 = call i32 @baz()214  br label %6215 2166:                                                ; preds = %4, %2217  %7 = tail call i32 @qux()218  ret i32 %7219}220 221define i32 @foo8(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 {222;; Check that all ehpads are treated as hot if one of them is hot.223; MFS-DEFAULTS-LABEL:         foo8224; MFS-DEFAULTS-X86:           callq   _Unwind_Resume@PLT225; MFS-DEFAULTS-X86:           callq   _Unwind_Resume@PLT226; MFS-DEFAULTS:               .section        .text.split.foo8,"ax",@progbits227; MFS-DEFAULTS-NEXT:          foo8.cold:228; MFS-DEFAULTS-X86:           callq   baz229; MFS-DEFAULTS-AARCH64:       bl      baz230 231;; Check that all ehpads are by default treated as cold with -mfs-split-ehcode.232; MFS-EH-SPLIT-LABEL:         foo8233; MFS-EH-SPLIT-X86:           callq   baz234; MFS-EH-SPLIT-AARCH64:       bl      baz235; MFS-EH-SPLIT-X86:           .section        .text.split.foo8,"ax",@progbits236; MFS-EH-SPLIT-X86-NEXT:      foo8.cold:237; MFS-EH-SPLIT-X86:           callq   _Unwind_Resume@PLT238; MFS-EH-SPLIT-X86:           callq   _Unwind_Resume@PLT239entry:240  invoke void @_Z1fv()241          to label %try.cont unwind label %lpad1242 243lpad1:244  %1 = landingpad { ptr, i32 }245          cleanup246          catch ptr @_ZTIi247  resume { ptr, i32 } %1248 249try.cont:250  br i1 %0, label %hot, label %cold, !prof !17251 252hot:253  %2 = call i32 @bar()254  invoke void @_Z1fv()255          to label %exit unwind label %lpad2, !prof !21256 257lpad2:258  %3 = landingpad { ptr, i32 }259          cleanup260          catch ptr @_ZTIi261  resume { ptr, i32 } %3262 263cold:264  %4 = call i32 @baz()265  br label %exit266 267exit:268  %5 = tail call i32 @qux()269  ret i32 %5270}271 272define i32 @foo10(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 {273;; Check that nop is inserted just before the EH pad if it's beginning a section.274; MFS-DEFAULTS-LABEL:         foo10275; MFS-DEFAULTS-X86-LABEL:     callq   baz276; MFS-DEFAULTS-AARCH64:       bl      baz277; MFS-DEFAULTS-X86:           .section        .text.split.foo10,"ax",@progbits278; MFS-DEFAULTS-X86-NEXT:      foo10.cold:279; MFS-DEFAULTS-X86:           nop280; MFS-DEFAULTS-X86:           callq   _Unwind_Resume@PLT281entry:282  invoke void @_Z1fv()283          to label %try.cont unwind label %lpad, !prof !17284 285lpad:286  %1 = landingpad { ptr, i32 }287          cleanup288          catch ptr @_ZTIi289  resume { ptr, i32 } %1290 291try.cont:292  %2 = call i32 @baz()293  ret i32 %2294}295 296define void @foo11(i1 zeroext %0) personality ptr @__gxx_personality_v0 {297;; Check that function having landing pads are split with mfs-split-ehcode298;; even in the absence of profile data299; MFS-EH-SPLIT-LABEL:         foo11300; MFS-EH-SPLIT-X86:           .section        .text.split.foo11,"ax",@progbits301; MFS-EH-SPLIT-X86-NEXT:      foo11.cold:302; MFS-EH-SPLIT-X86:           nop303; MFS-EH-SPLIT-X86:           callq   _Unwind_Resume@PLT304entry:305  invoke void @_Z1fv()306        to label %2 unwind label %lpad307 308lpad:309  %1 = landingpad { ptr, i32 }310          cleanup311          catch ptr @_ZTIi312  resume { ptr, i32 } %1313 3142:                                                ; preds = entry315  %3 = tail call i32 @qux()316  ret void317}318 319define i32 @foo12(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 {320;; Check that all code reachable from ehpad is split out with cycles.321; MFS-EH-SPLIT-LABEL:         foo12322; MFS-EH-SPLIT:               .section        .text.split.foo12,"ax",@progbits323; MFS-EH-SPLIT-NEXT:          foo12.cold:324; MFS-EH-SPLIT-X86:           callq   bar325; MFS-EH-SPLIT-X86:           callq   baz326; MFS-EH-SPLIT-X86:           callq   qux327; MFS-EH-SPLIT-AARCH64:       bl      bar328; MFS-EH-SPLIT-AARCH64:       bl      baz329; MFS-EH-SPLIT-AARCH64:       bl      qux330entry:331  invoke void @_Z1fv()332          to label %8 unwind label %lpad333 334lpad:335  %1 = landingpad { ptr, i32 }336          cleanup337          catch ptr @_ZTIi338  br label %2339 3402:                                                ; preds = lpad341  %3 = call i32 @bar()342  br i1 %0, label %4, label %6343 3444:                                                ; preds = lpad345  %5 = call i32 @baz()346  br label %6347 3486:                                                ; preds = %4, %2349  %7 = tail call i32 @qux()350  br i1 %0, label %2, label %8351 3528:                                                ; preds = %6353  ret i32 0354}355 356define i32 @foo13(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14{357;; Check that all code reachable from EH358;; that is also reachable from outside EH pad359;; is not touched.360; MFS-EH-SPLIT-LABEL:         foo13361; MFS-EH-SPLIT-X86:           callq   bam362; MFS-EH-SPLIT-AARCH64:       bl      bam363; MFS-EH-SPLIT:               .section        .text.split.foo13,"ax",@progbits364; MFS-EH-SPLIT-NEXT:          foo13.cold:365; MFS-EH-SPLIT-X86:           callq   baz366; MFS-EH-SPLIT-X86:           callq   bar367; MFS-EH-SPLIT-X86:           callq   qux368; MFS-EH-SPLIT-AARCH64:       bl      baz369; MFS-EH-SPLIT-AARCH64:       bl      bar370; MFS-EH-SPLIT-AARCH64:       bl      qux371entry:372  invoke void @_Z1fv()373          to label %try.cont unwind label %lpad, !prof !17374 375lpad:376  %1 = landingpad { ptr, i32 }377          cleanup378          catch ptr @_ZTIi379  br i1 %0, label %2, label %4, !prof !17380 3812:                                                ; preds = lpad382  %3 = call i32 @bar()383  br label %6384 3854:                                                ; preds = lpad386  %5 = call i32 @baz()387  br label %6388 3896:                                                ; preds = %4, %2390  %7 = tail call i32 @qux()391  br i1 %0, label %2, label %try.cont, !prof !17392 393try.cont:                                        ; preds = %entry394  %8 = call i32 @bam()395  ret i32 %8396}397 398define void @foo14(i1 zeroext %0, i1 zeroext %1) nounwind !prof !24 {399; FSAFDO-MFS: .section	.text.split.foo14,"ax"400; FSAFDO-MFS: foo14.cold:401  br i1 %0, label %3, label %7, !prof !25402 4033:404  %4 = call i32 @bar()405  br label %7406 4075:408  %6 = call i32 @baz()409  br label %7410 4117:412  br i1 %1, label %8, label %10, !prof !26413 4148:415  %9 = call i32 @bam()416  br label %12417 41810:419  %11 = call i32 @baz()420  br label %12421 42212:423  %13 = tail call i32 @qux()424  ret void425}426 427define void @foo15(i1 zeroext %0, i1 zeroext %1) nounwind !prof !27 {428;; HasAccurateProfile is false, foo15 is hot, but no profile data for429;; blocks, no split should happen.430; FSAFDO-MFS2-NOT: .section	.text.split.foo15,"ax"431; FSAFDO-MFS2-NOT: foo15.cold:432  br i1 %0, label %3, label %7433 4343:435  %4 = call i32 @bar()436  br label %7437 4385:439  %6 = call i32 @baz()440  br label %7441 4427:443  br i1 %1, label %8, label %10444 4458:446  %9 = call i32 @bam()447  br label %12448 44910:450  %11 = call i32 @baz()451  br label %12452 45312:454  %13 = tail call i32 @qux()455  ret void456}457 458define void @foo16(i1 zeroext %0) nounwind !prof !14 !section_prefix !15 {459;; Check that an unconditional branch is only appended to a block460;; if it would fall through to the wrong block otherwise.461; MFS-O0-LABEL:               foo16462; MFS-O0-X86:                 jmp463; MFS-O0-X86-NOT:             jmp464; MFS-O0-AARCH64:                 b       foo16.cold465; MFS-O0-AARCH64-NOT:             b       foo16.cold466; MFS-O0:                     .section        .text.split.foo16467; MFS-O0-NEXT:                foo16.cold468  %2 = call i32 @baz()469  br i1 false, label %3, label %5, !prof !25470 4713:                                                ; preds = %1472  %4 = call i32 @bar()473  unreachable474 4755:                                                ; preds = %1476  %6 = tail call i32 @qux()477  ret void478}479 480define i32 @foo17(i1 zeroext %0, i32 %a, i32 %b) nounwind !prof !14 !section_prefix !15 {481;; Check that cold blocks in functions with red zones aren't split.482; MFS-DEFAULTS-LABEL:        foo17483; MFS-DEFAULTS-X86:          foo17.cold:484; MFS-REDZONE-AARCH64-NOT:   foo17.cold:485  %a.addr = alloca i32, align 4486  %b.addr = alloca i32, align 4487  %x = alloca i32, align 4488 489  br i1 %0, label %2, label %3, !prof !17490 4912:                                                ; preds = %1492  store i32 %a, ptr %a.addr, align 4493  store i32 %b, ptr %b.addr, align 4494  br label %4495 4963:                                                ; preds = %1497  store i32 %a, ptr %b.addr, align 4498  store i32 %b, ptr %a.addr, align 4499  br label %4500 5014:                                                ; preds = %3, %2502  %tmp = load i32, ptr %a.addr, align 4503  %tmp1 = load i32, ptr %b.addr, align 4504  %add = add nsw i32 %tmp, %tmp1505  store i32 %add, ptr %x, align 4506  %tmp2 = load i32, ptr %x, align 4507  ret i32 %tmp2508}509 510define i32 @foo18(i32 %in) !prof !14 !section_prefix !15 {511;; Check that a cold block targeted by a jump table is not split512;; on AArch64.513; MFS-DEFAULTS-LABEL:        foo18514; MFS-DEFAULTS:              .section        .text.split.foo18515; MFS-DEFAULTS-NEXT:         foo18.cold:516; MFS-DEFAULTS-SAME:           %common.ret517; MFS-DEFAULTS-X86-DAG:        jmp     qux518; MFS-DEFAULTS-X86-DAG:        jmp     bam519; MFS-DEFAULTS-AARCH64-NOT:    b       bar520; MFS-DEFAULTS-AARCH64-NOT:    b       baz521; MFS-DEFAULTS-AARCH64-NOT:    b       qux522; MFS-DEFAULTS-AARCH64-NOT:    b       bam523 524  switch i32 %in, label %common.ret [525    i32 0, label %hot1526    i32 1, label %hot2527    i32 2, label %cold1528    i32 3, label %cold2529  ], !prof !28530 531common.ret:                                       ; preds = %0532  ret i32 0533 534hot1:                                             ; preds = %0535  %1 = tail call i32 @bar()536  ret i32 %1537 538hot2:                                             ; preds = %0539  %2 = tail call i32 @baz()540  ret i32 %2541 542cold1:                                            ; preds = %0543  %3 = tail call i32 @bam()544  ret i32 %3545 546cold2:                                            ; preds = %0547  %4 = tail call i32 @qux()548  ret i32 %4549}550 551define i32 @foo19(i32 %in) !prof !14 !section_prefix !15 {552;; Check that a cold block that contains a jump table dispatch is553;; not split on AArch64.554; MFS-DEFAULTS-LABEL:        foo19555; MFS-DEFAULTS:              .section        .text.split.foo19556; MFS-DEFAULTS-NEXT:         foo19.cold:557; MFS-DEFAULTS-X86:            .LJTI17_0558; MFS-DEFAULTS-AARCH64-NOT:    .LJTI17_0559; MFS-DEFAULTS:              .section        .rodata560; MFS-DEFAULTS:                .LJTI17_0561  %cmp = icmp sgt i32 %in, 3562  br i1 %cmp, label %hot, label %cold_switch, !prof !17563 564hot:                                              ; preds = %0565ret i32 1566 567cold_switch:                                      ; preds = %0568  switch i32 %in, label %common.ret [569    i32 0, label %hot1570    i32 1, label %hot2571    i32 2, label %cold1572    i32 3, label %cold2573  ], !prof !28574 575common.ret:                                       ; preds = %0576  ret i32 0577 578hot1:                                             ; preds = %0579  %1 = tail call i32 @bar()580  ret i32 %1581 582hot2:                                             ; preds = %0583  %2 = tail call i32 @baz()584  ret i32 %2585 586cold1:                                            ; preds = %0587  %3 = tail call i32 @bam()588  ret i32 %3589 590cold2:                                            ; preds = %0591  %4 = tail call i32 @qux()592  ret i32 %4593}594 595define void @foo20(i1 zeroext %0) !prof !14 !section_prefix !15 {596;; Check that blocks containing or targeted by asm goto aren't split.597; MFS-DEFAULTS-LABEL:        foo20598; MFS-DEFAULTS-AARCH64-NOT:  foo20.cold:599; MFS-DEFAULTS-X86:          .section        .text.split.foo20600; MFS-DEFAULTS-X86:          foo20.cold:601; MFS-DEFAULTS-X86-DAG:      # %cold_asm602; MFS-DEFAULTS-X86-DAG:      # %cold_asm_target603 604  br i1 %0, label %hot, label %cold_asm, !prof !17605 606hot:607  %2 = call i32 @bar()608  ret void609 610cold_asm:611    callbr void asm sideeffect "nop", "!i"() #3612          to label %asm.fallthrough [label %cold_asm_target]613 614asm.fallthrough:615    br label %cold_asm_target616 617cold_asm_target:618  %3 = call i32 @baz()619  ret void620}621 622define void @foo21(i1 zeroext %0) {623;; Check that a function with basic-block-sections profile (but no pgo profile)624;; is properly split when the profile is used along with mfs.625; MFS-BBSECTIONS:            .section   .text.hot.foo21626; MFS-NOBBSECTIONS-NOT:      .section   .text.hot.foo21627; MFS-BBSECTIONS-LABEL:      foo21:628; MFS-NOBBSECTIONS-NOT:      foo21.cold:629; MFS-BBSECTIONS:            .section	.text.split.foo21630; MFS-BBSECTIONS:            foo21.cold631  %2 = alloca i8, align 1632  %3 = zext i1 %0 to i8633  store i8 %3, ptr %2, align 1634  %4 = load i8, ptr %2, align 1635  %5 = trunc i8 %4 to i1636  br i1 %5, label %6, label %8637 6386:                                                ; preds = %1639  %7 = call i32 @bar()640  br label %10641 6428:                                                ; preds = %1643  %9 = call i32 @baz()644  br label %10645 64610:                                               ; preds = %8, %6647  ret void648}649 650define void @foo22(i1 zeroext %0) nounwind !prof !14 !section_prefix !15 {651;; Check that when a function has both basic-block-section and pgo profiles652;; only the basic-block-section profile is used for splitting.653 654;; Check that we create two hot sections with -basic-block-sections.655; MFS-BBSECTIONS:             .section        .text.hot.foo22656; MFS-BBSECTIONS-LABEL:       foo22:657; MFS-BBSECTIONS:             callq  bar658; MFS-BBSECTIONS:             .section        .text.hot.foo22659; MFS-BBSECTIONS-NEXT:        foo22.__part.1:660; MFS-BBSECTIONS:             callq  baz661; MFS-BBSECTIONS-NOT:         .section        .text.split.foo22662  br i1 %0, label %2, label %4, !prof !17663 6642:                                                ; preds = %1665  %3 = call i32 @bar()666  br label %6667 6684:                                                ; preds = %1669  %5 = call i32 @baz()670  br label %6671 6726:                                                ; preds = %4, %2673  %7 = tail call i32 @qux()674  ret void675}676 677declare i32 @bar()678declare i32 @baz()679declare i32 @bam()680declare i32 @qux()681declare void @_Z1fv()682declare i32 @__gxx_personality_v0(...)683 684@_ZTIi = external constant ptr685 686!llvm.module.flags = !{!0}687!0 = !{i32 1, !"ProfileSummary", !1}688!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}689!2 = !{!"ProfileFormat", !"InstrProf"}690!3 = !{!"TotalCount", i64 10000}691!4 = !{!"MaxCount", i64 10}692!5 = !{!"MaxInternalCount", i64 1}693!6 = !{!"MaxFunctionCount", i64 1000}694!7 = !{!"NumCounts", i64 3}695!8 = !{!"NumFunctions", i64 5}696!9 = !{!"DetailedSummary", !10}697!10 = !{!11, !12, !13}698!11 = !{i32 10000, i64 100, i32 1}699!12 = !{i32 999900, i64 100, i32 1}700!13 = !{i32 999999, i64 1, i32 2}701!14 = !{!"function_entry_count", i64 7000}702!15 = !{!"function_section_prefix", !"hot"}703!16 = !{!"function_section_prefix", !"unlikely"}704!17 = !{!"branch_weights", i32 7000, i32 0}705!18 = !{!"branch_weights", i32 3000, i32 4000}706!19 = !{!"branch_weights", i32 1000, i32 6000}707!20 = !{!"function_entry_count", i64 10000}708!21 = !{!"branch_weights", i32 6000, i32 4000}709!22 = !{!"branch_weights", i32 80, i32 9920}710!23 = !{!"function_entry_count", i64 7}711!24 = !{!"function_entry_count", i64 10000}712!25 = !{!"branch_weights", i32 0, i32 7000}713!26 = !{!"branch_weights", i32 1000, i32 6000}714!27 = !{!"function_entry_count", i64 10000}715!28 = !{!"branch_weights", i32 0, i32 4000, i32 4000, i32 0, i32 0}716