// Entry == 0 ==> no immediate constant field exists at all.
// Entry > 0 ==> abs(immediate constant) <= Entry
//
-vector<unsigned int> MaxConstantsTable(Instruction::NumOtherOps);
+vector<int> MaxConstantsTable(Instruction::OtherOpsEnd);
static int
MaxConstantForInstr(unsigned llvmOpCode)
{
int modelOpCode = -1;
- if (llvmOpCode >= Instruction::FirstBinaryOp &&
- llvmOpCode < Instruction::NumBinaryOps)
+ if (llvmOpCode >= Instruction::BinaryOpsBegin &&
+ llvmOpCode < Instruction::BinaryOpsEnd)
modelOpCode = ADD;
else
switch(llvmOpCode) {
InitializeMaxConstantsTable()
{
unsigned op;
- assert(MaxConstantsTable.size() == Instruction::NumOtherOps &&
+ assert(MaxConstantsTable.size() == Instruction::OtherOpsEnd &&
"assignments below will be illegal!");
- for (op = Instruction::FirstTermOp; op < Instruction::NumTermOps; ++op)
+ for (op = Instruction::TermOpsBegin; op < Instruction::TermOpsEnd; ++op)
MaxConstantsTable[op] = MaxConstantForInstr(op);
- for (op = Instruction::FirstBinaryOp; op < Instruction::NumBinaryOps; ++op)
+ for (op = Instruction::BinaryOpsBegin; op < Instruction::BinaryOpsEnd; ++op)
MaxConstantsTable[op] = MaxConstantForInstr(op);
- for (op = Instruction::FirstMemoryOp; op < Instruction::NumMemoryOps; ++op)
+ for (op = Instruction::MemoryOpsBegin; op < Instruction::MemoryOpsEnd; ++op)
MaxConstantsTable[op] = MaxConstantForInstr(op);
- for (op = Instruction::FirstOtherOp; op < Instruction::NumOtherOps; ++op)
+ for (op = Instruction::OtherOpsBegin; op < Instruction::OtherOpsEnd; ++op)
MaxConstantsTable[op] = MaxConstantForInstr(op);
}
return false;
if (const ConstantUInt* U = dyn_cast<ConstantUInt>(CV))
- return (U->getValue() > MaxConstantsTable[I->getOpcode()]);
+ /* Large unsigned longs may really just be small negative signed longs */
+ return (labs((int64_t) U->getValue()) > MaxConstantsTable[I->getOpcode()]);
if (const ConstantSInt* S = dyn_cast<ConstantSInt>(CV))
- return (labs(S->getValue()) > (int) MaxConstantsTable[I->getOpcode()]);
+ return (labs(S->getValue()) > MaxConstantsTable[I->getOpcode()]);
if (isa<ConstantBool>(CV))
- return (1U > MaxConstantsTable[I->getOpcode()]);
+ return (1 > MaxConstantsTable[I->getOpcode()]);
return true;
}
//
const Type* valType = val->getType();
+ // Unfortunate special case: a ConstantPointerRef is just a
+ // reference to GlobalValue.
+ if (isa<ConstantPointerRef>(val))
+ val = cast<ConstantPointerRef>(val)->getValue();
+
if (isa<GlobalValue>(val))
{
TmpInstruction* tmpReg =