For PR950:

The long awaited CAST patch. This introduces 12 new instructions into LLVM
to replace the cast instruction. Corresponding changes throughout LLVM are
provided. This passes llvm-test, llvm/test, and SPEC CPUINT2000 with the
exception of 175.vpr which fails only on a slight floating point output
difference.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31931 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reid Spencer
2006-11-27 01:05:10 +00:00
parent 5fed9b9044
commit 3da59db637
105 changed files with 6737 additions and 3700 deletions

View File

@@ -240,7 +240,7 @@ DSNodeHandle GraphBuilder::getValueDest(Value &Val) {
N->addGlobal(GV);
} else if (Constant *C = dyn_cast<Constant>(V)) {
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
if (CE->getOpcode() == Instruction::Cast) {
if (CE->isCast()) {
if (isa<PointerType>(CE->getOperand(0)->getType()))
NH = getValueDest(*CE->getOperand(0));
else
@@ -1091,20 +1091,27 @@ void GraphBuilder::visitFreeInst(FreeInst &FI) {
/// Handle casts...
void GraphBuilder::visitCastInst(CastInst &CI) {
if (isPointerType(CI.getType()))
if (isPointerType(CI.getOperand(0)->getType())) {
DSNodeHandle Ptr = getValueDest(*CI.getOperand(0));
if (Ptr.getNode() == 0) return;
// Cast one pointer to the other, just act like a copy instruction
setDestTo(CI, Ptr);
} else {
// Cast something (floating point, small integer) to a pointer. We need
// to track the fact that the node points to SOMETHING, just something we
// don't know about. Make an "Unknown" node.
//
setDestTo(CI, createNode()->setUnknownNodeMarker());
}
// Pointers can only be cast with BitCast so check that the instruction
// is a BitConvert. If not, its guaranteed not to involve any pointers so
// we don't do anything.
switch (CI.getOpcode()) {
default: break;
case Instruction::BitCast:
case Instruction::IntToPtr:
if (isPointerType(CI.getType()))
if (isPointerType(CI.getOperand(0)->getType())) {
DSNodeHandle Ptr = getValueDest(*CI.getOperand(0));
if (Ptr.getNode() == 0) return;
// Cast one pointer to the other, just act like a copy instruction
setDestTo(CI, Ptr);
} else {
// Cast something (floating point, small integer) to a pointer. We
// need to track the fact that the node points to SOMETHING, just
// something we don't know about. Make an "Unknown" node.
setDestTo(CI, createNode()->setUnknownNodeMarker());
}
break;
}
}