[llvm] r335306 - [Instrumentation] Add Call Graph Profile pass
Chandler Carruth via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 21 22:38:52 PDT 2018
Reverted in r335320.
On Thu, Jun 21, 2018 at 7:15 PM Michael Spencer <bigcheesegs at gmail.com>
wrote:
> That's fine with me. Thanks again for looking into this.
>
>
> On Thu, Jun 21, 2018, 6:56 PM Chandler Carruth <chandlerc at gmail.com>
> wrote:
>
>> I think I'm going ot have to revert this. I fixed the test failure, but
>> this patch is also causing us to leak memory.
>>
>> The embedded function analysis support in the legacy PM *really* doesn't
>> work well. In addition to breaking the '-debug-pass=Structure' output, it
>> also appears to leak memory.
>>
>> You can see the ASan leak reports here:
>>
>> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/6067/
>>
>> I'm not likely to have energy to debug this nasty part of the legacy PM.
>> Personally, I'd suggest just adding this to the new PM and skipping the
>> legacy PM. It doesn't seem worth the trouble. We're also *remarkably* close
>> to being ready to switch the defaults.
>>
>> On Thu, Jun 21, 2018 at 4:35 PM Michael J. Spencer via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: mspencer
>>> Date: Thu Jun 21 16:31:10 2018
>>> New Revision: 335306
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=335306&view=rev
>>> Log:
>>> [Instrumentation] Add Call Graph Profile pass
>>>
>>> This patch adds support for generating a call graph profile from Branch
>>> Frequency Info.
>>>
>>> The CGProfile module pass simply gets the block profile count for each
>>> BB and scans for call instructions. For each call instruction it adds an
>>> edge from the current function to the called function with the current BB
>>> block profile count as the weight.
>>>
>>> After scanning all the functions, it generates an appending module flag
>>> containing the data. The format looks like:
>>>
>>> !llvm.module.flags = !{!0}
>>>
>>> !0 = !{i32 5, !"CG Profile", !1}
>>> !1 = !{!2, !3, !4} ; List of edges
>>> !2 = !{void ()* @a, void ()* @b, i64 32} ; Edge from a to b with a
>>> weight of 32
>>> !3 = !{void (i1)* @freq, void ()* @a, i64 11}
>>> !4 = !{void (i1)* @freq, void ()* @b, i64 20}
>>>
>>> Differential Revision: https://reviews.llvm.org/D48105
>>>
>>> Added:
>>> llvm/trunk/lib/Transforms/Instrumentation/CGProfile.cpp
>>> llvm/trunk/test/Instrumentation/cgprofile.ll
>>> llvm/trunk/test/MC/ELF/cgprofile.ll
>>> llvm/trunk/test/Verifier/module-flags-cgprofile.ll
>>> Modified:
>>> llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
>>> llvm/trunk/include/llvm/InitializePasses.h
>>> llvm/trunk/include/llvm/LinkAllPasses.h
>>> llvm/trunk/include/llvm/Transforms/Instrumentation.h
>>> llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>>> llvm/trunk/lib/IR/Verifier.cpp
>>> llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
>>> llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt
>>> llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
>>>
>>> Modified: llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h?rev=335306&r1=335305&r2=335306&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
>>> (original)
>>> +++ llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h Thu
>>> Jun 21 16:31:10 2018
>>> @@ -36,11 +36,14 @@ class TargetLoweringObjectFileELF : publ
>>> protected:
>>> MCSymbolRefExpr::VariantKind PLTRelativeVariantKind =
>>> MCSymbolRefExpr::VK_None;
>>> + const TargetMachine *TM;
>>>
>>> public:
>>> TargetLoweringObjectFileELF() = default;
>>> ~TargetLoweringObjectFileELF() override = default;
>>>
>>> + void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
>>> +
>>> /// Emit Obj-C garbage collection and linker options.
>>> void emitModuleMetadata(MCStreamer &Streamer, Module &M) const
>>> override;
>>>
>>>
>>> Modified: llvm/trunk/include/llvm/InitializePasses.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=335306&r1=335305&r2=335306&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/InitializePasses.h (original)
>>> +++ llvm/trunk/include/llvm/InitializePasses.h Thu Jun 21 16:31:10 2018
>>> @@ -94,6 +94,7 @@ void initializeCFGViewerLegacyPassPass(P
>>> void initializeCFIInstrInserterPass(PassRegistry&);
>>> void initializeCFLAndersAAWrapperPassPass(PassRegistry&);
>>> void initializeCFLSteensAAWrapperPassPass(PassRegistry&);
>>> +void initializeCGProfilePassPass(PassRegistry&);
>>> void initializeCallGraphDOTPrinterPass(PassRegistry&);
>>> void initializeCallGraphPrinterLegacyPassPass(PassRegistry&);
>>> void initializeCallGraphViewerPass(PassRegistry&);
>>>
>>> Modified: llvm/trunk/include/llvm/LinkAllPasses.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LinkAllPasses.h?rev=335306&r1=335305&r2=335306&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/LinkAllPasses.h (original)
>>> +++ llvm/trunk/include/llvm/LinkAllPasses.h Thu Jun 21 16:31:10 2018
>>> @@ -80,6 +80,7 @@ namespace {
>>> (void) llvm::createCallGraphDOTPrinterPass();
>>> (void) llvm::createCallGraphViewerPass();
>>> (void) llvm::createCFGSimplificationPass();
>>> + (void) llvm::createCGProfilePass();
>>> (void) llvm::createCFLAndersAAWrapperPass();
>>> (void) llvm::createCFLSteensAAWrapperPass();
>>> (void) llvm::createStructurizeCFGPass();
>>>
>>> Modified: llvm/trunk/include/llvm/Transforms/Instrumentation.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Instrumentation.h?rev=335306&r1=335305&r2=335306&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Transforms/Instrumentation.h (original)
>>> +++ llvm/trunk/include/llvm/Transforms/Instrumentation.h Thu Jun 21
>>> 16:31:10 2018
>>> @@ -187,6 +187,8 @@ struct SanitizerCoverageOptions {
>>> ModulePass *createSanitizerCoverageModulePass(
>>> const SanitizerCoverageOptions &Options =
>>> SanitizerCoverageOptions());
>>>
>>> +ModulePass *createCGProfilePass();
>>> +
>>> /// Calculate what to divide by to scale counts.
>>> ///
>>> /// Given the maximum count, calculate a divisor that will scale all the
>>>
>>> Modified: llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp?rev=335306&r1=335305&r2=335306&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp Thu Jun 21
>>> 16:31:10 2018
>>> @@ -91,6 +91,12 @@ static void GetObjCImageInfo(Module &M,
>>> // ELF
>>>
>>> //===----------------------------------------------------------------------===//
>>>
>>> +void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
>>> + const TargetMachine &TgtM)
>>> {
>>> + TargetLoweringObjectFile::Initialize(Ctx, TgtM);
>>> + TM = &TgtM;
>>> +}
>>> +
>>> void TargetLoweringObjectFileELF::emitModuleMetadata(MCStreamer
>>> &Streamer,
>>> Module &M) const {
>>> auto &C = getContext();
>>> @@ -116,15 +122,49 @@ void TargetLoweringObjectFileELF::emitMo
>>> StringRef Section;
>>>
>>> GetObjCImageInfo(M, Version, Flags, Section);
>>> - if (Section.empty())
>>> + if (!Section.empty()) {
>>> + auto *S = C.getELFSection(Section, ELF::SHT_PROGBITS,
>>> ELF::SHF_ALLOC);
>>> + Streamer.SwitchSection(S);
>>> +
>>> Streamer.EmitLabel(C.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
>>> + Streamer.EmitIntValue(Version, 4);
>>> + Streamer.EmitIntValue(Flags, 4);
>>> + Streamer.AddBlankLine();
>>> + }
>>> +
>>> + SmallVector<Module::ModuleFlagEntry, 8> ModuleFlags;
>>> + M.getModuleFlagsMetadata(ModuleFlags);
>>> +
>>> + MDNode *CFGProfile = nullptr;
>>> +
>>> + for (const auto &MFE : ModuleFlags) {
>>> + StringRef Key = MFE.Key->getString();
>>> + if (Key == "CG Profile") {
>>> + CFGProfile = cast<MDNode>(MFE.Val);
>>> + break;
>>> + }
>>> + }
>>> +
>>> + if (!CFGProfile)
>>> return;
>>>
>>> - auto *S = C.getELFSection(Section, ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
>>> - Streamer.SwitchSection(S);
>>> - Streamer.EmitLabel(C.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
>>> - Streamer.EmitIntValue(Version, 4);
>>> - Streamer.EmitIntValue(Flags, 4);
>>> - Streamer.AddBlankLine();
>>> + auto GetSym = [this](const MDOperand &MDO) {
>>> + auto V = cast<ValueAsMetadata>(MDO);
>>> + const Function *F = cast<Function>(V->getValue());
>>> + return TM->getSymbol(F);
>>> + };
>>> +
>>> + for (const auto &Edge : CFGProfile->operands()) {
>>> + MDNode *E = cast<MDNode>(Edge);
>>> + const MCSymbol *From = GetSym(E->getOperand(0));
>>> + const MCSymbol *To = GetSym(E->getOperand(1));
>>> + uint64_t Count = cast<ConstantAsMetadata>(E->getOperand(2))
>>> + ->getValue()
>>> + ->getUniqueInteger()
>>> + .getZExtValue();
>>> + Streamer.emitCGProfileEntry(
>>> + MCSymbolRefExpr::create(From, MCSymbolRefExpr::VK_None, C),
>>> + MCSymbolRefExpr::create(To, MCSymbolRefExpr::VK_None, C),
>>> Count);
>>> + }
>>> }
>>>
>>> MCSymbol *TargetLoweringObjectFileELF::getCFIPersonalitySymbol(
>>>
>>> Modified: llvm/trunk/lib/IR/Verifier.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=335306&r1=335305&r2=335306&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/IR/Verifier.cpp (original)
>>> +++ llvm/trunk/lib/IR/Verifier.cpp Thu Jun 21 16:31:10 2018
>>> @@ -409,6 +409,7 @@ private:
>>> void visitModuleFlag(const MDNode *Op,
>>> DenseMap<const MDString *, const MDNode *>
>>> &SeenIDs,
>>> SmallVectorImpl<const MDNode *> &Requirements);
>>> + void visitModuleFlagCGProfileEntry(const MDOperand &MDO);
>>> void visitFunction(const Function &F);
>>> void visitBasicBlock(BasicBlock &BB);
>>> void visitRangeMetadata(Instruction &I, MDNode *Range, Type *Ty);
>>> @@ -1411,6 +1412,25 @@ Verifier::visitModuleFlag(const MDNode *
>>> Assert(M.getNamedMetadata("llvm.linker.options"),
>>> "'Linker Options' named metadata no longer supported");
>>> }
>>> +
>>> + if (ID->getString() == "CG Profile") {
>>> + for (const MDOperand &MDO :
>>> cast<MDNode>(Op->getOperand(2))->operands())
>>> + visitModuleFlagCGProfileEntry(MDO);
>>> + }
>>> +}
>>> +
>>> +void Verifier::visitModuleFlagCGProfileEntry(const MDOperand &MDO) {
>>> + auto Node = dyn_cast_or_null<MDNode>(MDO);
>>> + Assert(Node && Node->getNumOperands() == 3, "expected a MDNode
>>> triple", MDO);
>>> + auto From = dyn_cast_or_null<ValueAsMetadata>(Node->getOperand(0));
>>> + Assert(From && isa<Function>(From->getValue()), "expected a Function",
>>> + Node->getOperand(0));
>>> + auto To = dyn_cast_or_null<ValueAsMetadata>(Node->getOperand(1));
>>> + Assert(To && isa<Function>(To->getValue()), "expected a Function",
>>> + Node->getOperand(1));
>>> + auto Count =
>>> dyn_cast_or_null<ConstantAsMetadata>(Node->getOperand(2));
>>> + Assert(Count && Count->getType()->isIntegerTy(),
>>> + "expected an integer constant", Node->getOperand(2));
>>> }
>>>
>>> /// Return true if this attribute kind only applies to functions.
>>>
>>> Modified: llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp?rev=335306&r1=335305&r2=335306&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp Thu Jun 21
>>> 16:31:10 2018
>>> @@ -694,6 +694,8 @@ void PassManagerBuilder::populateModuleP
>>> MPM.add(createConstantMergePass()); // Merge dup global
>>> constants
>>> }
>>>
>>> + MPM.add(createCGProfilePass());
>>> +
>>> if (MergeFunctions)
>>> MPM.add(createMergeFunctionsPass());
>>>
>>>
>>> Added: llvm/trunk/lib/Transforms/Instrumentation/CGProfile.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/CGProfile.cpp?rev=335306&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Transforms/Instrumentation/CGProfile.cpp (added)
>>> +++ llvm/trunk/lib/Transforms/Instrumentation/CGProfile.cpp Thu Jun 21
>>> 16:31:10 2018
>>> @@ -0,0 +1,110 @@
>>> +//===-- CGProfile.cpp
>>> -----------------------------------------------------===//
>>> +//
>>> +// The LLVM Compiler Infrastructure
>>> +//
>>> +// This file is distributed under the University of Illinois Open Source
>>> +// License. See LICENSE.TXT for details.
>>> +//
>>>
>>> +//===----------------------------------------------------------------------===//
>>> +
>>> +#include "llvm/ADT/MapVector.h"
>>> +#include "llvm/Analysis/BlockFrequencyInfo.h"
>>> +#include "llvm/Analysis/BranchProbabilityInfo.h"
>>> +#include "llvm/IR/Constants.h"
>>> +#include "llvm/IR/Instructions.h"
>>> +#include "llvm/IR/MDBuilder.h"
>>> +#include "llvm/IR/PassManager.h"
>>> +#include "llvm/Transforms/Instrumentation.h"
>>> +
>>> +#include <array>
>>> +
>>> +using namespace llvm;
>>> +
>>> +class CGProfilePass : public ModulePass {
>>> +public:
>>> + static char ID;
>>> +
>>> + CGProfilePass() : ModulePass(ID) {
>>> + initializeCGProfilePassPass(*PassRegistry::getPassRegistry());
>>> + }
>>> +
>>> + StringRef getPassName() const override { return "CGProfilePass"; }
>>> +
>>> +private:
>>> + bool runOnModule(Module &M) override;
>>> + bool addModuleFlags(
>>> + Module &M,
>>> + MapVector<std::pair<Function *, Function *>, uint64_t> &Counts)
>>> const;
>>> +
>>> + void getAnalysisUsage(AnalysisUsage &AU) const override {
>>> + AU.addRequired<BlockFrequencyInfoWrapperPass>();
>>> + AU.addRequired<BranchProbabilityInfoWrapperPass>();
>>> + }
>>> +};
>>> +
>>> +bool CGProfilePass::runOnModule(Module &M) {
>>> + if (skipModule(M))
>>> + return false;
>>> +
>>> + MapVector<std::pair<Function *, Function *>, uint64_t> Counts;
>>> +
>>> + for (auto &F : M) {
>>> + if (F.isDeclaration())
>>> + continue;
>>> + getAnalysis<BranchProbabilityInfoWrapperPass>(F).getBPI();
>>> + auto &BFI = getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI();
>>> + for (const auto &BB : F) {
>>> + Optional<uint64_t> BBCount = BFI.getBlockProfileCount(&BB);
>>> + if (!BBCount)
>>> + continue;
>>> + for (const auto &I : BB) {
>>> + auto *CI = dyn_cast<CallInst>(&I);
>>> + if (!CI)
>>> + continue;
>>> + Function *CalledF = CI->getCalledFunction();
>>> + if (!CalledF || CalledF->isIntrinsic())
>>> + continue;
>>> +
>>> + uint64_t &Count = Counts[std::make_pair(&F, CalledF)];
>>> + Count = SaturatingAdd(Count, *BBCount);
>>> + }
>>> + }
>>> + }
>>> +
>>> + return addModuleFlags(M, Counts);
>>> +}
>>> +
>>> +bool CGProfilePass::addModuleFlags(
>>> + Module &M,
>>> + MapVector<std::pair<Function *, Function *>, uint64_t> &Counts)
>>> const {
>>> + if (Counts.empty())
>>> + return false;
>>> +
>>> + LLVMContext &Context = M.getContext();
>>> + MDBuilder MDB(Context);
>>> + std::vector<Metadata *> Nodes;
>>> +
>>> + for (auto E : Counts) {
>>> + SmallVector<Metadata *, 3> Vals;
>>> + Vals.push_back(ValueAsMetadata::get(E.first.first));
>>> + Vals.push_back(ValueAsMetadata::get(E.first.second));
>>> + Vals.push_back(MDB.createConstant(
>>> + ConstantInt::get(Type::getInt64Ty(Context), E.second)));
>>> + Nodes.push_back(MDNode::get(Context, Vals));
>>> + }
>>> +
>>> + M.addModuleFlag(Module::Append, "CG Profile", MDNode::get(Context,
>>> Nodes));
>>> + return true;
>>> +}
>>> +
>>> +char CGProfilePass::ID = 0;
>>> +INITIALIZE_PASS_BEGIN(CGProfilePass, "cg-profile",
>>> + "Generate profile information from the call
>>> graph.",
>>> + false, false)
>>> +INITIALIZE_PASS_DEPENDENCY(BlockFrequencyInfoWrapperPass)
>>> +INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfoWrapperPass)
>>> +INITIALIZE_PASS_END(CGProfilePass, "cg-profile",
>>> + "Generate profile information from the call
>>> graph.", false,
>>> + false)
>>> +
>>> +ModulePass *llvm::createCGProfilePass() { return new CGProfilePass(); }
>>>
>>> Modified: llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt?rev=335306&r1=335305&r2=335306&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt (original)
>>> +++ llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt Thu Jun 21
>>> 16:31:10 2018
>>> @@ -1,6 +1,7 @@
>>> add_llvm_library(LLVMInstrumentation
>>> AddressSanitizer.cpp
>>> BoundsChecking.cpp
>>> + CGProfile.cpp
>>> DataFlowSanitizer.cpp
>>> GCOVProfiling.cpp
>>> MemorySanitizer.cpp
>>>
>>> Modified: llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp?rev=335306&r1=335305&r2=335306&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp
>>> (original)
>>> +++ llvm/trunk/lib/Transforms/Instrumentation/Instrumentation.cpp Thu
>>> Jun 21 16:31:10 2018
>>> @@ -60,6 +60,7 @@ void llvm::initializeInstrumentation(Pas
>>> initializeAddressSanitizerModulePass(Registry);
>>> initializeBoundsCheckingLegacyPassPass(Registry);
>>> initializeGCOVProfilerLegacyPassPass(Registry);
>>> + initializeCGProfilePassPass(Registry);
>>> initializePGOInstrumentationGenLegacyPassPass(Registry);
>>> initializePGOInstrumentationUseLegacyPassPass(Registry);
>>> initializePGOIndirectCallPromotionLegacyPassPass(Registry);
>>>
>>> Added: llvm/trunk/test/Instrumentation/cgprofile.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/cgprofile.ll?rev=335306&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Instrumentation/cgprofile.ll (added)
>>> +++ llvm/trunk/test/Instrumentation/cgprofile.ll Thu Jun 21 16:31:10 2018
>>> @@ -0,0 +1,28 @@
>>> +; RUN: opt < %s -cg-profile -S | FileCheck %s
>>> +
>>> +declare void @b()
>>> +
>>> +define void @a() !prof !1 {
>>> + call void @b()
>>> + ret void
>>> +}
>>> +
>>> +define void @freq(i1 %cond) !prof !1 {
>>> + br i1 %cond, label %A, label %B, !prof !2
>>> +A:
>>> + call void @a();
>>> + ret void
>>> +B:
>>> + call void @b();
>>> + ret void
>>> +}
>>> +
>>> +!1 = !{!"function_entry_count", i64 32}
>>> +!2 = !{!"branch_weights", i32 5, i32 10}
>>> +
>>> +; CHECK: !llvm.module.flags = !{![[cgprof:[0-9]+]]}
>>> +; CHECK: ![[cgprof]] = !{i32 5, !"CG Profile", ![[prof:[0-9]+]]}
>>> +; CHECK: ![[prof]] = !{![[e0:[0-9]+]], ![[e1:[0-9]+]], ![[e2:[0-9]+]]}
>>> +; CHECK: ![[e0]] = !{void ()* @a, void ()* @b, i64 32}
>>> +; CHECK: ![[e1]] = !{void (i1)* @freq, void ()* @a, i64 11}
>>> +; CHECK: ![[e2]] = !{void (i1)* @freq, void ()* @b, i64 20}
>>>
>>> Added: llvm/trunk/test/MC/ELF/cgprofile.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/cgprofile.ll?rev=335306&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/MC/ELF/cgprofile.ll (added)
>>> +++ llvm/trunk/test/MC/ELF/cgprofile.ll Thu Jun 21 16:31:10 2018
>>> @@ -0,0 +1,50 @@
>>> +; RUN: llc -filetype=asm %s -o - -mtriple x86_64-pc-linux-gnu |
>>> FileCheck %s
>>> +; RUN: llc -filetype=obj %s -o %t -mtriple x86_64-pc-linux-gnu
>>> +; RUN: llvm-readobj -elf-cg-profile %t | FileCheck %s --check-prefix=OBJ
>>> +
>>> +declare void @b()
>>> +
>>> +define void @a() {
>>> + call void @b()
>>> + ret void
>>> +}
>>> +
>>> +define void @freq(i1 %cond) {
>>> + br i1 %cond, label %A, label %B
>>> +A:
>>> + call void @a();
>>> + ret void
>>> +B:
>>> + call void @b();
>>> + ret void
>>> +}
>>> +
>>> +!llvm.module.flags = !{!0}
>>> +
>>> +!0 = !{i32 5, !"CG Profile", !1}
>>> +!1 = !{!2, !3, !4}
>>> +!2 = !{void ()* @a, void ()* @b, i64 32}
>>> +!3 = !{void (i1)* @freq, void ()* @a, i64 11}
>>> +!4 = !{void (i1)* @freq, void ()* @b, i64 20}
>>> +
>>> +; CHECK: .cg_profile a, b, 32
>>> +; CHECK: .cg_profile freq, a, 11
>>> +; CHECK: .cg_profile freq, b, 20
>>> +
>>> +; OBJ: CGProfile [
>>> +; OBJ: CGProfileEntry {
>>> +; OBJ: From: a
>>> +; OBJ: To: b
>>> +; OBJ: Weight: 32
>>> +; OBJ: }
>>> +; OBJ: CGProfileEntry {
>>> +; OBJ: From: freq
>>> +; OBJ: To: a
>>> +; OBJ: Weight: 11
>>> +; OBJ: }
>>> +; OBJ: CGProfileEntry {
>>> +; OBJ: From: freq
>>> +; OBJ: To: b
>>> +; OBJ: Weight: 20
>>> +; OBJ: }
>>> +; OBJ:]
>>>
>>> Added: llvm/trunk/test/Verifier/module-flags-cgprofile.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/module-flags-cgprofile.ll?rev=335306&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Verifier/module-flags-cgprofile.ll (added)
>>> +++ llvm/trunk/test/Verifier/module-flags-cgprofile.ll Thu Jun 21
>>> 16:31:10 2018
>>> @@ -0,0 +1,30 @@
>>> +; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
>>> +
>>> +declare void @b()
>>> +declare void @a()
>>> +
>>> +!llvm.module.flags = !{!0}
>>> +
>>> +!0 = !{i32 5, !"CG Profile", !1}
>>> +!1 = !{!2, !"", !3, !4, !5, !6, !7, !8}
>>> +!2 = !{void ()* @a, void ()* @b, i64 32}
>>> +!3 = !{void ()* @a, void ()* @b}
>>> +!4 = !{void ()* @a, void ()* @b, i64 32, i64 32}
>>> +!5 = !{!"a", void ()* @b, i64 32}
>>> +!6 = !{void ()* @a, !"b", i64 32}
>>> +!7 = !{void ()* @a, void ()* @b, !""}
>>> +!8 = !{void ()* @a, void ()* @b, null}
>>> +
>>> +; CHECK: expected a MDNode triple
>>> +; CHECK: !""
>>> +; CHECK: expected a MDNode triple
>>> +; CHECK: !3 = !{void ()* @a, void ()* @b}
>>> +; CHECK: expected a MDNode triple
>>> +; CHECK: !4 = !{void ()* @a, void ()* @b, i64 32, i64 32}
>>> +; CHECK: expected a Function
>>> +; CHECK: !"a"
>>> +; CHECK: expected a Function
>>> +; CHECK: !"b"
>>> +; CHECK: expected an integer constant
>>> +; CHECK: !""
>>> +; CHECK: expected an integer constant
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180621/ffc0abc9/attachment.html>
More information about the llvm-commits
mailing list