173471bf0Spatrick //===- ReduceFunctions.cpp - Specialized Delta Pass -----------------------===//
273471bf0Spatrick //
373471bf0Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
473471bf0Spatrick // See https://llvm.org/LICENSE.txt for license information.
573471bf0Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
673471bf0Spatrick //
773471bf0Spatrick //===----------------------------------------------------------------------===//
873471bf0Spatrick //
973471bf0Spatrick // This file implements a function which calls the Generic Delta pass in order
1073471bf0Spatrick // to reduce function bodies in the provided Module.
1173471bf0Spatrick //
1273471bf0Spatrick //===----------------------------------------------------------------------===//
1373471bf0Spatrick 
1473471bf0Spatrick #include "ReduceFunctionBodies.h"
1573471bf0Spatrick #include "Delta.h"
16*d415bd75Srobert #include "Utils.h"
1773471bf0Spatrick #include "llvm/IR/GlobalValue.h"
18*d415bd75Srobert #include "llvm/IR/Instructions.h"
1973471bf0Spatrick 
2073471bf0Spatrick using namespace llvm;
2173471bf0Spatrick 
2273471bf0Spatrick /// Removes all the bodies of defined functions that aren't inside any of the
2373471bf0Spatrick /// desired Chunks.
extractFunctionBodiesFromModule(Oracle & O,ReducerWorkItem & WorkItem)24*d415bd75Srobert static void extractFunctionBodiesFromModule(Oracle &O,
25*d415bd75Srobert                                             ReducerWorkItem &WorkItem) {
2673471bf0Spatrick   // Delete out-of-chunk function bodies
27*d415bd75Srobert   for (auto &F : WorkItem.getModule()) {
28*d415bd75Srobert     if (!F.isDeclaration() && !hasAliasUse(F) && !O.shouldKeep()) {
2973471bf0Spatrick       F.deleteBody();
3073471bf0Spatrick       F.setComdat(nullptr);
3173471bf0Spatrick     }
3273471bf0Spatrick   }
3373471bf0Spatrick }
3473471bf0Spatrick 
reduceFunctionBodiesDeltaPass(TestRunner & Test)3573471bf0Spatrick void llvm::reduceFunctionBodiesDeltaPass(TestRunner &Test) {
36*d415bd75Srobert   runDeltaPass(Test, extractFunctionBodiesFromModule,
37*d415bd75Srobert                "Reducing Function Bodies");
38*d415bd75Srobert }
39*d415bd75Srobert 
reduceFunctionData(Oracle & O,ReducerWorkItem & WorkItem)40*d415bd75Srobert static void reduceFunctionData(Oracle &O, ReducerWorkItem &WorkItem) {
41*d415bd75Srobert   for (Function &F : WorkItem.getModule()) {
42*d415bd75Srobert     if (F.hasPersonalityFn()) {
43*d415bd75Srobert       if (none_of(F,
44*d415bd75Srobert                   [](const BasicBlock &BB) {
45*d415bd75Srobert                     return BB.isEHPad() || isa<ResumeInst>(BB.getTerminator());
46*d415bd75Srobert                   }) &&
47*d415bd75Srobert           !O.shouldKeep()) {
48*d415bd75Srobert         F.setPersonalityFn(nullptr);
49*d415bd75Srobert       }
50*d415bd75Srobert     }
51*d415bd75Srobert 
52*d415bd75Srobert     if (F.hasPrefixData() && !O.shouldKeep())
53*d415bd75Srobert       F.setPrefixData(nullptr);
54*d415bd75Srobert 
55*d415bd75Srobert     if (F.hasPrologueData() && !O.shouldKeep())
56*d415bd75Srobert       F.setPrologueData(nullptr);
57*d415bd75Srobert   }
58*d415bd75Srobert }
59*d415bd75Srobert 
reduceFunctionDataDeltaPass(TestRunner & Test)60*d415bd75Srobert void llvm::reduceFunctionDataDeltaPass(TestRunner &Test) {
61*d415bd75Srobert   runDeltaPass(Test, reduceFunctionData, "Reducing Function Data");
6273471bf0Spatrick }
63