Lines Matching full:llvm
1 //===--- CodeGenPGO.cpp - PGO Instrumentation for LLVM CodeGen --*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
18 #include "llvm/IR/MDBuilder.h"
19 #include "llvm/ProfileData/InstrProfReader.h"
20 #include "llvm/Support/Endian.h"
21 #include "llvm/Support/FileSystem.h"
22 #include "llvm/Support/MD5.h"
27 void CodeGenPGO::setFuncName(llvm::Function *Fn) {
52 static llvm::Function *getRegisterFunc(CodeGenModule &CGM) {
56 static llvm::BasicBlock *getOrInsertRegisterBB(CodeGenModule &CGM) {
62 if (llvm::Function *RegisterF = getRegisterFunc(CGM))
66 auto *VoidTy = llvm::Type::getVoidTy(CGM.getLLVMContext());
67 auto *RegisterFTy = llvm::FunctionType::get(VoidTy, false);
68 auto *RegisterF = llvm::Function::Create(RegisterFTy,
69 llvm::GlobalValue::InternalLinkage,
74 RegisterF->addFnAttr(llvm::Attribute::NoRedZone);
77 auto *BB = llvm::BasicBlock::Create(CGM.getLLVMContext(), "", RegisterF);
83 static llvm::Constant *getOrInsertRuntimeRegister(CodeGenModule &CGM) {
84 auto *VoidTy = llvm::Type::getVoidTy(CGM.getLLVMContext());
85 auto *VoidPtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext());
86 auto *RuntimeRegisterTy = llvm::FunctionType::get(VoidTy, VoidPtrTy, false);
107 llvm::GlobalVariable *CodeGenPGO::buildDataVar() {
109 llvm::LLVMContext &Ctx = CGM.getLLVMContext();
110 auto *VarName = llvm::ConstantDataArray::getString(Ctx, getFuncName(),
112 auto *Name = new llvm::GlobalVariable(CGM.getModule(), VarName->getType(),
119 auto *Int32Ty = llvm::Type::getInt32Ty(Ctx);
120 auto *Int64Ty = llvm::Type::getInt64Ty(Ctx);
121 auto *Int8PtrTy = llvm::Type::getInt8PtrTy(Ctx);
122 auto *Int64PtrTy = llvm::Type::getInt64PtrTy(Ctx);
123 llvm::Type *DataTypes[] = {
126 auto *DataTy = llvm::StructType::get(Ctx, makeArrayRef(DataTypes));
127 llvm::Constant *DataVals[] = {
128 llvm::ConstantInt::get(Int32Ty, getFuncName().size()),
129 llvm::ConstantInt::get(Int32Ty, NumRegionCounters),
130 llvm::ConstantInt::get(Int64Ty, FunctionHash),
131 llvm::ConstantExpr::getBitCast(Name, Int8PtrTy),
132 llvm::ConstantExpr::getBitCast(RegionCounters, Int64PtrTy)
135 new llvm::GlobalVariable(CGM.getModule(), DataTy, true, VarLinkage,
136 llvm::ConstantStruct::get(DataTy, DataVals),
146 if (!llvm::GlobalValue::isLocalLinkage(VarLinkage)) {
147 Name->setVisibility(llvm::GlobalValue::HiddenVisibility);
148 Data->setVisibility(llvm::GlobalValue::HiddenVisibility);
149 RegionCounters->setVisibility(llvm::GlobalValue::HiddenVisibility);
169 auto *VoidPtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext());
174 llvm::Function *CodeGenPGO::emitInitialization(CodeGenModule &CGM) {
182 llvm::Constant *RegisterF = getRegisterFunc(CGM);
187 auto *VoidTy = llvm::Type::getVoidTy(CGM.getLLVMContext());
188 auto *F = llvm::Function::Create(llvm::FunctionType::get(VoidTy, false),
189 llvm::GlobalValue::InternalLinkage,
192 F->addFnAttr(llvm::Attribute::NoInline);
194 F->addFnAttr(llvm::Attribute::NoRedZone);
197 CGBuilderTy Builder(llvm::BasicBlock::Create(CGM.getLLVMContext(), "", F));
218 llvm::MD5 MD5;
273 llvm::DenseMap<const Stmt *, unsigned> &CounterMap;
275 MapRegionCounters(llvm::DenseMap<const Stmt *, unsigned> &CounterMap)
367 llvm::DenseMap<const Stmt *, uint64_t> &CountMap;
377 ComputeRegionCounts(llvm::DenseMap<const Stmt *, uint64_t> &CountMap,
751 using namespace llvm::support;
753 MD5.update(llvm::makeArrayRef((uint8_t *)&Swapped, sizeof(Swapped)));
775 llvm::MD5::MD5Result Result;
777 using namespace llvm::support;
788 llvm::LLVMContext &Ctx = CGM.getLLVMContext();
789 auto *Int32Ty = llvm::Type::getInt32Ty(Ctx);
790 auto *Var = new llvm::GlobalVariable(CGM.getModule(), Int32Ty, false,
791 llvm::GlobalValue::ExternalLinkage,
795 auto *User = llvm::Function::Create(llvm::FunctionType::get(Int32Ty, false),
796 llvm::GlobalValue::LinkOnceODRLinkage,
798 User->addFnAttr(llvm::Attribute::NoInline);
800 User->addFnAttr(llvm::Attribute::NoRedZone);
801 CGBuilderTy Builder(llvm::BasicBlock::Create(CGM.getLLVMContext(), "", User));
810 void CodeGenPGO::assignRegionCounters(const Decl *D, llvm::Function *Fn) {
812 llvm::IndexedInstrProfReader *PGOReader = CGM.getPGOReader();
824 case llvm::GlobalValue::ExternalWeakLinkage:
825 VarLinkage = llvm::GlobalValue::LinkOnceAnyLinkage;
827 case llvm::GlobalValue::AvailableExternallyLinkage:
828 VarLinkage = llvm::GlobalValue::LinkOnceODRLinkage;
848 RegionCounterMap.reset(new llvm::DenseMap<const Stmt *, unsigned>);
864 StmtCountMap.reset(new llvm::DenseMap<const Stmt *, uint64_t>);
877 CodeGenPGO::applyFunctionAttributes(llvm::IndexedInstrProfReader *PGOReader,
878 llvm::Function *Fn) {
887 Fn->addFnAttr(llvm::Attribute::InlineHint);
891 llvm::Attribute::Cold);
895 llvm::LLVMContext &Ctx = CGM.getLLVMContext();
896 llvm::ArrayType *CounterTy = llvm::ArrayType::get(llvm::Type::getInt64Ty(Ctx),
899 new llvm::GlobalVariable(CGM.getModule(), CounterTy, false, VarLinkage,
900 llvm::Constant::getNullValue(CounterTy),
909 llvm::Value *Addr =
911 llvm::Value *Count = Builder.CreateLoad(Addr, "pgocount");
916 void CodeGenPGO::loadRegionCounts(llvm::IndexedInstrProfReader *PGOReader,
962 llvm::MDNode *CodeGenPGO::createBranchWeights(uint64_t TrueCount,
971 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
976 llvm::MDNode *CodeGenPGO::createBranchWeights(ArrayRef<uint64_t> Weights) {
994 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
998 llvm::MDNode *CodeGenPGO::createLoopWeights(const Stmt *Cond,