Skip to content

Commit

Permalink
Clean up some code around the store V, (cast P) -> store (cast V), P
Browse files Browse the repository at this point in the history
transform. Change some variable names so it is clear what is source and
what is dest of the cast. Also, add an assert to ensure that the integer
to integer case is asserting if the bitwidths are different. This prevents
illegal casts from being formed and catches bitwidth bugs sooner.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33337 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Reid Spencer committed Jan 18, 2007
1 parent b5f378e commit 7515396
Showing 1 changed file with 14 additions and 8 deletions.
22 changes: 14 additions & 8 deletions lib/Transforms/Scalar/InstructionCombining.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8186,23 +8186,29 @@ static Instruction *InstCombineStoreToCast(InstCombiner &IC, StoreInst &SI) {
IC.getTargetData().getTypeSize(DestPTy)) {

// Okay, we are casting from one integer or pointer type to another of
// the same size. Instead of casting the pointer before the store, cast
// the value to be stored.
// the same size. Instead of casting the pointer before
// the store, cast the value to be stored.
Value *NewCast;
Instruction::CastOps opcode = Instruction::BitCast;
Value *SIOp0 = SI.getOperand(0);
if (isa<PointerType>(SrcPTy)) {
if (SIOp0->getType()->isInteger())
Instruction::CastOps opcode = Instruction::BitCast;
const Type* CastSrcTy = SIOp0->getType();
const Type* CastDstTy = SrcPTy;
if (isa<PointerType>(CastDstTy)) {
if (CastSrcTy->isInteger())
opcode = Instruction::IntToPtr;
} else if (SrcPTy->isInteger()) {
} else if (const IntegerType* DITy = dyn_cast<IntegerType>(CastDstTy)) {
if (isa<PointerType>(SIOp0->getType()))
opcode = Instruction::PtrToInt;
else if (const IntegerType* SITy = dyn_cast<IntegerType>(CastSrcTy))
assert(DITy->getBitWidth() == SITy->getBitWidth() &&
"Illegal store instruction");
}
if (Constant *C = dyn_cast<Constant>(SIOp0))
NewCast = ConstantExpr::getCast(opcode, C, SrcPTy);
NewCast = ConstantExpr::getCast(opcode, C, CastDstTy);
else
NewCast = IC.InsertNewInstBefore(
CastInst::create(opcode, SIOp0, SrcPTy, SIOp0->getName()+".c"), SI);
CastInst::create(opcode, SIOp0, CastDstTy, SIOp0->getName()+".c"),
SI);
return new StoreInst(NewCast, CastOp);
}
}
Expand Down

0 comments on commit 7515396

Please sign in to comment.