gecko-dev/ef/Compiler/RegisterAllocator/RegisterAllocator.h

100 строки
3.2 KiB
C++
Исходник Ответственный История

Этот файл содержит невидимые символы Юникода!

Этот файл содержит невидимые символы Юникода, которые могут быть отображены не так, как показано ниже. Если это намеренно, можете спокойно проигнорировать это предупреждение. Используйте кнопку Экранировать, чтобы показать скрытые символы.

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#ifndef _REGISTER_ALLOCATOR_H_
#define _REGISTER_ALLOCATOR_H_
#include "RegisterAssigner.h"
#include "Coloring.h"
#include "FastBitMatrix.h"
#include "Spilling.h"
#include "LogModule.h"
class ControlGraph;
class InstructionEmitter;
class VirtualRegisterManager;
class FastBitMatrix;
class Pool;
extern void printGraph(Uint32 nNodes, ControlNode** dfsList);
/*
*--------------------------RegisterAllocator.h----------------------------
*
* class RegisterAllocator --
*
*-----------------------------------------------------------------------
*/
class RegisterAllocator
{
private:
Pool& regAllocPool; // Register Allocation Pool.
/*
* ControlGraph data.
*/
ControlNode** dfsList; // List of the nodes in Depth First Search order.
ControlNode** lndList; // List of the nodes in Loop Nesting Depth order.
PRUint32 nNodes; // Number of nodes in this graph.
VirtualRegisterManager& vRegManager; // Virtual Register Manager for this graph.
MdEmitter& instructionEmitter; // Instruction emitter for this platform.
Coloring registerAssigner; // Register assigner (right now only graph coloring is supported)
Spilling spilling; // Register spilling
FastBitMatrix interferenceMatrix; // Register interference matrix.
/*
* Register Allocation core private methods.
*/
void checkRegisterClassConflicts();
void checkPhiNodesAnnotation();
void buildInterferenceGraph();
bool canCoalesceRegisters(VirtualRegister& inVR, VirtualRegister& outVR, PRUint32& from, PRUint32& to);
void coalesceRegisters(PRUint32 from, PRUint32 to);
void coalesce();
void calculateSpillCosts();
void spillPhiNodes();
bool removePhiNodes();
void updateLocalVariableTable();
#ifdef DEBUG_LOG
void printRegisterDebug(LogModuleObject &f, bool verbose = false);
#endif
public:
/*
* Constructor.
*/
RegisterAllocator(Pool& pool, ControlNode** dfs, ControlNode **lnd, PRUint32 n, VirtualRegisterManager& vrMan, MdEmitter& emitter) :
regAllocPool(pool), dfsList(dfs), lndList(lnd), nNodes(n), vRegManager(vrMan), instructionEmitter(emitter),
registerAssigner(pool, vRegManager), spilling(vrMan, emitter), interferenceMatrix(pool) {}
/*
* Public call for register allocation.
*/
void allocateRegisters();
};
#endif /* _REGISTER_ALLOCATOR_H_ */