[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