From e6a918ea937465483ad942001a220ee6742aea4f Mon Sep 17 00:00:00 2001 From: Pavel Samolysov Date: Fri, 31 May 2024 05:57:41 +0300 Subject: [PATCH] Revert "[PGO] Generate __llvm_profile_raw_version only when instrumented" This reverts commit 5d5ead1dbd9aac486aada3acf81cc09464ab7bae. --- .../Instrumentation/PGOInstrumentation.cpp | 20 +++++++------------ .../PGOProfile/declarations_only.ll | 7 ++++++- .../PGOProfile/global_variables_only.ll | 5 ++++- .../PGOProfile/no_global_variables.ll | 15 -------------- .../PGOInstrumentationTest.cpp | 3 ++- 5 files changed, 19 insertions(+), 31 deletions(-) delete mode 100644 llvm/test/Transforms/PGOProfile/no_global_variables.ll diff --git a/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp b/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp index ff94fc98d01174..fbf9688ed2d1eb 100644 --- a/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp +++ b/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp @@ -405,14 +405,9 @@ static GlobalVariable *createIRLevelProfileFlagVar(Module &M, bool IsCS) { ProfileVersion |= VARIANT_MASK_BYTE_COVERAGE; if (PGOTemporalInstrumentation) ProfileVersion |= VARIANT_MASK_TEMPORAL_PROF; - assert(!M.global_empty() && - "If a module was instrumented, there must be defined global variables " - "at least for the counters."); - auto *InsertionPoint = &*M.global_begin(); - auto *IRLevelVersionVariable = new GlobalVariable( + auto IRLevelVersionVariable = new GlobalVariable( M, IntTy64, true, GlobalValue::WeakAnyLinkage, - Constant::getIntegerValue(IntTy64, APInt(64, ProfileVersion)), VarName, - InsertionPoint); + Constant::getIntegerValue(IntTy64, APInt(64, ProfileVersion)), VarName); IRLevelVersionVariable->setVisibility(GlobalValue::HiddenVisibility); Triple TT(M.getTargetTriple()); if (TT.supportsCOMDAT()) { @@ -1834,6 +1829,11 @@ static bool InstrumentAllFunctions( Module &M, function_ref LookupTLI, function_ref LookupBPI, function_ref LookupBFI, bool IsCS) { + // For the context-sensitve instrumentation, we should have a separated pass + // (before LTO/ThinLTO linking) to create these variables. + if (!IsCS && !PGOCtxProfLoweringPass::isContextualIRPGOEnabled()) + createIRLevelProfileFlagVar(M, /*IsCS=*/false); + Triple TT(M.getTargetTriple()); LLVMContext &Ctx = M.getContext(); if (!TT.isOSBinFormatELF() && EnableVTableValueProfiling) @@ -1855,15 +1855,9 @@ static bool InstrumentAllFunctions( instrumentOneFunc(F, &M, TLI, BPI, BFI, ComdatMembers, IsCS); AnythingInstrumented = true; } - if (!AnythingInstrumented) return false; - // For the context-sensitve instrumentation, we should have a separated pass - // (before LTO/ThinLTO linking) to create these variables. - if (!IsCS && !PGOCtxProfLoweringPass::isContextualIRPGOEnabled()) - createIRLevelProfileFlagVar(M, /*IsCS=*/false); - return true; } diff --git a/llvm/test/Transforms/PGOProfile/declarations_only.ll b/llvm/test/Transforms/PGOProfile/declarations_only.ll index 7a975725410c95..e7208fc264c7cb 100644 --- a/llvm/test/Transforms/PGOProfile/declarations_only.ll +++ b/llvm/test/Transforms/PGOProfile/declarations_only.ll @@ -1,8 +1,13 @@ -; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --implicit-check-not='__llvm_profile_raw_version' +; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN --check-prefix=GEN-COMDAT target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" +; GEN-COMDAT: $__llvm_profile_raw_version = comdat any +; GEN-COMDAT: @__llvm_profile_raw_version = hidden constant i64 {{[0-9]+}}, comdat +; GEN-NOT: @__profn_test_1 = private constant [6 x i8] c"test_1" +; GEN-NOT: @__profn_test_2 = private constant [6 x i8] c"test_2" + declare i32 @test_1(i32 %i) declare i32 @test_2(i32 %i) diff --git a/llvm/test/Transforms/PGOProfile/global_variables_only.ll b/llvm/test/Transforms/PGOProfile/global_variables_only.ll index 46628bfafe534a..3bfa29af5d34f0 100644 --- a/llvm/test/Transforms/PGOProfile/global_variables_only.ll +++ b/llvm/test/Transforms/PGOProfile/global_variables_only.ll @@ -1,6 +1,9 @@ -; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --implicit-check-not='__llvm_profile_raw_version' +; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN-COMDAT target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" +; GEN-COMDAT: $__llvm_profile_raw_version = comdat any +; GEN-COMDAT: @__llvm_profile_raw_version = hidden constant i64 {{[0-9]+}}, comdat + @var = internal unnamed_addr global [35 x ptr] zeroinitializer, align 16 diff --git a/llvm/test/Transforms/PGOProfile/no_global_variables.ll b/llvm/test/Transforms/PGOProfile/no_global_variables.ll deleted file mode 100644 index 0faa2f35274c9d..00000000000000 --- a/llvm/test/Transforms/PGOProfile/no_global_variables.ll +++ /dev/null @@ -1,15 +0,0 @@ -; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN-COMDAT -target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" -; GEN-COMDAT: $__llvm_profile_raw_version = comdat any -; GEN-COMDAT: @__llvm_profile_raw_version = hidden constant i64 {{[0-9]+}}, comdat - -define i32 @test_1(i32 %i) { -entry: - ret i32 0 -} - -define i32 @test_2(i32 %i) { -entry: - ret i32 1 -} diff --git a/llvm/unittests/Transforms/Instrumentation/PGOInstrumentationTest.cpp b/llvm/unittests/Transforms/Instrumentation/PGOInstrumentationTest.cpp index 01d17c5059a1a7..cbeaa501d4d88b 100644 --- a/llvm/unittests/Transforms/Instrumentation/PGOInstrumentationTest.cpp +++ b/llvm/unittests/Transforms/Instrumentation/PGOInstrumentationTest.cpp @@ -217,7 +217,8 @@ TEST_P(PGOInstrumentationGenIgnoreTest, NotInstrumented) { const auto *IRInstrVar = M->getNamedGlobal(INSTR_PROF_QUOTE(INSTR_PROF_RAW_VERSION_VAR)); - EXPECT_THAT(IRInstrVar, IsNull()); + EXPECT_THAT(IRInstrVar, NotNull()); + EXPECT_FALSE(IRInstrVar->isDeclaration()); } } // end anonymous namespace