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 Arsenaultstatic 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 Arsenaultstatic 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 Arsenaultvoid llvm::reduceInvokesDeltaPass(TestRunner &Test) { 40a455c916SMatt Arsenault runDeltaPass(Test, reduceInvokesInModule, "Reducing Invokes"); 41a455c916SMatt Arsenault } 42