1//===- ReduceFunctions.cpp - Specialized Delta Pass -----------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements a function which calls the Generic Delta pass in order
10// to reduce functions (and any instruction that calls it) in the provided
11// Module.
12//
13//===----------------------------------------------------------------------===//
14
15#include "ReduceFunctions.h"
16#include "Utils.h"
17#include "llvm/Transforms/Utils/Cloning.h"
18#include "llvm/Transforms/Utils/ModuleUtils.h"
19
20using namespace llvm;
21
22/// Removes all the Defined Functions
23/// that aren't inside any of the desired Chunks.
24void llvm::reduceFunctionsDeltaPass(Oracle &O, ReducerWorkItem &WorkItem) {
25 Module &Program = WorkItem.getModule();
26
27 // Record all out-of-chunk functions.
28 SmallPtrSet<Constant *, 8> FuncsToRemove;
29 for (Function &F : Program.functions()) {
30 // Intrinsics don't have function bodies that are useful to
31 // reduce. Additionally, intrinsics may have additional operand
32 // constraints. But, do drop intrinsics that are not referenced.
33 if ((!F.isIntrinsic() || F.use_empty()) && !hasAliasUse(F) &&
34 !O.shouldKeep())
35 FuncsToRemove.insert(Ptr: &F);
36 }
37
38 removeFromUsedLists(M&: Program, ShouldRemove: [&FuncsToRemove](Constant *C) {
39 return FuncsToRemove.count(Ptr: C);
40 });
41
42 // Then, drop body of each of them. We want to batch this and do nothing else
43 // here so that minimal number of remaining external uses will remain.
44 for (Constant *F : FuncsToRemove)
45 F->dropAllReferences();
46
47 // And finally, we can actually delete them.
48 for (Constant *F : FuncsToRemove) {
49 // Replace all *still* remaining uses with the default value.
50 F->replaceAllUsesWith(V: getDefaultValue(T: F->getType()));
51 // And finally, fully drop it.
52 cast<Function>(Val: F)->eraseFromParent();
53 }
54}
55