mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-13 01:15:32 +00:00
Turn casts into getelementptr's when possible. This enables SROA to be more
aggressive in some cases where LLVMGCC 4 is inserting casts for no reason. This implements InstCombine/cast.ll:test27/28. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27620 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1c62195c98
commit
9fb9213083
@ -4814,6 +4814,29 @@ Instruction *InstCombiner::visitCastInst(CastInst &CI) {
|
|||||||
if (Instruction *NV = FoldOpIntoPhi(CI))
|
if (Instruction *NV = FoldOpIntoPhi(CI))
|
||||||
return NV;
|
return NV;
|
||||||
|
|
||||||
|
// If the source and destination are pointers, and this cast is equivalent to
|
||||||
|
// a getelementptr X, 0, 0, 0... turn it into the appropriate getelementptr.
|
||||||
|
// This can enhance SROA and other transforms that want type-safe pointers.
|
||||||
|
if (const PointerType *DstPTy = dyn_cast<PointerType>(CI.getType()))
|
||||||
|
if (const PointerType *SrcPTy = dyn_cast<PointerType>(Src->getType())) {
|
||||||
|
const Type *DstTy = DstPTy->getElementType();
|
||||||
|
const Type *SrcTy = SrcPTy->getElementType();
|
||||||
|
|
||||||
|
Constant *ZeroUInt = Constant::getNullValue(Type::UIntTy);
|
||||||
|
unsigned NumZeros = 0;
|
||||||
|
while (SrcTy != DstTy &&
|
||||||
|
isa<CompositeType>(SrcTy) && !isa<PointerType>(SrcTy)) {
|
||||||
|
SrcTy = cast<CompositeType>(SrcTy)->getTypeAtIndex(ZeroUInt);
|
||||||
|
++NumZeros;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we found a path from the src to dest, create the getelementptr now.
|
||||||
|
if (SrcTy == DstTy) {
|
||||||
|
std::vector<Value*> Idxs(NumZeros+1, ZeroUInt);
|
||||||
|
return new GetElementPtrInst(Src, Idxs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If the source value is an instruction with only this use, we can attempt to
|
// If the source value is an instruction with only this use, we can attempt to
|
||||||
// propagate the cast into the instruction. Also, only handle integral types
|
// propagate the cast into the instruction. Also, only handle integral types
|
||||||
// for now.
|
// for now.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user