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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements a function which calls the Generic Delta pass in order
10// 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(Elt: &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(Context&: Ctx) : ConstantInt::getFalse(Context&: 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>(Val: BB.getTerminator());
52 if (!BR || !BR->isConditional() || BR->getCondition() == ConstValToSet ||
53 O.shouldKeep())
54 continue;
55
56 BR->setCondition(ConstValToSet);
57 ToSimplify.push_back(Elt: &BB);
58 }
59
60 if (!ToSimplify.empty()) {
61 // TODO: Should probably leave MergeBlockIntoPredecessor for a separate
62 // reduction
63 simpleSimplifyCFG(F, BBs: ToSimplify);
64 }
65 }
66}
67
68void llvm::reduceConditionalsTrueDeltaPass(Oracle &O,
69 ReducerWorkItem &WorkItem) {
70 reduceConditionals(O, WorkItem, Direction: true);
71}
72
73void llvm::reduceConditionalsFalseDeltaPass(Oracle &O,
74 ReducerWorkItem &WorkItem) {
75 reduceConditionals(O, WorkItem, Direction: false);
76}
77