xref: /llvm-project/llvm/tools/llvm-reduce/deltas/ReduceInvokes.cpp (revision 333ffafb4500cad19aec81e841686ade1f31f67f)
1a455c916SMatt Arsenault //===- ReduceInvokes.cpp - Specialized Delta Pass -------------------------===//
2a455c916SMatt Arsenault //
3a455c916SMatt Arsenault // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a455c916SMatt Arsenault // See https://llvm.org/LICENSE.txt for license information.
5a455c916SMatt Arsenault // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a455c916SMatt Arsenault //
7a455c916SMatt Arsenault //===----------------------------------------------------------------------===//
8a455c916SMatt Arsenault //
9a455c916SMatt Arsenault // Try to replace invokes with calls.
10a455c916SMatt Arsenault //
11a455c916SMatt Arsenault //===----------------------------------------------------------------------===//
12a455c916SMatt Arsenault 
13a455c916SMatt Arsenault #include "ReduceInvokes.h"
14a455c916SMatt Arsenault #include "Delta.h"
15a455c916SMatt Arsenault #include "llvm/IR/Instructions.h"
16a455c916SMatt Arsenault #include "llvm/Transforms/Utils/Local.h"
17a455c916SMatt Arsenault 
18*333ffafbSMatt Arsenault using namespace llvm;
19*333ffafbSMatt Arsenault 
reduceInvokesInFunction(Oracle & O,Function & F)20a455c916SMatt Arsenault static void reduceInvokesInFunction(Oracle &O, Function &F) {
21a455c916SMatt Arsenault   for (BasicBlock &BB : F) {
22a455c916SMatt Arsenault     InvokeInst *Invoke = dyn_cast<InvokeInst>(BB.getTerminator());
23a455c916SMatt Arsenault     if (Invoke && !O.shouldKeep())
24a455c916SMatt Arsenault       changeToCall(Invoke);
25a455c916SMatt Arsenault   }
26a455c916SMatt Arsenault 
27a455c916SMatt Arsenault   // TODO: We most likely are leaving behind dead landingpad blocks. Should we
28a455c916SMatt Arsenault   // delete unreachable blocks now, or leave that for the unreachable block
29a455c916SMatt Arsenault   // reduction.
30a455c916SMatt Arsenault }
31a455c916SMatt Arsenault 
reduceInvokesInModule(Oracle & O,ReducerWorkItem & WorkItem)3223cc36e4SMatt Arsenault static void reduceInvokesInModule(Oracle &O, ReducerWorkItem &WorkItem) {
3323cc36e4SMatt Arsenault   for (Function &F : WorkItem.getModule()) {
34a455c916SMatt Arsenault     if (F.hasPersonalityFn())
35a455c916SMatt Arsenault       reduceInvokesInFunction(O, F);
36a455c916SMatt Arsenault   }
37a455c916SMatt Arsenault }
38a455c916SMatt Arsenault 
reduceInvokesDeltaPass(TestRunner & Test)39a455c916SMatt Arsenault void llvm::reduceInvokesDeltaPass(TestRunner &Test) {
40a455c916SMatt Arsenault   runDeltaPass(Test, reduceInvokesInModule, "Reducing Invokes");
41a455c916SMatt Arsenault }
42