xref: /llvm-project/llvm/tools/llvm-reduce/deltas/ReduceUsingSimplifyCFG.cpp (revision 23cc36e4765912a1bcdbbc3fb8b0976a06dea043)
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