[llvm] r335794 - Add support for generating a call graph profile from Branch Frequency Info.

Benjamin Kramer via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 28 06:19:49 PDT 2018


Your invariants don't work. Functions can be deleted, nulling out the
references in metadata. In fact it's sufficient to run -cgprofile
-globaldce on a module with two unused internal functions calling each
other to get the verifier to fire.

This breaks selfhost with ThinLTO+FDO, it crashes when writing the ELF file
because there are nulls in the metadata. I've reverted this change
in r335851.

On Thu, Jun 28, 2018 at 2:02 AM Michael J. Spencer via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: mspencer
> Date: Wed Jun 27 16:58:08 2018
> New Revision: 335794
>
> URL: http://llvm.org/viewvc/llvm-project?rev=335794&view=rev
> Log:
> Add support for generating a call graph profile from Branch Frequency Info.
>
> === Generating the CG Profile ===
>
> 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/include/llvm/Transforms/Instrumentation/CGProfile.h
>     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/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>     llvm/trunk/lib/IR/Verifier.cpp
>     llvm/trunk/lib/Passes/PassBuilder.cpp
>     llvm/trunk/lib/Passes/PassRegistry.def
>     llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt
>     llvm/trunk/test/Other/new-pm-defaults.ll
>     llvm/trunk/test/Other/new-pm-thinlto-defaults.ll
>
> Modified: llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h?rev=335794&r1=335793&r2=335794&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
> (original)
> +++ llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h Wed Jun
> 27 16:58:08 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;
>
>
> Added: llvm/trunk/include/llvm/Transforms/Instrumentation/CGProfile.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Instrumentation/CGProfile.h?rev=335794&view=auto
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Instrumentation/CGProfile.h (added)
> +++ llvm/trunk/include/llvm/Transforms/Instrumentation/CGProfile.h Wed Jun
> 27 16:58:08 2018
> @@ -0,0 +1,31 @@
> +//===- Transforms/Instrumentation/CGProfile.h -------------------*- C++
> -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +/// \file
> +/// This file provides the interface for LLVM's Call Graph Profile pass.
>
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_TRANSFORMS_CGPROFILE_H
> +#define LLVM_TRANSFORMS_CGPROFILE_H
> +
> +#include "llvm/ADT/MapVector.h"
> +#include "llvm/IR/PassManager.h"
> +
> +namespace llvm {
> +class CGProfilePass : public PassInfoMixin<CGProfilePass> {
> +public:
> +  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
> +
> +private:
> +  void addModuleFlags(
> +      Module &M,
> +      MapVector<std::pair<Function *, Function *>, uint64_t> &Counts)
> const;
> +};
> +} // end namespace llvm
> +
> +#endif // LLVM_TRANSFORMS_CGPROFILE_H
>
> Modified: llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp?rev=335794&r1=335793&r2=335794&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (original)
> +++ llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp Wed Jun 27
> 16:58:08 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=335794&r1=335793&r2=335794&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/Verifier.cpp (original)
> +++ llvm/trunk/lib/IR/Verifier.cpp Wed Jun 27 16:58:08 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/Passes/PassBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=335794&r1=335793&r2=335794&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
> +++ llvm/trunk/lib/Passes/PassBuilder.cpp Wed Jun 27 16:58:08 2018
> @@ -61,6 +61,7 @@
>  #include "llvm/Target/TargetMachine.h"
>  #include "llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h"
>  #include "llvm/Transforms/Instrumentation/GCOVProfiler.h"
> +#include "llvm/Transforms/Instrumentation/CGProfile.h"
>  #include "llvm/Transforms/IPO/AlwaysInliner.h"
>  #include "llvm/Transforms/IPO/ArgumentPromotion.h"
>  #include "llvm/Transforms/IPO/CalledValuePropagation.h"
> @@ -832,6 +833,8 @@ PassBuilder::buildModuleOptimizationPipe
>    // Add the core optimizing pipeline.
>    MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizePM)));
>
> +  MPM.addPass(CGProfilePass());
> +
>    // Now we need to do some global optimization transforms.
>    // FIXME: It would seem like these should come first in the optimization
>    // pipeline and maybe be the bottom of the canonicalization pipeline?
> Weird
>
> Modified: llvm/trunk/lib/Passes/PassRegistry.def
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=335794&r1=335793&r2=335794&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Passes/PassRegistry.def (original)
> +++ llvm/trunk/lib/Passes/PassRegistry.def Wed Jun 27 16:58:08 2018
> @@ -40,6 +40,7 @@ MODULE_ALIAS_ANALYSIS("globals-aa", Glob
>  #endif
>  MODULE_PASS("always-inline", AlwaysInlinerPass())
>  MODULE_PASS("called-value-propagation", CalledValuePropagationPass())
> +MODULE_PASS("cg-profile", CGProfilePass())
>  MODULE_PASS("constmerge", ConstantMergePass())
>  MODULE_PASS("cross-dso-cfi", CrossDSOCFIPass())
>  MODULE_PASS("deadargelim", DeadArgumentEliminationPass())
>
> Added: llvm/trunk/lib/Transforms/Instrumentation/CGProfile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/CGProfile.cpp?rev=335794&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/CGProfile.cpp (added)
> +++ llvm/trunk/lib/Transforms/Instrumentation/CGProfile.cpp Wed Jun 27
> 16:58:08 2018
> @@ -0,0 +1,100 @@
> +//===-- 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/Transforms/Instrumentation/CGProfile.h"
> +
> +#include "llvm/ADT/MapVector.h"
> +#include "llvm/Analysis/BlockFrequencyInfo.h"
> +#include "llvm/Analysis/TargetTransformInfo.h"
> +#include "llvm/IR/CallSite.h"
> +#include "llvm/IR/Constants.h"
> +#include "llvm/IR/Instructions.h"
> +#include "llvm/IR/MDBuilder.h"
> +#include "llvm/IR/PassManager.h"
> +#include "llvm/ProfileData/InstrProf.h"
> +#include "llvm/Transforms/Instrumentation.h"
> +
> +#include <array>
> +
> +using namespace llvm;
> +
> +PreservedAnalyses CGProfilePass::run(Module &M, ModuleAnalysisManager
> &MAM) {
> +  MapVector<std::pair<Function *, Function *>, uint64_t> Counts;
> +  FunctionAnalysisManager &FAM =
> +      MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
> +  InstrProfSymtab Symtab;
> +  auto UpdateCounts = [&](TargetTransformInfo &TTI, Function *F,
> +                          Function *CalledF, uint64_t NewCount) {
> +    if (!CalledF || !TTI.isLoweredToCall(CalledF))
> +      return;
> +    uint64_t &Count = Counts[std::make_pair(F, CalledF)];
> +    Count = SaturatingAdd(Count, NewCount);
> +  };
> +  // Ignore error here.  Indirect calls are ignored if this fails.
> +  (bool)Symtab.create(M);
> +  for (auto &F : M) {
> +    if (F.isDeclaration())
> +      continue;
> +    auto &BFI = FAM.getResult<BlockFrequencyAnalysis>(F);
> +    if (BFI.getEntryFreq() == 0)
> +      continue;
> +    TargetTransformInfo &TTI = FAM.getResult<TargetIRAnalysis>(F);
> +    for (auto &BB : F) {
> +      Optional<uint64_t> BBCount = BFI.getBlockProfileCount(&BB);
> +      if (!BBCount)
> +        continue;
> +      for (auto &I : BB) {
> +        CallSite CS(&I);
> +        if (!CS)
> +          continue;
> +        if (CS.isIndirectCall()) {
> +          InstrProfValueData ValueData[8];
> +          uint32_t ActualNumValueData;
> +          uint64_t TotalC;
> +          if (!getValueProfDataFromInst(*CS.getInstruction(),
> +                                        IPVK_IndirectCallTarget, 8,
> ValueData,
> +                                        ActualNumValueData, TotalC))
> +            continue;
> +          for (const auto &VD :
> +               ArrayRef<InstrProfValueData>(ValueData,
> ActualNumValueData)) {
> +            UpdateCounts(TTI, &F, Symtab.getFunction(VD.Value), VD.Count);
> +          }
> +          continue;
> +        }
> +        UpdateCounts(TTI, &F, CS.getCalledFunction(), *BBCount);
> +      }
> +    }
> +  }
> +
> +  addModuleFlags(M, Counts);
> +
> +  return PreservedAnalyses::all();
> +}
> +
> +void CGProfilePass::addModuleFlags(
> +    Module &M,
> +    MapVector<std::pair<Function *, Function *>, uint64_t> &Counts) const
> {
> +  if (Counts.empty())
> +    return;
> +
> +  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));
> +}
>
> Modified: llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt?rev=335794&r1=335793&r2=335794&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/CMakeLists.txt Wed Jun 27
> 16:58:08 2018
> @@ -1,6 +1,7 @@
>  add_llvm_library(LLVMInstrumentation
>    AddressSanitizer.cpp
>    BoundsChecking.cpp
> +  CGProfile.cpp
>    DataFlowSanitizer.cpp
>    GCOVProfiling.cpp
>    MemorySanitizer.cpp
>
> Added: llvm/trunk/test/Instrumentation/cgprofile.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/cgprofile.ll?rev=335794&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Instrumentation/cgprofile.ll (added)
> +++ llvm/trunk/test/Instrumentation/cgprofile.ll Wed Jun 27 16:58:08 2018
> @@ -0,0 +1,41 @@
> +; RUN: opt < %s -passes cg-profile -S | FileCheck %s
> +
> +declare void @b()
> +
> +define void @a() !prof !1 {
> +  call void @b()
> +  ret void
> +}
> +
> + at foo = common global i32 ()* null, align 8
> +declare i32 @func1()
> +declare i32 @func2()
> +declare i32 @func3()
> +declare i32 @func4()
> +
> +define void @freq(i1 %cond) !prof !1 {
> +  %tmp = load i32 ()*, i32 ()** @foo, align 8
> +  call i32 %tmp(), !prof !3
> +  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}
> +!3 = !{!"VP", i32 0, i64 1600, i64 7651369219802541373, i64 1030, i64
> -4377547752858689819, i64 410, i64 -6929281286627296573, i64 150, i64
> -2545542355363006406, i64 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]+]],
> ![[e3:[0-9]+]], ![[e4:[0-9]+]], ![[e5:[0-9]+]], ![[e6:[0-9]+]]}
> +; CHECK: ![[e0]] = !{void ()* @a, void ()* @b, i64 32}
> +; CHECK: ![[e1]] = !{void (i1)* @freq, i32 ()* @func4, i64 1030}
> +; CHECK: ![[e2]] = !{void (i1)* @freq, i32 ()* @func2, i64 410}
> +; CHECK: ![[e3]] = !{void (i1)* @freq, i32 ()* @func3, i64 150}
> +; CHECK: ![[e4]] = !{void (i1)* @freq, i32 ()* @func1, i64 10}
> +; CHECK: ![[e5]] = !{void (i1)* @freq, void ()* @a, i64 11}
> +; CHECK: ![[e6]] = !{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=335794&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/MC/ELF/cgprofile.ll (added)
> +++ llvm/trunk/test/MC/ELF/cgprofile.ll Wed Jun 27 16:58:08 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:]
>
> Modified: llvm/trunk/test/Other/new-pm-defaults.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/new-pm-defaults.ll?rev=335794&r1=335793&r2=335794&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Other/new-pm-defaults.ll (original)
> +++ llvm/trunk/test/Other/new-pm-defaults.ll Wed Jun 27 16:58:08 2018
> @@ -246,6 +246,7 @@
>  ; CHECK-O-NEXT: Running pass: SimplifyCFGPass
>  ; CHECK-O-NEXT: Running pass: SpeculateAroundPHIsPass
>  ; CHECK-O-NEXT: Finished llvm::Function pass manager run.
> +; CHECK-O-NEXT: Running pass: CGProfilePass
>  ; CHECK-O-NEXT: Running pass: GlobalDCEPass
>  ; CHECK-O-NEXT: Running pass: ConstantMergePass
>  ; CHECK-O-NEXT: Finished llvm::Module pass manager run.
>
> Modified: llvm/trunk/test/Other/new-pm-thinlto-defaults.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/new-pm-thinlto-defaults.ll?rev=335794&r1=335793&r2=335794&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Other/new-pm-thinlto-defaults.ll (original)
> +++ llvm/trunk/test/Other/new-pm-thinlto-defaults.ll Wed Jun 27 16:58:08
> 2018
> @@ -224,6 +224,7 @@
>  ; CHECK-POSTLINK-O-NEXT: Running pass: SimplifyCFGPass
>  ; CHECK-POSTLINK-O-NEXT: Running pass: SpeculateAroundPHIsPass
>  ; CHECK-POSTLINK-O-NEXT: Finished llvm::Function pass manager run.
> +; CHECK-POSTLINK-O-NEXT: Running pass: CGProfilePass
>  ; CHECK-POSTLINK-O-NEXT: Running pass: GlobalDCEPass
>  ; CHECK-POSTLINK-O-NEXT: Running pass: ConstantMergePass
>  ; CHECK-POSTLINK-O-NEXT: Finished llvm::Module pass manager run.
>
> 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=335794&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Verifier/module-flags-cgprofile.ll (added)
> +++ llvm/trunk/test/Verifier/module-flags-cgprofile.ll Wed Jun 27 16:58:08
> 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/20180628/e8a4dcbb/attachment-0001.html>


More information about the llvm-commits mailing list