[llvm-commits] [llvm] r61980 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/bitcast-gep.ll
Duncan Sands
baldrick at free.fr
Fri Jan 9 01:19:33 PST 2009
Hi Chris,
> + // Start with the index over the outer type. Note that the type size
> + // might be zero (even if the offset isn't zero) if the indexed type
> + // is something like [0 x {int, int}]
if the type size is zero, I don't see how you can do anything unless
Offset is zero. So how about handling the zero size case entirely
here and bailing out?
> + // Handle silly modulus not returning values values [0..TySize).
values values -> values
Also, you would have to do something here anyway to correct FirstIdx,
but I see you don't complain about silly division :)
> + assert((uint64_t)Offset < (uint64_t)TySize && "Out of range offset");
How about checking that FirstIdx * TySize + Offset == original offset?
> + unsigned Elt = SL->getElementContainingOffset(Offset);
Does this work correct if the offset is pointing into alignment padding?
> + if (uint64_t EltSize = TD->getABITypeSize(STy->getElementType())) {
> + NewIndices.push_back(ConstantInt::get(IntPtrTy,Offset/EltSize));
> + Offset %= EltSize;
> + } else {
> + NewIndices.push_back(ConstantInt::get(IntPtrTy, 0));
If EltSize is zero then aren't you dead unless Offset = 0?
> + // If we were able to index down into an element, create the GEP
> + // and bitcast the result. This eliminates one bitcast, potentially
> + // two.
Doesn't it turn GEP(bitcast) into bitcast(GEP)? If so, it doesn't remove a
bitcast.
Ciao,
Duncan.
More information about the llvm-commits
mailing list