77 lines · cpp
1//===- ReduceUsingSimplifyCFG.h - Specialized Delta Pass ------------------===//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 implements a function which calls the Generic Delta pass in order10// to call SimplifyCFG on individual basic blocks.11//12//===----------------------------------------------------------------------===//13 14#include "ReduceUsingSimplifyCFG.h"15#include "Utils.h"16#include "llvm/Analysis/TargetTransformInfo.h"17#include "llvm/IR/Constants.h"18#include "llvm/IR/Instructions.h"19#include "llvm/Transforms/Utils/Local.h"20 21using namespace llvm;22 23void llvm::reduceUsingSimplifyCFGDeltaPass(Oracle &O,24 ReducerWorkItem &WorkItem) {25 Module &Program = WorkItem.getModule();26 SmallVector<BasicBlock *, 16> ToSimplify;27 for (auto &F : Program)28 for (auto &BB : F)29 if (!O.shouldKeep())30 ToSimplify.push_back(&BB);31 TargetTransformInfo TTI(Program.getDataLayout());32 for (auto *BB : ToSimplify)33 simplifyCFG(BB, TTI);34}35 36static void reduceConditionals(Oracle &O, ReducerWorkItem &WorkItem,37 bool Direction) {38 Module &M = WorkItem.getModule();39 40 LLVMContext &Ctx = M.getContext();41 ConstantInt *ConstValToSet =42 Direction ? ConstantInt::getTrue(Ctx) : ConstantInt::getFalse(Ctx);43 44 for (Function &F : M) {45 if (F.isDeclaration())46 continue;47 48 SmallVector<BasicBlock *, 16> ToSimplify;49 50 for (auto &BB : F) {51 auto *BR = dyn_cast<BranchInst>(BB.getTerminator());52 if (!BR || !BR->isConditional() || BR->getCondition() == ConstValToSet ||53 O.shouldKeep())54 continue;55 56 BR->setCondition(ConstValToSet);57 ToSimplify.push_back(&BB);58 }59 60 if (!ToSimplify.empty()) {61 // TODO: Should probably leave MergeBlockIntoPredecessor for a separate62 // reduction63 simpleSimplifyCFG(F, ToSimplify);64 }65 }66}67 68void llvm::reduceConditionalsTrueDeltaPass(Oracle &O,69 ReducerWorkItem &WorkItem) {70 reduceConditionals(O, WorkItem, true);71}72 73void llvm::reduceConditionalsFalseDeltaPass(Oracle &O,74 ReducerWorkItem &WorkItem) {75 reduceConditionals(O, WorkItem, false);76}77