mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-13 14:46:53 +00:00
b5f662fa03
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21425 91177308-0d34-0410-b5e6-96231b3b80d8
96 lines
3.4 KiB
C++
96 lines
3.4 KiB
C++
//===-- AllocInfo.h - Store info about regalloc decisions -------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file was developed by the LLVM research group and is distributed under
|
|
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This header file contains the data structure used to save the state
|
|
// of the global, graph-coloring register allocator.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef ALLOCINFO_H
|
|
#define ALLOCINFO_H
|
|
|
|
#include "llvm/Type.h"
|
|
#include "llvm/DerivedTypes.h"
|
|
#include "llvm/Constants.h"
|
|
|
|
namespace llvm {
|
|
|
|
/// AllocInfo - Structure representing one instruction's operand's-worth of
|
|
/// register allocation state. We create tables made out of these data
|
|
/// structures to generate mapping information for this register allocator.
|
|
///
|
|
struct AllocInfo {
|
|
int Instruction; // (-1 if Argument, or 0 .. n - 1 for an instruction).
|
|
int Operand; // (-1 if Instruction, or 0 .. n-1 for an operand).
|
|
enum AllocStateTy { NotAllocated = 0, Allocated, Spilled };
|
|
AllocStateTy AllocState;
|
|
int Placement;
|
|
|
|
AllocInfo (int Inst_, int Op_, AllocStateTy State_, int Place_) :
|
|
Instruction(Inst_), Operand(Op_), AllocState(State_), Placement(Place_) { }
|
|
|
|
/// AllocInfo constructor -- Default constructor creates an invalid AllocInfo
|
|
/// (presumably to be replaced with something meaningful later).
|
|
///
|
|
AllocInfo () :
|
|
Instruction(-1), Operand(-1), AllocState(NotAllocated), Placement(-1) { }
|
|
|
|
/// getConstantType - Return a StructType representing an AllocInfo object.
|
|
///
|
|
static StructType *getConstantType () {
|
|
std::vector<const Type *> TV;
|
|
TV.push_back (Type::IntTy);
|
|
TV.push_back (Type::IntTy);
|
|
TV.push_back (Type::UIntTy);
|
|
TV.push_back (Type::IntTy);
|
|
return StructType::get (TV);
|
|
}
|
|
|
|
/// toConstant - Convert this AllocInfo into an LLVM Constant of type
|
|
/// getConstantType(), and return the Constant.
|
|
///
|
|
Constant *toConstant () const {
|
|
StructType *ST = getConstantType ();
|
|
std::vector<Constant *> CV;
|
|
CV.push_back (ConstantSInt::get (Type::IntTy, Instruction));
|
|
CV.push_back (ConstantSInt::get (Type::IntTy, Operand));
|
|
CV.push_back (ConstantUInt::get (Type::UIntTy, AllocState));
|
|
CV.push_back (ConstantSInt::get (Type::IntTy, Placement));
|
|
return ConstantStruct::get (ST, CV);
|
|
}
|
|
|
|
/// AllocInfos compare equal if the allocation placements are equal
|
|
/// (i.e., they can be equal even if they refer to operands from two
|
|
/// different instructions.)
|
|
///
|
|
bool operator== (const AllocInfo &X) const {
|
|
return (X.AllocState == AllocState) && (X.Placement == Placement);
|
|
}
|
|
bool operator!= (const AllocInfo &X) const { return !(*this == X); }
|
|
|
|
/// Returns a human-readable string representation of the AllocState member.
|
|
///
|
|
const std::string allocStateToString () const {
|
|
static const char *AllocStateNames[] =
|
|
{ "NotAllocated", "Allocated", "Spilled" };
|
|
return std::string (AllocStateNames[AllocState]);
|
|
}
|
|
};
|
|
|
|
static inline std::ostream &operator << (std::ostream &OS, AllocInfo &S) {
|
|
OS << "(Instruction " << S.Instruction << " Operand " << S.Operand
|
|
<< " AllocState " << S.allocStateToString () << " Placement "
|
|
<< S.Placement << ")";
|
|
return OS;
|
|
}
|
|
|
|
} // End llvm namespace
|
|
|
|
#endif // ALLOCINFO_H
|