simplify test. The next step is to add debug log
diff --git a/llvm/include/llvm/Analysis/StaticDataProfileInfo.h b/llvm/include/llvm/Analysis/StaticDataProfileInfo.h
index fbbc13a..5bd2ae1 100644
--- a/llvm/include/llvm/Analysis/StaticDataProfileInfo.h
+++ b/llvm/include/llvm/Analysis/StaticDataProfileInfo.h
@@ -10,6 +10,8 @@
namespace llvm {
+bool IsReservedGlobalVariable(const GlobalVariable &GV);
+
/// A class that holds the constants that represent static data and their
/// profile information and provides methods to operate on them.
class StaticDataProfileInfo {
diff --git a/llvm/lib/Analysis/StaticDataProfileInfo.cpp b/llvm/lib/Analysis/StaticDataProfileInfo.cpp
index 700f570..7f42d07 100644
--- a/llvm/lib/Analysis/StaticDataProfileInfo.cpp
+++ b/llvm/lib/Analysis/StaticDataProfileInfo.cpp
@@ -14,6 +14,10 @@
extern cl::opt<bool> AnnotateStaticDataSectionPrefix;
+bool llvm::IsReservedGlobalVariable(const GlobalVariable &GV) {
+ return GV.getName().starts_with("llvm.");
+}
+
void StaticDataProfileInfo::addConstantProfileCount(
const Constant *C, std::optional<uint64_t> Count) {
if (!Count) {
@@ -87,7 +91,8 @@
// Module flag `HasDataAccessProf` is 1 -> empty section prefix means
// unknown hotness except for string literals.
if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(C);
- GV && !GV->getName().starts_with(".str")) {
+ GV && !IsReservedGlobalVariable(*GV) &&
+ !GV->getName().starts_with(".str")) {
auto HotnessFromDAP = getSectionHotnessUsingDAP(GV->getSectionPrefix());
if (!Count) {
diff --git a/llvm/lib/CodeGen/StaticDataSplitter.cpp b/llvm/lib/CodeGen/StaticDataSplitter.cpp
index e22dc25..97aa833 100644
--- a/llvm/lib/CodeGen/StaticDataSplitter.cpp
+++ b/llvm/lib/CodeGen/StaticDataSplitter.cpp
@@ -133,8 +133,7 @@
// Skip 'llvm.'-prefixed global variables conservatively because they are
// often handled specially, and skip those not in static data
// sections.
- if (!GV || GV->getName().starts_with("llvm.") ||
- !inStaticDataSection(*GV, TM))
+ if (!GV || llvm::IsReservedGlobalVariable(*GV) || !inStaticDataSection(*GV, TM))
return nullptr;
return GV;
}
diff --git a/llvm/test/CodeGen/X86/global-variable-partition-dap.ll b/llvm/test/CodeGen/X86/global-variable-partition-dap.ll
index f987162..22788a2 100644
--- a/llvm/test/CodeGen/X86/global-variable-partition-dap.ll
+++ b/llvm/test/CodeGen/X86/global-variable-partition-dap.ll
@@ -2,7 +2,7 @@
target triple = "x86_64-unknown-linux-gnu"
;; Comments for RUN command options
-; 1. `-relocation-model=pic` -> `hot_relro_array` and `cold_relro_array` are
+; 1. `-relocation-model=pic` -> `relro_var` is
; placed in the .data.rel.ro-prefixed section.
; 2. `-data-sections=true -unique-section-names=false` -> data sections are
; uniqufied by variable names.
@@ -10,120 +10,83 @@
; 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: %s -o - 2>&1 | FileCheck %s --check-prefixes=UNIQ,COMMON --dump-input=always
+; RUN: %s -o - 2>&1 | FileCheck %s --dump-input=always
; For @.str and @.str.1
-; COMMON: .type .L.str,@object
-; UNIQ-NEXT: .section .rodata.str1.1.hot.,"aMS",@progbits,1
-; COMMON-NEXT: .L.str:
-; COMMON-NEXT: "hot\t"
-; COMMON: .L.str.1:
-; COMMON-NEXT: "%d\t%d\t%d\n"
-
-; For @hot_relro_array
-; COMMON: .type hot_relro_array,@object
-; UNIQ-NEXT: .section .data.rel.ro.hot.,"aw",@progbits,unique,1
-
-; For @external_hot_data, which is accessed by {cold_func, unprofiled_func, hot_func}.
-; COMMON: .type external_hot_data,@object
-; UNIQ-NEXT: .section .data.hot.,"aw",@progbits,unique,2
-
-; For @hot_bss, which is accessed by {unprofiled_func, hot_func}.
-; COMMON: .type hot_bss,@object
-; UNIQ-NEXT: .section .bss.hot.,"aw",@nobits,unique,3
+; CHECK: .type .L.str,@object
+; CHECK-NEXT: .section .rodata.str1.1.hot.,"aMS",@progbits,1
+; CHECK-NEXT: .L.str:
+; CHECK-NEXT: "1234"
+; CHECK: .type .str.1,@object
+; CHECK: .str.1:
+; CHECK-NEXT: "abcde"
; For @.str.2
-; COMMON: .type .L.str.2,@object
-; UNIQ-NEXT: .section .rodata.str1.1.unlikely.,"aMS",@progbits,1
-; COMMON-NEXT: .L.str.2:
-; COMMON-NEXT: "cold%d\t%d\t%d\n"
+; CHECK: .type .str.2,@object
+; CHECK-NEXT: .section .rodata.str1.1,"aMS",@progbits
+; CHECK-NEXT: .globl .str.2
+; CHECK-NEXT: .str.2:
+; CHECK-NEXT: "beef"
+@.str = private unnamed_addr constant [5 x i8] c"1234\00", align 1
+@.str.1 = internal unnamed_addr constant [6 x i8] c"abcde\00"
+@.str.2 = unnamed_addr constant [5 x i8] c"beef\00", align 1
-; For @cold_bss
-; COMMON: .type cold_bss,@object
-; UNIQ-NEXT: .section .bss.unlikely.,"aw",@nobits,unique,4
+; CHECK: .type relro_var,@object
+; CHECK-NEXT: .section .data.rel.ro,"aw",@progbits,unique,1
-; For @cold_data
-; COMMON: .type cold_data,@object
-; UNIQ-NEXT: .section .data.unlikely.,"aw",@progbits,unique,5
+; CHECK: .type external_hot_data,@object
+; CHECK-NEXT: .section .data.hot.,"aw",@progbits,unique,2
-; For @cold_data_custom_foo_section
-; It has an explicit section 'foo' and shouldn't have hot or unlikely suffix.
-; COMMON: .type cold_data_custom_foo_section,@object
-; UNIQ-NEXT: .section foo,"aw",@progbits
+; CHECK: .type hot_bss,@object
+; CHECK-NEXT: .section .bss.hot.,"aw",@nobits,unique,3
-; For @cold_relro_array
-; COMMON: .type cold_relro_array,@object
-; UNIQ-NEXT: .section .data.rel.ro.unlikely.,"aw",@progbits,unique,6
-
-
-; @bss2 and @data3 are indirectly accessed via @hot_relro_array and
-; @cold_relro_array, and actually hot due to accesses via @hot_relro_array.
-; Under the hood, the static data splitter pass analyzes accesses from code but
-; won't aggressively propgate the hotness of @hot_relro_array into the array
-; elements -- instead, this pass reconciles the hotness information from both
-; global variable section prefix and PGO counters.
-
-; @bss2 has a section prefix 'hot' in the IR. StaticDataProfileInfo reconciles
-; it into a hot prefix.
-; COMMON: .type bss2,@object
-; UNIQ-NEXT: .section .bss.hot.,"aw",@nobits,unique,7
-
-; @data3 doesn't have data access profile coverage and thereby doesn't have a
-; section prefix. PGO counter analysis categorizes it as cold, so it will have
-; section name `.data.unlikely`.
-; COMMON: .type data3,@object
-; UNIQ-NEXT: .section .data,"aw",@progbits,unique,8
-
-; For @data_with_unknown_hotness
-; COMMON: .type .Ldata_with_unknown_hotness,@object # @data_with_unknown_hotness
-; UNIQ: .section .data,"aw",@progbits,unique,9
-
-; For @hot_data_custom_bar_section
-; It has an explicit section attribute 'var' and shouldn't have hot or unlikely suffix.
-; COMMON: .type hot_data_custom_bar_section,@object
-; UNIQ: .section bar,"aw",@progbits
-
-; For @external_cold_bss
-; COMMON: .type external_cold_bss,@object
-; UNIQ-NEXT: .section .bss,"aw",@nobits,unique,
-
-@.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
-@hot_relro_array = internal constant [2 x ptr] [ptr @bss2, ptr @data3]
+@relro_var = constant [2 x ptr] [ptr @bss2, ptr @data3]
@external_hot_data = global i32 5, !section_prefix !17
@hot_bss = internal global i32 0
-@.str.2 = private unnamed_addr constant [14 x i8] c"cold%d\09%d\09%d\0A\00", align 1
+
+;; Both section prefix and PGO counters indicate @cold_bss and @cold_data are
+;; rarely accesed.
+; CHECK: .type cold_bss,@object
+; CHECK-NEXT: .section .bss.unlikely.,"aw",@nobits,unique,4
+; CHECK: .type cold_data,@object
+; CHECK-NEXT: .section .data.unlikely.,"aw",@progbits,unique,5
@cold_bss = internal global i32 0, !section_prefix !18
@cold_data = internal global i32 4, !section_prefix !18
-@cold_data_custom_foo_section = internal global i32 100, section "foo"
-@cold_relro_array = internal constant [2 x ptr] [ptr @data3, ptr @bss2], !section_prefix !18
+
+;; @bss2 has a section prefix 'hot' in the IR. StaticDataProfileInfo reconciles
+;; it into a hot prefix.
+; CHECK: .type bss2,@object
+; CHECK-NEXT: .section .bss.hot.,"aw",@nobits,unique,6
@bss2 = internal global i32 0, !section_prefix !17
+
+;; Since `HasDataAccessProf` is true, data without a section prefix is
+;; conservatively categorized as unknown (e.g., from incremental source code)
+;; rather than cold.
+; CHECK: .type data3,@object
+; CHECK-NEXT: .section .data,"aw",@progbits,unique,7
@data3 = internal global i32 3
-@data_with_unknown_hotness = private global i32 5
+
+;; These sections have custom names, so they won't be labeled as .hot or .unlikely.
+; CHECK: .type hot_data_custom_bar_section,@object
+; CHECK-NEXT: .section bar,"aw"
+; CHECK: .type cold_data_custom_foo_section,@object
+; CHECK-NEXT: .section foo,"aw"
@hot_data_custom_bar_section = internal global i32 101 #0
-@external_cold_bss = global i32 0
+@cold_data_custom_foo_section = internal global i32 100, section "foo"
define void @cold_func(i32 %0) !prof !15 {
%2 = load i32, ptr @cold_bss
%3 = load i32, ptr @cold_data
- %4 = srem i32 %0, 2
- %5 = sext i32 %4 to i64
- %6 = getelementptr inbounds [2 x ptr], ptr @cold_relro_array, i64 0, i64 %5
- %7 = load ptr, ptr %6
- %8 = load i32, ptr %7
- %9 = load i32, ptr @data_with_unknown_hotness
%11 = load i32, ptr @external_hot_data
%12 = load i32, ptr @cold_data_custom_foo_section
- %val = load i32, ptr @external_cold_bss
- %13 = call i32 (...) @func_taking_arbitrary_param(ptr @.str.2, i32 %2, i32 %3, i32 %8, i32 %9, i32 %11, i32 %12, i32 %val)
+ %13 = call i32 (...) @func_taking_arbitrary_param(ptr @.str.2, i32 %2, i32 %3, i32 %11, i32 %12)
ret void
}
define i32 @unprofiled_func() {
- %a = load i32, ptr @data_with_unknown_hotness
%b = load i32, ptr @external_hot_data
%c = load i32, ptr @hot_bss
- %ret = call i32 (...) @func_taking_arbitrary_param(i32 %a, i32 %b, i32 %c)
+ %ret = call i32 (...) @func_taking_arbitrary_param(i32 %b, i32 %c)
ret i32 %ret
}
@@ -131,7 +94,7 @@
%2 = call i32 (...) @func_taking_arbitrary_param(ptr @.str)
%3 = srem i32 %0, 2
%4 = sext i32 %3 to i64
- %5 = getelementptr inbounds [2 x ptr], ptr @hot_relro_array, i64 0, i64 %4
+ %5 = getelementptr inbounds [2 x ptr], ptr @relro_var, i64 0, i64 %4
%6 = load ptr, ptr %5
%7 = load i32, ptr %6
%8 = load i32, ptr @external_hot_data
@@ -166,4 +129,3 @@
!16 = !{!"branch_weights", i32 1, i32 99999}
!17 = !{!"section_prefix", !"hot"}
!18 = !{!"section_prefix", !"unlikely"}
-