blob: 515284fb2cf1a9df918497a0254246c2dbff5b33 [file] [log] [blame]
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-grtev4-linux-gnu"
; Tests that constant pool hotness is aggregated across the module. The
; static-data-splitter processes data from @cold_func first, two functions
; without profiles secondly, and then @hot_func. Specifically, tests that
; 1. If a constant is accessed by hot functions, all constant pools for this
; constant (e.g., from an unprofiled function, or cold function) should have
; .hot suffix.
; 2. Similarly if a constant is accessed by both cold function and un-profiled
; function, constant pools for this constant should not have .unlikely suffix.
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -partition-static-data-sections \
; RUN: -function-sections -data-sections -unique-section-names=false \
; RUN: %s -o - 2>&1 | FileCheck %s --dump-input=always
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -partition-static-data-sections \
; RUN: -function-sections -data-sections -unique-section-names \
; RUN: %s -o - 2>&1 | FileCheck %s --dump-input=always
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -partition-static-data-sections \
; RUN: -function-sections=false -data-sections=false \
; RUN: -unique-section-names=false \
; RUN: %s -o - 2>&1 | FileCheck %s --dump-input=always
;; For function @cold_func
; CHECK: .section .rodata.cst8.hot,"aM",@progbits,8
; CHECK-NEXT: .p2align
; CHECK-NEXT: .LCPI0_0:
; CHECK-NEXT: .quad 0x3fe5c28f5c28f5c3 # double 0.68000000000000005
; CHECK-NEXT: .section .rodata.cst8.unlikely,"aM",@progbits,8
; CHECK-NEXT: .p2align
; CHECK-NEXT: .LCPI0_1:
; CHECK-NEXT: .quad 0x3eb0000000000000 # double 9.5367431640625E-7
; CHECK-NEXT: .section .rodata.cst8,"aM",@progbits,8
; CHECK-NEXT: .p2align
; CHECK-NEXT: .LCPI0_2:
; CHECK-NEXT: .quad 0x3fc0000000000000 # double 0.125
;; For function @unprofiled_func_double
; CHECK: .section .rodata.cst8,"aM",@progbits,8
; CHECK-NEXT: .p2align
; CHECK-NEXT: .LCPI1_0:
; CHECK-NEXT: .quad 0x3fc0000000000000 # double 0.125
;; For function @unprofiled_func_float
; CHECK: .section .rodata.cst4,"aM",@progbits,4
; CHECK-NEXT: .p2align
; CHECK-NEXT: .LCPI2_0:
; CHECK-NEXT: .long 0x3e000000 # float 0.125
;; For function @hot_func
; CHECK: .section .rodata.cst8.hot,"aM",@progbits,8
; CHECK-NEXT: .p2align
; CHECK-NEXT: .LCPI3_0:
; CHECK-NEXT: .quad 0x3fe5c28f5c28f5c3 # double 0.68000000000000005
; CHECK-NEXT: .section .rodata.cst16.hot,"aM",@progbits,16
; CHECK-NEXT: .p2align
; CHECK-NEXT: .LCPI3_1:
; CHECK-NEXT: .long 2147483648 # 0x80000000
; CHECK-NEXT: .long 2147483648 # 0x80000000
; CHECK-NEXT: .long 2147483648 # 0x80000000
; CHECK-NEXT: .long 2147483648 # 0x80000000
; CHECK-NEXT: .LCPI3_2:
; CHECK-NEXT: .long 2147484090 # 0x800001ba
; CHECK-NEXT: .long 2147483748 # 0x80000064
; CHECK-NEXT: .long 2147483648 # 0x80000000
; CHECK-NEXT: .long 2147483648 # 0x80000000
; CHECK: .section .rodata.cst32,"aM",@progbits,32
; CHECK-NEXT: .globl val
define double @cold_func(double %x) !prof !16 {
%2 = tail call i32 (...) @func_taking_arbitrary_param(double 6.800000e-01)
%y = fmul double %x, 0x3EB0000000000000
%z = fmul double %y, 0x3fc0000000000000
ret double %z
}
define double @unprofiled_func_double(double %x) {
%z = fmul double %x, 0x3fc0000000000000
ret double %z
}
define float @unprofiled_func_float(float %x) {
%z = fmul float %x, 0x3fc0000000000000
ret float %z
}
define <4 x i1> @hot_func(i32 %0, <4 x i32> %a) !prof !17 {
%2 = tail call i32 (...) @func_taking_arbitrary_param(double 6.800000e-01)
%b = icmp ule <4 x i32> %a, <i32 442, i32 100, i32 0, i32 0>
ret <4 x i1> %b
}
@val = unnamed_addr constant i256 1
define i32 @main(i32 %0, ptr %1) !prof !16 {
br label %7
5: ; preds = %7
%x = call double @double_func()
call void @cold_func(double %x)
ret i32 0
7: ; preds = %7, %2
%8 = phi i32 [ 0, %2 ], [ %10, %7 ]
%seed_val = load i256, ptr @val
%9 = call i32 @seed(i256 %seed_val)
call void @hot_func(i32 %9)
%10 = add i32 %8, 1
%11 = icmp eq i32 %10, 100000
br i1 %11, label %5, label %7, !prof !18
}
declare i32 @seed(i256)
declare double @double_func()
declare i32 @func_taking_arbitrary_param(...)
!llvm.module.flags = !{!1}
!1 = !{i32 1, !"ProfileSummary", !2}
!2 = !{!3, !4, !5, !6, !7, !8, !9, !10, !11, !12}
!3 = !{!"ProfileFormat", !"InstrProf"}
!4 = !{!"TotalCount", i64 1460617}
!5 = !{!"MaxCount", i64 849536}
!6 = !{!"MaxInternalCount", i64 32769}
!7 = !{!"MaxFunctionCount", i64 849536}
!8 = !{!"NumCounts", i64 23784}
!9 = !{!"NumFunctions", i64 3301}
!10 = !{!"IsPartialProfile", i64 0}
!11 = !{!"PartialProfileRatio", double 0.000000e+00}
!12 = !{!"DetailedSummary", !13}
!13 = !{!14, !15}
!14 = !{i32 990000, i64 166, i32 73}
!15 = !{i32 999999, i64 1, i32 1463}
!16 = !{!"function_entry_count", i64 1}
!17 = !{!"function_entry_count", i64 100000}
!18 = !{!"branch_weights", i32 1, i32 99999}