diff options
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/constant-pool-partition.ll | 175 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/jump-table-partition.ll | 34 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/global-variable-partition.ll | 38 |
4 files changed, 174 insertions, 75 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 756bb05..3c165d9 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -673,7 +673,7 @@ getELFSectionNameForGlobal(const GlobalObject *GO, SectionKind Kind, break; } default: - // Note this is unreachable code. + llvm_unreachable("Unknown jump table hotness"); break; } } else if (std::optional<StringRef> Prefix = F->getSectionPrefix()) diff --git a/llvm/test/CodeGen/AArch64/constant-pool-partition.ll b/llvm/test/CodeGen/AArch64/constant-pool-partition.ll index 9f4b3e2..61b3b60 100644 --- a/llvm/test/CodeGen/AArch64/constant-pool-partition.ll +++ b/llvm/test/CodeGen/AArch64/constant-pool-partition.ll @@ -1,11 +1,21 @@ ; RUN: llc -mtriple=aarch64 -partition-static-data-sections \ ; RUN: -function-sections -unique-section-names=false \ -; RUN: %s -o - 2>&1 | FileCheck %s --dump-input=always +; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=HOT,COMM --dump-input=always + +; RUN: llc -mtriple=aarch64 -partition-static-data-sections \ +; RUN: -function-sections -unique-section-names=false \ +; RUN: -preserve-hot-data-section-prefix=false \ +; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=NOHOT,COMM --dump-input=always + +; Repeat the RUN commands above for big-endian systems. +; RUN: llc -mtriple=aarch64_be -partition-static-data-sections \ +; RUN: -function-sections -unique-section-names=false \ +; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=HOT,COMM --dump-input=always -; Repeat the RUN command above for big-endian systems. ; RUN: llc -mtriple=aarch64_be -partition-static-data-sections \ ; RUN: -function-sections -unique-section-names=false \ -; RUN: %s -o - 2>&1 | FileCheck %s --dump-input=always +; RUN: -preserve-hot-data-section-prefix=false \ +; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=NOHOT,COMM --dump-input=always ; Tests that constant pool hotness is aggregated across the module. The ; static-data-splitter processes data from cold_func first, unprofiled_func @@ -19,77 +29,112 @@ ; function, constant pools for this constant should not have `.unlikely` suffix. ;; Constant pools for function @cold_func. -; CHECK: .section .rodata.cst8.hot.,"aM",@progbits,8 -; CHECK-NEXT: .p2align -; CHECK-NEXT: .LCPI0_0: -; CHECK-NEXT: .xword 0x3fe5c28f5c28f5c3 // double 0.68000000000000005 -; CHECK-NEXT: .section .rodata.cst8.unlikely.,"aM",@progbits,8 -; CHECK-NEXT: .p2align -; CHECK-NEXT: .LCPI0_1: -; CHECK-NEXT: .xword 0x3fe5eb851eb851ec // double 0.68500000000000005 -; CHECK-NEXT: .section .rodata.cst8,"aM",@progbits,8 -; CHECK-NEXT: .p2align -; CHECK-NEXT: .LCPI0_2: -; CHECK-NEXT: .byte 0 // 0x0 -; CHECK-NEXT: .byte 4 // 0x4 -; CHECK-NEXT: .byte 8 // 0x8 -; CHECK-NEXT: .byte 12 // 0xc -; CHECK-NEXT: .byte 255 // 0xff -; CHECK-NEXT: .byte 255 // 0xff -; CHECK-NEXT: .byte 255 // 0xff -; CHECK-NEXT: .byte 255 // 0xff +; HOT: .section .rodata.cst8.hot.,"aM",@progbits,8 +; HOT-NEXT: .p2align +; HOT-NEXT: .LCPI0_0: +; HOT-NEXT: .xword 0x3fe5c28f5c28f5c3 // double 0.68000000000000005 +; HOT-NEXT: .section .rodata.cst8.unlikely.,"aM",@progbits,8 +; HOT-NEXT: .p2align +; HOT-NEXT: .LCPI0_1: +; HOT-NEXT: .xword 0x3fe5eb851eb851ec // double 0.68500000000000005 +; HOT-NEXT: .section .rodata.cst8,"aM",@progbits,8 +; HOT-NEXT: .p2align +; HOT-NEXT: .LCPI0_2: +; HOT-NEXT: .byte 0 // 0x0 +; HOT-NEXT: .byte 4 // 0x4 +; HOT-NEXT: .byte 8 // 0x8 +; HOT-NEXT: .byte 12 // 0xc +; HOT-NEXT: .byte 255 // 0xff +; HOT-NEXT: .byte 255 // 0xff +; HOT-NEXT: .byte 255 // 0xff +; HOT-NEXT: .byte 255 // 0xff + +;; Constant pools for function @cold_func. +; NOHOT: .section .rodata.cst8,"aM",@progbits,8 +; NOHOT-NEXT: .p2align +; NOHOT-NEXT: .LCPI0_0: +; NOHOT-NEXT: .xword 0x3fe5c28f5c28f5c3 // double 0.68000000000000005 +; NOHOT-NEXT: .LCPI0_2: +; NOHOT-NEXT: .byte 0 // 0x0 +; NOHOT-NEXT: .byte 4 // 0x4 +; NOHOT-NEXT: .byte 8 // 0x8 +; NOHOT-NEXT: .byte 12 // 0xc +; NOHOT-NEXT: .byte 255 // 0xff +; NOHOT-NEXT: .byte 255 // 0xff +; NOHOT-NEXT: .byte 255 // 0xff +; NOHOT-NEXT: .byte 255 // 0xff +; NOHOT-NEXT: .section .rodata.cst8.unlikely.,"aM",@progbits,8 +; NOHOT-NEXT: .p2align +; NOHOT-NEXT: .LCPI0_1: +; NOHOT-NEXT: .xword 0x3fe5eb851eb851ec // double 0.68500000000000005 ;; Constant pools for function @unprofiled_func -; CHECK: .section .rodata.cst8,"aM",@progbits,8 -; CHECK-NEXT: .p2align -; CHECK-NEXT: .LCPI1_0: -; CHECK-NEXT: .byte 0 // 0x0 -; CHECK-NEXT: .byte 4 // 0x4 -; CHECK-NEXT: .byte 8 // 0x8 -; CHECK-NEXT: .byte 12 // 0xc -; CHECK-NEXT: .byte 255 // 0xff -; CHECK-NEXT: .byte 255 // 0xff -; CHECK-NEXT: .byte 255 // 0xff -; CHECK-NEXT: .byte 255 // 0xff -; CHECK-NEXT: .section .rodata.cst16,"aM",@progbits,16 -; CHECK-NEXT: .p2align -; CHECK-NEXT: .LCPI1_1: -; CHECK-NEXT: .word 2 // 0x2 -; CHECK-NEXT: .word 3 // 0x3 -; CHECK-NEXT: .word 5 // 0x5 -; CHECK-NEXT: .word 7 // 0x7 -; CHECK-NEXT: .section .rodata.cst16.hot.,"aM",@progbits,16 -; CHECK-NEXT: .p2align -; CHECK-NEXT: .LCPI1_2: -; CHECK-NEXT: .word 442 // 0x1ba -; CHECK-NEXT: .word 100 // 0x64 -; CHECK-NEXT: .word 0 // 0x0 -; CHECK-NEXT: .word 0 // 0x0 +; COMM: .section .rodata.cst8,"aM",@progbits,8 +; COMM-NEXT: .p2align +; COMM-NEXT: .LCPI1_0: +; COMM-NEXT: .byte 0 // 0x0 +; COMM-NEXT: .byte 4 // 0x4 +; COMM-NEXT: .byte 8 // 0x8 +; COMM-NEXT: .byte 12 // 0xc +; COMM-NEXT: .byte 255 // 0xff +; COMM-NEXT: .byte 255 // 0xff +; COMM-NEXT: .byte 255 // 0xff +; COMM-NEXT: .byte 255 // 0xff + +; HOT-NEXT: .section .rodata.cst16,"aM",@progbits,16 +; HOT-NEXT: .p2align +; HOT-NEXT: .LCPI1_1: +; HOT-NEXT: .word 2 // 0x2 +; HOT-NEXT: .word 3 // 0x3 +; HOT-NEXT: .word 5 // 0x5 +; HOT-NEXT: .word 7 // 0x7 +; HOT-NEXT: .section .rodata.cst16.hot.,"aM",@progbits,16 +; HOT-NEXT: .p2align +; HOT-NEXT: .LCPI1_2: +; HOT-NEXT: .word 442 // 0x1ba +; HOT-NEXT: .word 100 // 0x64 +; HOT-NEXT: .word 0 // 0x0 +; HOT-NEXT: .word 0 // 0x0 + +; NOHOT: .section .rodata.cst16,"aM",@progbits,16 +; NOHOT-NEXT: .p2align +; NOHOT-NEXT: .LCPI1_1: +; NOHOT-NEXT: .word 2 // 0x2 +; NOHOT-NEXT: .word 3 // 0x3 +; NOHOT-NEXT: .word 5 // 0x5 +; NOHOT-NEXT: .word 7 // 0x7 +; NOHOT-NEXT: .LCPI1_2: +; NOHOT-NEXT: .word 442 // 0x1ba +; NOHOT-NEXT: .word 100 // 0x64 +; NOHOT-NEXT: .word 0 // 0x0 +; NOHOT-NEXT: .word 0 // 0x0 ;; Constant pools for function @hot_func -; CHECK: .section .rodata.cst8.hot.,"aM",@progbits,8 -; CHECK-NEXT: .p2align -; CHECK-NEXT: .LCPI2_0: -; CHECK-NEXT: .xword 0x3fe5c28f5c28f5c3 // double 0.68000000000000005 -; CHECK-NEXT: .section .rodata.cst16.hot.,"aM",@progbits,16 -; CHECK-NEXT: .p2align -; CHECK-NEXT: .LCPI2_1: -; CHECK-NEXT: .word 0 // 0x0 -; CHECK-NEXT: .word 100 // 0x64 -; CHECK-NEXT: .word 0 // 0x0 -; CHECK-NEXT: .word 442 // 0x1ba -; CHECK-NEXT: .LCPI2_2: -; CHECK-NEXT: .word 442 // 0x1ba -; CHECK-NEXT: .word 100 // 0x64 -; CHECK-NEXT: .word 0 // 0x0 -; CHECK-NEXT: .word 0 // 0x0 +; HOT: .section .rodata.cst8.hot.,"aM",@progbits,8 +; NOHOT: .section .rodata.cst8,"aM",@progbits,8 +; COMM: .p2align +; COMM-NEXT: .LCPI2_0: +; COMM-NEXT: .xword 0x3fe5c28f5c28f5c3 // double 0.68000000000000005 +; NOHOT: .section .rodata.cst16,"aM",@progbits,16 +; HOT-NEXT: .section .rodata.cst16.hot.,"aM",@progbits,16 +; COMM: .p2align +; COMM-NEXT: .LCPI2_1: +; COMM-NEXT: .word 0 // 0x0 +; COMM-NEXT: .word 100 // 0x64 +; COMM-NEXT: .word 0 // 0x0 +; COMM-NEXT: .word 442 // 0x1ba +; COMM-NEXT: .LCPI2_2: +; COMM-NEXT: .word 442 // 0x1ba +; COMM-NEXT: .word 100 // 0x64 +; COMM-NEXT: .word 0 // 0x0 +; COMM-NEXT: .word 0 // 0x0 ;; For global variable @val ;; The section name remains `.rodata.cst32` without hotness prefix because ;; the variable has external linkage and not analyzed. Compiler need symbolized ;; data access profiles to annotate such global variables' hotness. -; CHECK: .section .rodata.cst32,"aM",@progbits,32 -; CHECK-NEXT: .globl val +; COMM: .section .rodata.cst32,"aM",@progbits,32 +; COMM-NEXT: .globl val define i32 @cold_func(double %x, <16 x i8> %a, <16 x i8> %b) !prof !16 { %2 = tail call i32 (...) @func_taking_arbitrary_param(double 6.800000e-01) diff --git a/llvm/test/CodeGen/AArch64/jump-table-partition.ll b/llvm/test/CodeGen/AArch64/jump-table-partition.ll index 47a7aa5..e6eea5d1 100644 --- a/llvm/test/CodeGen/AArch64/jump-table-partition.ll +++ b/llvm/test/CodeGen/AArch64/jump-table-partition.ll @@ -7,17 +7,24 @@ ; The static-data-splitter pass doesn't run. ; RUN: llc -mtriple=aarch64-unknown-linux-gnu -function-sections=true \ ; RUN: -aarch64-enable-atomic-cfg-tidy=false -aarch64-min-jump-table-entries=2 \ -; RUN: -unique-section-names=true %s -o - 2>&1 | FileCheck %s --check-prefixes=DEFAULT +; RUN: -unique-section-names=true %s -o - 2>&1 | FileCheck %s --check-prefixes=DEFAULT,COMM + +; Repeat the command with -preserve-hot-data-section-prefix=false +; RUN: llc -mtriple=aarch64-unknown-linux-gnu -function-sections=true \ +; RUN: -aarch64-enable-atomic-cfg-tidy=false -aarch64-min-jump-table-entries=2 \ +; RUN: -preserve-hot-data-section-prefix=false \ +; RUN: -unique-section-names=true %s -o - 2>&1 | FileCheck %s --check-prefixes=DEFNOHOT,COMM ; DEFAULT: .section .rodata.hot.foo,"a",@progbits -; DEFAULT: .LJTI0_0: -; DEFAULT: .LJTI0_1: -; DEFAULT: .LJTI0_2: -; DEFAULT: .LJTI0_3: -; DEFAULT: .section .rodata.func_without_profile,"a",@progbits -; DEFAULT: .LJTI1_0: -; DEFAULT: .section .rodata.bar_prefix.bar,"a",@progbits -; DEFAULT: .LJTI2_0 +; DEFNOHOT: .section .rodata.foo,"a",@progbits +; COMM: .LJTI0_0: +; COMM: .LJTI0_1: +; COMM: .LJTI0_2: +; COMM: .LJTI0_3: +; COMM: .section .rodata.func_without_profile,"a",@progbits +; COMM: .LJTI1_0: +; COMM: .section .rodata.bar_prefix.bar,"a",@progbits +; COMM: .LJTI2_0 ; Test that section names are uniqufied by numbers but not function names with ; {-function-sections, -unique-section-names=false}. Specifically, @foo jump @@ -40,6 +47,14 @@ ; RUN: -aarch64-enable-atomic-cfg-tidy=false -aarch64-min-jump-table-entries=2 \ ; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=FUNCLESS,JT +;; Repeat the commands above with -preserve-hot-data-section-prefix=false +; RUN: llc -mtriple=aarch64-unknown-linux-gnu -partition-static-data-sections \ +; RUN: -function-sections -unique-section-names=false \ +; RUN: -preserve-hot-data-section-prefix=false \ +; RUN: -aarch64-enable-atomic-cfg-tidy=false -aarch64-min-jump-table-entries=2 \ +; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=NOHOT,JT + + 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 = "aarch64-unknown-linux-gnu" @@ -58,6 +73,7 @@ target triple = "aarch64-unknown-linux-gnu" ; NUM: .section .rodata.hot.,"a",@progbits,unique,2 ; FUNC: .section .rodata.hot.foo,"a",@progbits ; FUNCLESS: .section .rodata.hot.,"a",@progbits +; NOHOT: .section .rodata,"a",@progbits ; JT: .LJTI0_0: ; JT: .LJTI0_2: ; NUM: .section .rodata.unlikely.,"a",@progbits,unique,3 diff --git a/llvm/test/CodeGen/X86/global-variable-partition.ll b/llvm/test/CodeGen/X86/global-variable-partition.ll index ce06d17..a60f56a 100644 --- a/llvm/test/CodeGen/X86/global-variable-partition.ll +++ b/llvm/test/CodeGen/X86/global-variable-partition.ll @@ -29,11 +29,33 @@ target triple = "x86_64-unknown-linux-gnu" ; RUN: -data-sections=false -unique-section-names=false \ ; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=AGG,COMMON --dump-input=always +;; Repeat the commands above with '-preserve-hot-data-section-prefix=false' + +; RUN: llc -mtriple=x86_64-unknown-linux-gnu -relocation-model=pic \ +; RUN: -partition-static-data-sections=true \ +; RUN: -data-sections=true -unique-section-names=false \ +; RUN: -preserve-hot-data-section-prefix=false \ +; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=COMMON,NOHOT,MUT --dump-input=always + +; RUN: llc -mtriple=x86_64-unknown-linux-gnu -relocation-model=pic \ +; RUN: -partition-static-data-sections=true \ +; RUN: -data-sections=true -unique-section-names=false \ +; RUN: -preserve-hot-data-section-prefix=false \ +; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=COMMON,NOHOT,MUT --dump-input=always + +; RUN: llc -mtriple=x86_64-unknown-linux-gnu -relocation-model=pic \ +; RUN: -partition-static-data-sections=true \ +; RUN: -data-sections=false -unique-section-names=false \ +; RUN: -preserve-hot-data-section-prefix=false \ +; RUN: %s -o - 2>&1 | FileCheck %s --check-prefixes=COMMON,NOHOT --dump-input=always + + ; For @.str and @.str.1 ; COMMON: .type .L.str,@object ; SYM-NEXT: .section .rodata.str1.1.hot. ; UNIQ-NEXT: .section .rodata.str1.1.hot.,"aMS",@progbits,1 ; AGG-NEXT: .section .rodata.str1.1.hot +; NOHOT: .section .rodata.str1.1,"aMS",@progbits,1 ; COMMON-NEXT: .L.str: ; COMMON-NEXT: "hot\t" ; COMMON: .L.str.1: @@ -44,24 +66,32 @@ target triple = "x86_64-unknown-linux-gnu" ; SYM-NEXT: .section .data.rel.ro.hot.hot_relro_array ; UNIQ-NEXT: .section .data.rel.ro.hot.,"aw",@progbits,unique,1 ; AGG-NEXT: .section .data.rel.ro.hot.,"aw",@progbits +; NOHOT: .section .data.rel.ro,"aw",@progbits ; For @hot_data, which is accessed by {cold_func, unprofiled_func, hot_func}. ; COMMON: .type hot_data,@object ; SYM-NEXT: .section .data.hot.hot_data,"aw",@progbits ; UNIQ-NEXT: .section .data.hot.,"aw",@progbits,unique,2 ; AGG-NEXT: .section .data.hot.,"aw",@progbits +; The `.section` directive is omitted for .data with -unique-section-names=false. +; See MCSectionELF::shouldOmitSectionDirective for the implementation details. +; MUT: .section .data,"aw" ; For @hot_bss, which is accessed by {unprofiled_func, hot_func}. ; COMMON: .type hot_bss,@object ; SYM-NEXT: .section .bss.hot.hot_bss,"aw",@nobits ; UNIQ-NEXT: .section .bss.hot.,"aw",@nobits,unique,3 ; AGG-NEXT: .section .bss.hot.,"aw",@nobits +; The `.section` directive is omitted for .bss with -unique-section-names=false. +; See MCSectionELF::shouldOmitSectionDirective for the implementation details. +; MUT: .section .bss,"aw" ; For @.str.2 ; COMMON: .type .L.str.2,@object ; SYM-NEXT: .section .rodata.str1.1.unlikely.,"aMS",@progbits,1 ; UNIQ-NEXT: .section .rodata.str1.1.unlikely.,"aMS",@progbits,1 ; AGG-NEXT: .section .rodata.str1.1.unlikely.,"aMS",@progbits,1 +; NOHOT: .section .rodata.str1.1.unlikely.,"aMS",@progbits,1 ; COMMON-NEXT: .L.str.2: ; COMMON-NEXT: "cold%d\t%d\t%d\n" @@ -70,12 +100,14 @@ target triple = "x86_64-unknown-linux-gnu" ; SYM-NEXT: .section .bss.unlikely.cold_bss,"aw",@nobits ; UNIQ-NEXT: .section .bss.unlikely.,"aw",@nobits,unique,4 ; AGG-NEXT: .section .bss.unlikely.,"aw",@nobits +; NOHOT: .section .bss.unlikely.,"aw",@nobits ; For @cold_data ; COMMON: .type cold_data,@object ; SYM-NEXT: .section .data.unlikely.cold_data,"aw",@progbits ; UNIQ-NEXT: .section .data.unlikely.,"aw",@progbits,unique,5 ; AGG-NEXT: .section .data.unlikely.,"aw",@progbits +; NOHOT: .section .data.unlikely.,"aw",@progbits ; For @cold_data_custom_foo_section ; It has an explicit section 'foo' and shouldn't have hot or unlikely suffix. @@ -83,12 +115,14 @@ target triple = "x86_64-unknown-linux-gnu" ; SYM-NEXT: .section foo,"aw",@progbits ; UNIQ-NEXT: .section foo,"aw",@progbits ; AGG-NEXT: .section foo,"aw",@progbits +; NOHOT: .section foo,"aw",@progbits ; For @cold_relro_array ; COMMON: .type cold_relro_array,@object ; SYM-NEXT: .section .data.rel.ro.unlikely.cold_relro_array,"aw",@progbits ; UNIQ-NEXT: .section .data.rel.ro.unlikely.,"aw",@progbits,unique,6 ; AGG-NEXT: .section .data.rel.ro.unlikely.,"aw",@progbits +; NOHOT: .section .data.rel.ro.unlikely.,"aw",@progbits ; Currently static-data-splitter only analyzes access from code. ; @bss2 and @data3 are indirectly accessed by code through @hot_relro_array @@ -99,12 +133,14 @@ target triple = "x86_64-unknown-linux-gnu" ; SYM-NEXT: .section .bss.unlikely.bss2,"aw",@nobits ; UNIQ-NEXT: .section .bss.unlikely.,"aw",@nobits,unique,7 ; AGG-NEXT: .section .bss.unlikely.,"aw",@nobits +; NOHOT: .section .bss.unlikely.,"aw",@nobits ; For @data3 ; COMMON: .type data3,@object ; SYM-NEXT: .section .data.unlikely.data3,"aw",@progbits ; UNIQ-NEXT: .section .data.unlikely.,"aw",@progbits,unique,8 ; AGG-NEXT: .section .data.unlikely.,"aw",@progbits +; NOHOT: .section .data.unlikely.,"aw",@progbits ; For @data_with_unknown_hotness ; SYM: .type .Ldata_with_unknown_hotness,@object # @data_with_unknown_hotness @@ -113,6 +149,7 @@ target triple = "x86_64-unknown-linux-gnu" ; The `.section` directive is omitted for .data with -unique-section-names=false. ; See MCSectionELF::shouldOmitSectionDirective for the implementation details. ; AGG: .data +; NOHOT: .data ; COMMON: .Ldata_with_unknown_hotness: ; For @hot_data_custom_bar_section @@ -122,6 +159,7 @@ target triple = "x86_64-unknown-linux-gnu" ; SYM: hot_data_custom_bar_section ; UNIQ: .section bar,"aw",@progbits ; AGG: .section bar,"aw",@progbits +; NOHOT: .section bar,"aw",@progbits @.str = private unnamed_addr constant [5 x i8] c"hot\09\00", align 1 @.str.1 = private unnamed_addr constant [10 x i8] c"%d\09%d\09%d\0A\00", align 1 |