1. Add a bottom-up pass on BURG trees that is used to fix constant operands.

Needs to be bottom up because constant values may be forward-substituted
   to their uses (i.e., into the parent in the BURG tree).
2. Move most of the constant-fixup code into machine-indepedent file
   InstrSelectionSupport.cpp.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@860 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Vikram S. Adve 2001-10-17 23:59:09 +00:00
parent 6d35326cd5
commit f60b1f479f
2 changed files with 42 additions and 1 deletions

View File

@ -29,6 +29,8 @@ class TargetMachine;
const unsigned MAX_INSTR_PER_VMINSTR = 8;
const Instruction::OtherOps TMP_INSTRUCTION_OPCODE = Instruction::UserOp1;
extern unsigned GetInstructionsByRule (InstructionNode* subtreeRoot,
int ruleForNode,
short* nts,
@ -74,7 +76,8 @@ public:
TmpInstruction(OtherOps Opcode, Value *S1, Value* S2, const string &Name = "")
: Instruction(S1->getType(), Opcode, Name)
{
assert(Opcode == UserOp1 && "Tmp instruction opcode invalid!");
assert(Opcode == TMP_INSTRUCTION_OPCODE &&
"Tmp instruction opcode invalid!");
Operands.reserve(S2? 2 : 1);
Operands.push_back(Use(S1, this));
if (S2)

View File

@ -27,6 +27,23 @@ class TargetMachine;
//************************ Exported Functions ******************************/
//---------------------------------------------------------------------------
// Function GetConstantValueAsSignedInt
//
// Convenience function to get the value of an integer constant, for an
// appropriate integer or non-integer type that can be held in an integer.
// The type of the argument must be the following:
// Signed or unsigned integer
// Boolean
// Pointer
//
// isValidConstant is set to true if a valid constant was found.
//---------------------------------------------------------------------------
int64_t GetConstantValueAsSignedInt (const Value *V,
bool &isValidConstant);
//---------------------------------------------------------------------------
// Function: FoldGetElemChain
//
@ -97,6 +114,27 @@ MachineOperand::MachineOperandType
unsigned int& getMachineRegNum,
int64_t& getImmedValue);
//---------------------------------------------------------------------------
// Function: FixConstantOperandsForInstr
//
// Purpose:
// Special handling for constant operands of a machine instruction
// -- if the constant is 0, use the hardwired 0 register, if any;
// -- if the constant fits in the IMMEDIATE field, use that field;
// -- else create instructions to put the constant into a register, either
// directly or by loading explicitly from the constant pool.
//
// In the first 2 cases, the operand of `minstr' is modified in place.
// Returns a vector of machine instructions generated for operands that
// fall under case 3; these must be inserted before `minstr'.
//---------------------------------------------------------------------------
vector<MachineInstr*> FixConstantOperandsForInstr (Instruction* vmInstr,
MachineInstr* minstr,
TargetMachine& target);
//**************************************************************************/
#endif