brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · bc9c4c4 Raw
83 lines · cpp
1//===- Utils.cpp - llvm-reduce utility functions --------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file contains some utility functions supporting llvm-reduce.10//11//===----------------------------------------------------------------------===//12 13#include "Utils.h"14#include "llvm/IR/Constants.h"15#include "llvm/IR/GlobalAlias.h"16#include "llvm/IR/GlobalIFunc.h"17#include "llvm/Transforms/Utils/BasicBlockUtils.h"18#include "llvm/Transforms/Utils/Local.h"19 20using namespace llvm;21 22extern cl::OptionCategory LLVMReduceOptions;23 24cl::opt<bool> llvm::Verbose("verbose",25                            cl::desc("Print extra debugging information"),26                            cl::init(false), cl::cat(LLVMReduceOptions));27 28Value *llvm::getDefaultValue(Type *T) {29  if (T->isVoidTy())30    return PoisonValue::get(T);31 32  if (auto *TET = dyn_cast<TargetExtType>(T)) {33    if (TET->hasProperty(TargetExtType::HasZeroInit))34      return ConstantTargetNone::get(TET);35    return PoisonValue::get(TET);36  }37 38  return Constant::getNullValue(T);39}40 41bool llvm::hasAliasUse(Function &F) {42  return any_of(F.users(), [](User *U) {43      return isa<GlobalAlias>(U) || isa<GlobalIFunc>(U);44    });45}46 47void llvm::simpleSimplifyCFG(Function &F, ArrayRef<BasicBlock *> BBs,48                             bool FoldBlockIntoPredecessor) {49 50  for (BasicBlock *BB : BBs) {51    ConstantFoldTerminator(BB);52    if (FoldBlockIntoPredecessor)53      MergeBlockIntoPredecessor(BB);54  }55 56  // Remove unreachable blocks57  //58  // removeUnreachableBlocks can't be used here, it will turn various undefined59  // behavior into unreachables, but llvm-reduce was the thing that generated60  // the undefined behavior, and we don't want it to kill the entire program.61  SmallPtrSet<BasicBlock *, 16> Visited(llvm::from_range,62                                        depth_first(&F.getEntryBlock()));63 64  SmallVector<BasicBlock *, 16> Unreachable;65  for (BasicBlock &BB : F) {66    if (!Visited.count(&BB))67      Unreachable.push_back(&BB);68  }69 70  // The dead BB's may be in a dead cycle or otherwise have references to each71  // other.  Because of this, we have to drop all references first, then delete72  // them all at once.73  for (BasicBlock *BB : Unreachable) {74    for (BasicBlock *Successor : successors(&*BB))75      if (Visited.count(Successor))76        Successor->removePredecessor(&*BB, /*KeepOneInputPHIs=*/true);77    BB->dropAllReferences();78  }79 80  for (BasicBlock *BB : Unreachable)81    BB->eraseFromParent();82}83