1 //===- ReduceVirtualRegisters.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 simplify virtual registers in MIR.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "ReduceVirtualRegisters.h"
15 #include "Delta.h"
16 #include "llvm/CodeGen/MachineRegisterInfo.h"
17 
18 using namespace llvm;
19 
dropRegisterHintsFromFunction(Oracle & O,MachineFunction & MF)20 static void dropRegisterHintsFromFunction(Oracle &O, MachineFunction &MF) {
21   MachineRegisterInfo &MRI = MF.getRegInfo();
22   for (unsigned I = 0, E = MRI.getNumVirtRegs(); I != E; ++I) {
23     Register Reg = Register::index2VirtReg(I);
24 
25     const std::pair<Register, SmallVector<Register, 4>> &Hints =
26         MRI.getRegAllocationHints(Reg);
27     if (Hints.second.empty())
28       continue;
29 
30     if (!O.shouldKeep())
31       MRI.clearSimpleHint(Reg);
32   }
33 }
34 
dropRegisterHintsFromFunctions(Oracle & O,ReducerWorkItem & WorkItem)35 static void dropRegisterHintsFromFunctions(Oracle &O,
36                                            ReducerWorkItem &WorkItem) {
37   for (const Function &F : WorkItem.getModule()) {
38     if (auto *MF = WorkItem.MMI->getMachineFunction(F))
39       dropRegisterHintsFromFunction(O, *MF);
40   }
41 }
42 
reduceVirtualRegisterHintsDeltaPass(TestRunner & Test)43 void llvm::reduceVirtualRegisterHintsDeltaPass(TestRunner &Test) {
44   outs() << "*** Reducing virtual register hints from functions...\n";
45   runDeltaPass(Test, dropRegisterHintsFromFunctions);
46 }
47