# RUN: llc -verify-machineinstrs -mcpu=pwr9 -mtriple powerpc64le-unknown-linux-gnu \ # RUN: -run-pass=codegenprepare -o - %s | FileCheck %s # RUN: llc -verify-machineinstrs -mcpu=pwr8 -mtriple powerpc64le-unknown-linux-gnu \ # RUN: -run-pass=codegenprepare -o - %s | FileCheck %s --- | define i32 @weighted_select1(i32 %a, i32 %b) { %cmp = icmp ne i32 %a, 0 %sel = select i1 %cmp, i32 %a, i32 %b, !prof !14 ret i32 %sel ; If branch_weights > 99% or branch_weights < 1%, the select will be ; converted to branch, here !14 = 99/100, !14 = 99%, so it will do nothing. ; CHECK-LABEL: weighted_select1 ; CHECK: %cmp = icmp ne i32 %a, 0 ; CHECK-NEXT: %sel = select i1 %cmp, i32 %a, i32 %b, !prof !14 ; CHECK-NEXT: ret i32 %sel } define i32 @weighted_select2(i32 %a, i32 %b) { %cmp = icmp ne i32 %a, 0 %sel = select i1 %cmp, i32 %a, i32 %b, !prof !15 ret i32 %sel ; If branch_weights > 99% or branch_weights < 1%, the select will be converted ; to branch, here !15 = 100/101, !15 > 99%, so it will convert select to ; branch. ; CHECK-LABEL: weighted_select2 ; CHECK: %sel.frozen = freeze i32 %a ; CHECK: %cmp = icmp ne i32 %sel.frozen, 0 ; CHECK-NEXT: br i1 %cmp, label %select.end, label %select.false, !prof !15 ; CHECK: select.false: ; CHECK-NEXT: br label %select.end ; CHECK: select.end: ; CHECK-NEXT: %sel = phi i32 [ %a, %0 ], [ %b, %select.false ] ; CHECK-NEXT: ret i32 %sel } define i32 @weighted_select3(i32 %a, i32 %b) { %cmp = icmp ne i32 %a, 0 %sel = select i1 %cmp, i32 %a, i32 %b, !prof !16 ret i32 %sel ; If branch_weights > 99% or branch_weights < 1%, the select will be converted ; to branch, here !16 = 1/101, !16 < 1%, so it will convert select to branch. ; CHECK-LABEL: weighted_select3 ; CHECK: %sel.frozen = freeze i32 %a ; CHECK: %cmp = icmp ne i32 %sel.frozen, 0 ; CHECK-NEXT: br i1 %cmp, label %select.end, label %select.false, !prof !16 ; CHECK: select.false: ; CHECK-NEXT: br label %select.end ; CHECK: select.end: ; CHECK-NEXT: %sel = phi i32 [ %a, %0 ], [ %b, %select.false ] ; CHECK-NEXT: ret i32 %sel } define i32 @unweighted_select(i32 %a, i32 %b) { %cmp = icmp ne i32 %a, 0 %sel = select i1 %cmp, i32 %a, i32 %b, !prof !17 ret i32 %sel ; There is no weight_branch information, so it will do nothing. ; CHECK-LABEL: unweighted_select ; CHECK: %cmp = icmp ne i32 %a, 0 ; CHECK-NEXT: %sel = select i1 %cmp, i32 %a, i32 %b, !prof !17 ; CHECK-NEXT: ret i32 %sel } ; Function Attrs: optsize define i32 @weighted_select_optsize(i32 %a, i32 %b) #0 { %cmp = icmp ne i32 %a, 0 %sel = select i1 %cmp, i32 %a, i32 %b, !prof !15 ret i32 %sel ; This function has used the optsize flag, so it will do nothing. ; CHECK-LABEL: weighted_select_optsize ; CHECK: %cmp = icmp ne i32 %a, 0 ; CHECK-NEXT: %sel = select i1 %cmp, i32 %a, i32 %b, !prof !15 ; CHECK-NEXT: ret i32 %sel } define i32 @weighted_select_pgso(i32 %a, i32 %b) !prof !18 { %cmp = icmp ne i32 %a, 0 %sel = select i1 %cmp, i32 %a, i32 %b, !prof !15 ret i32 %sel ; The function_entry_count of this function is 0, so it will do nothing. ; CHECK-LABEL: weighted_select_pgso ; CHECK: %cmp = icmp ne i32 %a, 0 ; CHECK-NEXT: %sel = select i1 %cmp, i32 %a, i32 %b, !prof !15 ; CHECK-NEXT: ret i32 %sel } attributes #0 = { optsize } !llvm.module.flags = !{!0} !0 = !{i32 1, !"ProfileSummary", !1} !1 = !{!2, !3, !4, !5, !6, !7, !8, !9} !2 = !{!"ProfileFormat", !"InstrProf"} !3 = !{!"TotalCount", i64 10000} !4 = !{!"MaxCount", i64 10} !5 = !{!"MaxInternalCount", i64 1} !6 = !{!"MaxFunctionCount", i64 1000} !7 = !{!"NumCounts", i64 3} !8 = !{!"NumFunctions", i64 3} !9 = !{!"DetailedSummary", !10} !10 = !{!11, !12, !13} !11 = !{i32 10000, i64 100, i32 1} !12 = !{i32 999000, i64 100, i32 1} !13 = !{i32 999999, i64 1, i32 2} !14 = !{!"branch_weights", i32 1, i32 99} !15 = !{!"branch_weights", i32 1, i32 100} !16 = !{!"branch_weights", i32 100, i32 1} !17 = !{!"branch_weights", i32 0, i32 0} !18 = !{!"function_entry_count", i64 0} ...