12f1fa624SJohn Regehr //===- ReduceUsingSimplifyCFG.h - Specialized Delta Pass ------------------===//
22f1fa624SJohn Regehr //
32f1fa624SJohn Regehr // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42f1fa624SJohn Regehr // See https://llvm.org/LICENSE.txt for license information.
52f1fa624SJohn Regehr // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62f1fa624SJohn Regehr //
72f1fa624SJohn Regehr //===----------------------------------------------------------------------===//
82f1fa624SJohn Regehr //
92f1fa624SJohn Regehr // This file implements a function which calls the Generic Delta pass in order
102f1fa624SJohn Regehr // to call SimplifyCFG on individual basic blocks.
112f1fa624SJohn Regehr //
122f1fa624SJohn Regehr //===----------------------------------------------------------------------===//
132f1fa624SJohn Regehr
142f1fa624SJohn Regehr #include "ReduceUsingSimplifyCFG.h"
152f1fa624SJohn Regehr #include "llvm/Analysis/TargetTransformInfo.h"
1608d1c43cSMatt Arsenault #include "llvm/IR/Constants.h"
1708d1c43cSMatt Arsenault #include "llvm/IR/Instructions.h"
182f1fa624SJohn Regehr #include "llvm/Transforms/Utils/Local.h"
192f1fa624SJohn Regehr
202f1fa624SJohn Regehr using namespace llvm;
212f1fa624SJohn Regehr
reduceUsingSimplifyCFG(Oracle & O,ReducerWorkItem & WorkItem)22*23cc36e4SMatt Arsenault static void reduceUsingSimplifyCFG(Oracle &O, ReducerWorkItem &WorkItem) {
23*23cc36e4SMatt Arsenault Module &Program = WorkItem.getModule();
242f1fa624SJohn Regehr SmallVector<BasicBlock *, 16> ToSimplify;
252f1fa624SJohn Regehr for (auto &F : Program)
262f1fa624SJohn Regehr for (auto &BB : F)
272f1fa624SJohn Regehr if (!O.shouldKeep())
282f1fa624SJohn Regehr ToSimplify.push_back(&BB);
292f1fa624SJohn Regehr TargetTransformInfo TTI(Program.getDataLayout());
302f1fa624SJohn Regehr for (auto *BB : ToSimplify)
312f1fa624SJohn Regehr simplifyCFG(BB, TTI);
322f1fa624SJohn Regehr }
332f1fa624SJohn Regehr
reduceUsingSimplifyCFGDeltaPass(TestRunner & Test)342f1fa624SJohn Regehr void llvm::reduceUsingSimplifyCFGDeltaPass(TestRunner &Test) {
352592ccdeSArthur Eubanks runDeltaPass(Test, reduceUsingSimplifyCFG, "Reducing using SimplifyCFG");
362f1fa624SJohn Regehr }
reduceConditionals(Oracle & O,ReducerWorkItem & WorkItem,bool Direction)37*23cc36e4SMatt Arsenault static void reduceConditionals(Oracle &O, ReducerWorkItem &WorkItem,
38*23cc36e4SMatt Arsenault bool Direction) {
39*23cc36e4SMatt Arsenault Module &M = WorkItem.getModule();
4008d1c43cSMatt Arsenault SmallVector<BasicBlock *, 16> ToSimplify;
4108d1c43cSMatt Arsenault
4208d1c43cSMatt Arsenault for (auto &F : M) {
4308d1c43cSMatt Arsenault for (auto &BB : F) {
4408d1c43cSMatt Arsenault auto *BR = dyn_cast<BranchInst>(BB.getTerminator());
4508d1c43cSMatt Arsenault if (!BR || !BR->isConditional() || O.shouldKeep())
4608d1c43cSMatt Arsenault continue;
4708d1c43cSMatt Arsenault
4808d1c43cSMatt Arsenault if (Direction)
4908d1c43cSMatt Arsenault BR->setCondition(ConstantInt::getTrue(BR->getContext()));
5008d1c43cSMatt Arsenault else
5108d1c43cSMatt Arsenault BR->setCondition(ConstantInt::getFalse(BR->getContext()));
5208d1c43cSMatt Arsenault
5308d1c43cSMatt Arsenault ToSimplify.push_back(&BB);
5408d1c43cSMatt Arsenault }
5508d1c43cSMatt Arsenault }
5608d1c43cSMatt Arsenault
5708d1c43cSMatt Arsenault TargetTransformInfo TTI(M.getDataLayout());
5808d1c43cSMatt Arsenault for (auto *BB : ToSimplify)
5908d1c43cSMatt Arsenault simplifyCFG(BB, TTI);
6008d1c43cSMatt Arsenault }
6108d1c43cSMatt Arsenault
reduceConditionalsTrueDeltaPass(TestRunner & Test)6208d1c43cSMatt Arsenault void llvm::reduceConditionalsTrueDeltaPass(TestRunner &Test) {
6308d1c43cSMatt Arsenault runDeltaPass(
64*23cc36e4SMatt Arsenault Test,
65*23cc36e4SMatt Arsenault [](Oracle &O, ReducerWorkItem &WorkItem) {
66*23cc36e4SMatt Arsenault reduceConditionals(O, WorkItem, true);
67*23cc36e4SMatt Arsenault },
6808d1c43cSMatt Arsenault "Reducing conditional branches to true");
6908d1c43cSMatt Arsenault }
7008d1c43cSMatt Arsenault
reduceConditionalsFalseDeltaPass(TestRunner & Test)7108d1c43cSMatt Arsenault void llvm::reduceConditionalsFalseDeltaPass(TestRunner &Test) {
7208d1c43cSMatt Arsenault runDeltaPass(
73*23cc36e4SMatt Arsenault Test,
74*23cc36e4SMatt Arsenault [](Oracle &O, ReducerWorkItem &WorkItem) {
75*23cc36e4SMatt Arsenault reduceConditionals(O, WorkItem, false);
76*23cc36e4SMatt Arsenault },
7708d1c43cSMatt Arsenault "Reducing conditional branches to false");
7808d1c43cSMatt Arsenault }
79