当前位置: 首页>>代码示例>>C++>>正文


C++ SmallDenseMap::lookup方法代码示例

本文整理汇总了C++中SmallDenseMap::lookup方法的典型用法代码示例。如果您正苦于以下问题:C++ SmallDenseMap::lookup方法的具体用法?C++ SmallDenseMap::lookup怎么用?C++ SmallDenseMap::lookup使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在SmallDenseMap的用法示例。


在下文中一共展示了SmallDenseMap::lookup方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: shuffleValueUseLists

static void shuffleValueUseLists(Value *V, std::minstd_rand0 &Gen,
                                 DenseSet<Value *> &Seen) {
  if (!Seen.insert(V).second)
    return;

  if (auto *C = dyn_cast<Constant>(V))
    if (!isa<GlobalValue>(C))
      for (Value *Op : C->operands())
        shuffleValueUseLists(Op, Gen, Seen);

  if (V->use_empty() || std::next(V->use_begin()) == V->use_end())
    // Nothing to shuffle for 0 or 1 users.
    return;

  // Generate random numbers between 10 and 99, which will line up nicely in
  // debug output.  We're not worried about collisons here.
  DEBUG(dbgs() << "V = "; V->dump());
  std::uniform_int_distribution<short> Dist(10, 99);
  SmallDenseMap<const Use *, short, 16> Order;
  for (const Use &U : V->uses()) {
    auto I = Dist(Gen);
    Order[&U] = I;
    DEBUG(dbgs() << " - order: " << I << ", U = "; U.getUser()->dump());
  }

  DEBUG(dbgs() << " => shuffle\n");
  V->sortUseList(
      [&Order](const Use &L, const Use &R) { return Order[&L] < Order[&R]; });

  DEBUG({
    for (const Use &U : V->uses())
      DEBUG(dbgs() << " - order: " << Order.lookup(&U) << ", U = ";
            U.getUser()->dump());
  });
开发者ID:chyyuu,项目名称:llvm,代码行数:34,代码来源:UseListOrder.cpp

示例2: UnrollLoop


//.........这里部分代码省略.........
  // exit.
  LoopBlocksDFS DFS(L);
  DFS.perform(LI);

  // Stash the DFS iterators before adding blocks to the loop.
  LoopBlocksDFS::RPOIterator BlockBegin = DFS.beginRPO();
  LoopBlocksDFS::RPOIterator BlockEnd = DFS.endRPO();

  for (unsigned It = 1; It != Count; ++It) {
    std::vector<BasicBlock*> NewBlocks;
    SmallDenseMap<const Loop *, Loop *, 4> NewLoops;
    NewLoops[L] = L;

    for (LoopBlocksDFS::RPOIterator BB = BlockBegin; BB != BlockEnd; ++BB) {
      ValueToValueMapTy VMap;
      BasicBlock *New = CloneBasicBlock(*BB, VMap, "." + Twine(It));
      Header->getParent()->getBasicBlockList().push_back(New);

      // Tell LI about New.
      if (*BB == Header) {
        assert(LI->getLoopFor(*BB) == L && "Header should not be in a sub-loop");
        L->addBasicBlockToLoop(New, *LI);
      } else {
        // Figure out which loop New is in.
        const Loop *OldLoop = LI->getLoopFor(*BB);
        assert(OldLoop && "Should (at least) be in the loop being unrolled!");

        Loop *&NewLoop = NewLoops[OldLoop];
        if (!NewLoop) {
          // Found a new sub-loop.
          assert(*BB == OldLoop->getHeader() &&
                 "Header should be first in RPO");

          Loop *NewLoopParent = NewLoops.lookup(OldLoop->getParentLoop());
          assert(NewLoopParent &&
                 "Expected parent loop before sub-loop in RPO");
          NewLoop = new Loop;
          NewLoopParent->addChildLoop(NewLoop);

          // Forget the old loop, since its inputs may have changed.
          if (SE)
            SE->forgetLoop(OldLoop);
        }
        NewLoop->addBasicBlockToLoop(New, *LI);
      }

      if (*BB == Header)
        // Loop over all of the PHI nodes in the block, changing them to use
        // the incoming values from the previous block.
        for (unsigned i = 0, e = OrigPHINode.size(); i != e; ++i) {
          PHINode *NewPHI = cast<PHINode>(VMap[OrigPHINode[i]]);
          Value *InVal = NewPHI->getIncomingValueForBlock(LatchBlock);
          if (Instruction *InValI = dyn_cast<Instruction>(InVal))
            if (It > 1 && L->contains(InValI))
              InVal = LastValueMap[InValI];
          VMap[OrigPHINode[i]] = InVal;
          New->getInstList().erase(NewPHI);
        }

      // Update our running map of newest clones
      LastValueMap[*BB] = New;
      for (ValueToValueMapTy::iterator VI = VMap.begin(), VE = VMap.end();
           VI != VE; ++VI)
        LastValueMap[VI->first] = VI->second;

      // Add phi entries for newly created values to all exit blocks.
开发者ID:KonstantinSchubert,项目名称:root,代码行数:67,代码来源:LoopUnroll.cpp

示例3: if

// Create output section objects and add them to OutputSections.
template <class ELFT> void Writer<ELFT>::createSections() {
  // .interp needs to be on the first page in the output file.
  if (needsInterpSection())
    OutputSections.push_back(Out<ELFT>::Interp);

  SmallDenseMap<SectionKey<ELFT::Is64Bits>, OutputSectionBase<ELFT> *> Map;

  std::vector<OutputSectionBase<ELFT> *> RegularSections;

  for (const std::unique_ptr<ObjectFile<ELFT>> &F : Symtab.getObjectFiles()) {
    for (InputSectionBase<ELFT> *C : F->getSections()) {
      if (isDiscarded(C))
        continue;
      const Elf_Shdr *H = C->getSectionHdr();
      uintX_t OutFlags = H->sh_flags & ~SHF_GROUP;
      // For SHF_MERGE we create different output sections for each sh_entsize.
      // This makes each output section simple and keeps a single level
      // mapping from input to output.
      typename InputSectionBase<ELFT>::Kind K = C->SectionKind;
      uintX_t EntSize = K != InputSectionBase<ELFT>::Merge ? 0 : H->sh_entsize;
      uint32_t OutType = H->sh_type;
      if (OutType == SHT_PROGBITS && C->getSectionName() == ".eh_frame" &&
          Config->EMachine == EM_X86_64)
        OutType = SHT_X86_64_UNWIND;
      SectionKey<ELFT::Is64Bits> Key{getOutputSectionName(C->getSectionName()),
                                     OutType, OutFlags, EntSize};
      OutputSectionBase<ELFT> *&Sec = Map[Key];
      if (!Sec) {
        switch (K) {
        case InputSectionBase<ELFT>::Regular:
          Sec = new (SecAlloc.Allocate())
              OutputSection<ELFT>(Key.Name, Key.Type, Key.Flags);
          break;
        case InputSectionBase<ELFT>::EHFrame:
          Sec = new (EHSecAlloc.Allocate())
              EHOutputSection<ELFT>(Key.Name, Key.Type, Key.Flags);
          break;
        case InputSectionBase<ELFT>::Merge:
          Sec = new (MSecAlloc.Allocate())
              MergeOutputSection<ELFT>(Key.Name, Key.Type, Key.Flags);
          break;
        }
        OutputSections.push_back(Sec);
        RegularSections.push_back(Sec);
      }
      switch (K) {
      case InputSectionBase<ELFT>::Regular:
        static_cast<OutputSection<ELFT> *>(Sec)
            ->addSection(cast<InputSection<ELFT>>(C));
        break;
      case InputSectionBase<ELFT>::EHFrame:
        static_cast<EHOutputSection<ELFT> *>(Sec)
            ->addSection(cast<EHInputSection<ELFT>>(C));
        break;
      case InputSectionBase<ELFT>::Merge:
        static_cast<MergeOutputSection<ELFT> *>(Sec)
            ->addSection(cast<MergeInputSection<ELFT>>(C));
        break;
      }
    }
  }

  Out<ELFT>::Bss = static_cast<OutputSection<ELFT> *>(
      Map[{".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE, 0}]);

  Out<ELFT>::Dynamic->PreInitArraySec = Map.lookup(
      {".preinit_array", SHT_PREINIT_ARRAY, SHF_WRITE | SHF_ALLOC, 0});
  Out<ELFT>::Dynamic->InitArraySec =
      Map.lookup({".init_array", SHT_INIT_ARRAY, SHF_WRITE | SHF_ALLOC, 0});
  Out<ELFT>::Dynamic->FiniArraySec =
      Map.lookup({".fini_array", SHT_FINI_ARRAY, SHF_WRITE | SHF_ALLOC, 0});

  auto AddStartEnd = [&](StringRef Start, StringRef End,
                         OutputSectionBase<ELFT> *OS) {
    if (OS) {
      Symtab.addSyntheticSym(Start, *OS, 0);
      Symtab.addSyntheticSym(End, *OS, OS->getSize());
    } else {
      Symtab.addIgnoredSym(Start);
      Symtab.addIgnoredSym(End);
    }
  };

  AddStartEnd("__preinit_array_start", "__preinit_array_end",
              Out<ELFT>::Dynamic->PreInitArraySec);
  AddStartEnd("__init_array_start", "__init_array_end",
              Out<ELFT>::Dynamic->InitArraySec);
  AddStartEnd("__fini_array_start", "__fini_array_end",
              Out<ELFT>::Dynamic->FiniArraySec);

  for (OutputSectionBase<ELFT> *Sec : RegularSections)
    addStartStopSymbols(Sec);

  // __tls_get_addr is defined by the dynamic linker for dynamic ELFs. For
  // static linking the linker is required to optimize away any references to
  // __tls_get_addr, so it's not defined anywhere. Create a hidden definition
  // to avoid the undefined symbol error.
  if (!isOutputDynamic())
    Symtab.addIgnoredSym("__tls_get_addr");
//.........这里部分代码省略.........
开发者ID:8l,项目名称:lld,代码行数:101,代码来源:Writer.cpp


注:本文中的SmallDenseMap::lookup方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。