xref: /llvm-project/llvm/tools/llvm-reduce/deltas/ReduceAliases.cpp (revision abf44b5b1dbff845a59a7be0c57553cbfd6c4f4c)
1 //===- ReduceAliases.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 aliases in the provided Module.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "ReduceAliases.h"
15 #include "Delta.h"
16 #include "Utils.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/GlobalValue.h"
19 #include "llvm/Transforms/Utils/ModuleUtils.h"
20 
21 using namespace llvm;
22 
23 /// Removes all aliases aren't inside any of the
24 /// desired Chunks.
extractAliasesFromModule(Oracle & O,ReducerWorkItem & Program)25 static void extractAliasesFromModule(Oracle &O, ReducerWorkItem &Program) {
26   for (auto &GA : make_early_inc_range(Program.getModule().aliases())) {
27     if (!O.shouldKeep()) {
28       GA.replaceAllUsesWith(GA.getAliasee());
29       GA.eraseFromParent();
30     }
31   }
32 }
33 
extractIFuncsFromModule(Oracle & O,ReducerWorkItem & WorkItem)34 static void extractIFuncsFromModule(Oracle &O, ReducerWorkItem &WorkItem) {
35   Module &Mod = WorkItem.getModule();
36 
37   std::vector<GlobalIFunc *> IFuncs;
38   for (GlobalIFunc &GI : Mod.ifuncs()) {
39     if (!O.shouldKeep())
40       IFuncs.push_back(&GI);
41   }
42 
43   if (!IFuncs.empty())
44     lowerGlobalIFuncUsersAsGlobalCtor(Mod, IFuncs);
45 }
46 
reduceAliasesDeltaPass(TestRunner & Test)47 void llvm::reduceAliasesDeltaPass(TestRunner &Test) {
48   runDeltaPass(Test, extractAliasesFromModule, "Reducing Aliases");
49 }
50 
reduceIFuncsDeltaPass(TestRunner & Test)51 void llvm::reduceIFuncsDeltaPass(TestRunner &Test) {
52   runDeltaPass(Test, extractIFuncsFromModule, "Reducing Ifuncs");
53 }
54