Index: llvm/include/llvm/Transforms/Utils/SampleProfileLoaderBaseUtil.h =================================================================== --- llvm/include/llvm/Transforms/Utils/SampleProfileLoaderBaseUtil.h +++ llvm/include/llvm/Transforms/Utils/SampleProfileLoaderBaseUtil.h @@ -19,10 +19,12 @@ #include "llvm/Analysis/ProfileSummaryInfo.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/CFG.h" +#include "llvm/IR/Constants.h" #include "llvm/IR/DebugLoc.h" #include "llvm/IR/Function.h" #include "llvm/ProfileData/SampleProf.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Transforms/Utils/ModuleUtils.h" namespace llvm { using namespace sampleprof; @@ -92,6 +94,10 @@ /// Return true if the given callsite is hot wrt to hot cutoff threshold. bool callsiteIsHot(const FunctionSamples *CallsiteFS, ProfileSummaryInfo *PSI, bool ProfAccForSymsInList); + +/// Create a global variable to flag that FSDiscriminators are used. +void createFSDiscriminatorVariable(Module *M); + } // end of namespace sampleprofutil } // end of namespace llvm Index: llvm/lib/CodeGen/MIRFSDiscriminator.cpp =================================================================== --- llvm/lib/CodeGen/MIRFSDiscriminator.cpp +++ llvm/lib/CodeGen/MIRFSDiscriminator.cpp @@ -19,10 +19,12 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Transforms/Utils/SampleProfileLoaderBaseUtil.h" #include using namespace llvm; using namespace sampleprof; +using namespace sampleprofutil; #define DEBUG_TYPE "mirfs-discriminators" @@ -127,16 +129,7 @@ } if (Changed) { - Module *M = MF.getFunction().getParent(); - const char *FSDiscriminatorVar = "__llvm_fs_discriminator__"; - if (!M->getGlobalVariable(FSDiscriminatorVar)) { - auto &Context = M->getContext(); - // Create a global variable to flag that FSDiscriminators are used. - new GlobalVariable(*M, Type::getInt1Ty(Context), true, - GlobalValue::WeakAnyLinkage, - ConstantInt::getTrue(Context), FSDiscriminatorVar); - } - + createFSDiscriminatorVariable(MF.getFunction().getParent()); LLVM_DEBUG(dbgs() << "Num of FS Discriminators: " << NumNewD << "\n"); } Index: llvm/lib/Transforms/Utils/AddDiscriminators.cpp =================================================================== --- llvm/lib/Transforms/Utils/AddDiscriminators.cpp +++ llvm/lib/Transforms/Utils/AddDiscriminators.cpp @@ -70,9 +70,11 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Transforms/Utils.h" +#include "llvm/Transforms/Utils/SampleProfileLoaderBaseUtil.h" #include using namespace llvm; +using namespace sampleprofutil; #define DEBUG_TYPE "add-discriminators" @@ -172,6 +174,10 @@ if (NoDiscriminators || !F.getSubprogram()) return false; + // Create FSDiscriminatorVariable if flow sensitive discriminators are used. + if (EnableFSDiscriminator) + createFSDiscriminatorVariable(F.getParent()); + bool Changed = false; using Location = std::pair; Index: llvm/lib/Transforms/Utils/SampleProfileLoaderBaseUtil.cpp =================================================================== --- llvm/lib/Transforms/Utils/SampleProfileLoaderBaseUtil.cpp +++ llvm/lib/Transforms/Utils/SampleProfileLoaderBaseUtil.cpp @@ -159,5 +159,19 @@ return Total > 0 ? Used * 100 / Total : 100; } +/// Create a global variable to flag that FSDiscriminators are used. +void createFSDiscriminatorVariable(Module *M) { + const char *FSDiscriminatorVar = "__llvm_fs_discriminator__"; + if (M->getGlobalVariable(FSDiscriminatorVar)) + return; + + auto &Context = M->getContext(); + // Place this variable to llvm.used so it won't be GC'ed. + appendToUsed(*M, {new GlobalVariable(*M, Type::getInt1Ty(Context), true, + GlobalValue::WeakODRLinkage, + ConstantInt::getTrue(Context), + FSDiscriminatorVar)}); +} + } // end of namespace sampleprofutil } // end of namespace llvm