diff options
author | Chris Lattner <sabre@nondot.org> | 2004-04-08 20:39:49 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-04-08 20:39:49 +0000 |
commit | e228ee5870e4dd2956efdd4deeb6170202d90f21 (patch) | |
tree | bf142f370444d17a2011c462378feeeafe1d2952 /llvm/lib | |
parent | 22b2166b36fe924013ce11abaa41f77cedc8bd3f (diff) | |
download | bcm5719-llvm-e228ee5870e4dd2956efdd4deeb6170202d90f21.tar.gz bcm5719-llvm-e228ee5870e4dd2956efdd4deeb6170202d90f21.zip |
Implement InstCombine/cast-propagate.ll
llvm-svn: 12784
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index 0bb35348534..6774419e797 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -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; } |