mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-04 18:06:49 +00:00
Clean up some code around the store V, (cast P) -> store (cast V), P
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
This commit is contained in:
parent
b5f378e11b
commit
7515396096
@ -8186,23 +8186,29 @@ static Instruction *InstCombineStoreToCast(InstCombiner &IC, StoreInst &SI) {
|
|||||||
IC.getTargetData().getTypeSize(DestPTy)) {
|
IC.getTargetData().getTypeSize(DestPTy)) {
|
||||||
|
|
||||||
// Okay, we are casting from one integer or pointer type to another of
|
// 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 same size. Instead of casting the pointer before
|
||||||
// the value to be stored.
|
// the store, cast the value to be stored.
|
||||||
Value *NewCast;
|
Value *NewCast;
|
||||||
Instruction::CastOps opcode = Instruction::BitCast;
|
|
||||||
Value *SIOp0 = SI.getOperand(0);
|
Value *SIOp0 = SI.getOperand(0);
|
||||||
if (isa<PointerType>(SrcPTy)) {
|
Instruction::CastOps opcode = Instruction::BitCast;
|
||||||
if (SIOp0->getType()->isInteger())
|
const Type* CastSrcTy = SIOp0->getType();
|
||||||
|
const Type* CastDstTy = SrcPTy;
|
||||||
|
if (isa<PointerType>(CastDstTy)) {
|
||||||
|
if (CastSrcTy->isInteger())
|
||||||
opcode = Instruction::IntToPtr;
|
opcode = Instruction::IntToPtr;
|
||||||
} else if (SrcPTy->isInteger()) {
|
} else if (const IntegerType* DITy = dyn_cast<IntegerType>(CastDstTy)) {
|
||||||
if (isa<PointerType>(SIOp0->getType()))
|
if (isa<PointerType>(SIOp0->getType()))
|
||||||
opcode = Instruction::PtrToInt;
|
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))
|
if (Constant *C = dyn_cast<Constant>(SIOp0))
|
||||||
NewCast = ConstantExpr::getCast(opcode, C, SrcPTy);
|
NewCast = ConstantExpr::getCast(opcode, C, CastDstTy);
|
||||||
else
|
else
|
||||||
NewCast = IC.InsertNewInstBefore(
|
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);
|
return new StoreInst(NewCast, CastOp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user