Teach SCEVExpander::InsertCastOfTo to avoid creating inttoptr-of-ptrtoint

and ptrtoint-of-inttoptr expressions. This fixes a regression in 300.twolf.

llvm-svn: 69293
This commit is contained in:
Dan Gohman 2009-04-16 15:52:57 +00:00
parent 8798bd1bf9
commit 66e038a3e3
2 changed files with 10 additions and 2 deletions

View File

@ -83,8 +83,8 @@ namespace llvm {
/// InsertCastOfTo - Insert a cast of V to the specified type, doing what
/// we can to share the casts.
static Value *InsertCastOfTo(Instruction::CastOps opcode, Value *V,
const Type *Ty);
Value *InsertCastOfTo(Instruction::CastOps opcode, Value *V,
const Type *Ty);
/// InsertBinop - Insert the specified binary operator, doing a small amount
/// of work to avoid inserting an obviously redundant operation.
static Value *InsertBinop(Instruction::BinaryOps Opcode, Value *LHS,

View File

@ -26,6 +26,14 @@ Value *SCEVExpander::InsertCastOfTo(Instruction::CastOps opcode, Value *V,
if (opcode == Instruction::BitCast && V->getType() == Ty)
return V;
// Short-circuit unnecessary inttoptr<->ptrtoint casts.
if (opcode == Instruction::PtrToInt && Ty == TD.getIntPtrType())
if (IntToPtrInst *ITP = dyn_cast<IntToPtrInst>(V))
return ITP->getOperand(0);
if (opcode == Instruction::IntToPtr && V->getType() == TD.getIntPtrType())
if (PtrToIntInst *PTI = dyn_cast<PtrToIntInst>(V))
return PTI->getOperand(0);
// FIXME: keep track of the cast instruction.
if (Constant *C = dyn_cast<Constant>(V))
return ConstantExpr::getCast(opcode, C, Ty);