1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00

Implement InstCombine/cast-propagate.ll

llvm-svn: 12784
This commit is contained in:
Chris Lattner 2004-04-08 20:39:49 +00:00
parent 37981ce1ff
commit 0ca3cbfa5e

View File

@ -2639,6 +2639,27 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
if (GV->isConstant() && !GV->isExternal())
if (Constant *V = GetGEPGlobalInitializer(GV->getInitializer(), CE))
return ReplaceInstUsesWith(LI, V);
// load (cast X) --> cast (load X) iff safe
if (CastInst *CI = dyn_cast<CastInst>(Op)) {
const Type *DestPTy = cast<PointerType>(CI->getType())->getElementType();
if (const PointerType *SrcTy =
dyn_cast<PointerType>(CI->getOperand(0)->getType())) {
const Type *SrcPTy = SrcTy->getElementType();
if (TD->getTypeSize(SrcPTy) == TD->getTypeSize(DestPTy) &&
(SrcPTy->isInteger() || isa<PointerType>(SrcPTy)) &&
(DestPTy->isInteger() || isa<PointerType>(DestPTy))) {
// Okay, we are casting from one integer or pointer type to another of
// the same size. Instead of casting the pointer before the load, cast
// the result of the loaded value.
Value *NewLoad = InsertNewInstBefore(new LoadInst(CI->getOperand(0),
CI->getName()), LI);
// Now cast the result of the load.
return new CastInst(NewLoad, LI.getType());
}
}
}
return 0;
}