Allwo bitcast + struct GEP transform to work with addrspacecast
llvm-svn: 215467
This commit is contained in:
@@ -1667,6 +1667,18 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
||||
if (!DL)
|
||||
return nullptr;
|
||||
|
||||
// addrspacecast between types is canonicalized as a bitcast, then an
|
||||
// addrspacecast. To take advantage of the below bitcast + struct GEP, look
|
||||
// through the addrspacecast.
|
||||
if (AddrSpaceCastInst *ASC = dyn_cast<AddrSpaceCastInst>(PtrOp)) {
|
||||
// X = bitcast A addrspace(1)* to B addrspace(1)*
|
||||
// Y = addrspacecast A addrspace(1)* to B addrspace(2)*
|
||||
// Z = gep Y, <...constant indices...>
|
||||
// Into an addrspacecasted GEP of the struct.
|
||||
if (BitCastInst *BC = dyn_cast<BitCastInst>(ASC->getOperand(0)))
|
||||
PtrOp = BC;
|
||||
}
|
||||
|
||||
/// See if we can simplify:
|
||||
/// X = bitcast A* to B*
|
||||
/// Y = gep X, <...constant indices...>
|
||||
@@ -1675,11 +1687,10 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
||||
if (BitCastInst *BCI = dyn_cast<BitCastInst>(PtrOp)) {
|
||||
Value *Operand = BCI->getOperand(0);
|
||||
PointerType *OpType = cast<PointerType>(Operand->getType());
|
||||
unsigned OffsetBits = DL->getPointerTypeSizeInBits(OpType);
|
||||
unsigned OffsetBits = DL->getPointerTypeSizeInBits(GEP.getType());
|
||||
APInt Offset(OffsetBits, 0);
|
||||
if (!isa<BitCastInst>(Operand) &&
|
||||
GEP.accumulateConstantOffset(*DL, Offset) &&
|
||||
StrippedPtrTy->getAddressSpace() == GEP.getPointerAddressSpace()) {
|
||||
GEP.accumulateConstantOffset(*DL, Offset)) {
|
||||
|
||||
// If this GEP instruction doesn't move the pointer, just replace the GEP
|
||||
// with a bitcast of the real input to the dest type.
|
||||
@@ -1697,6 +1708,9 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
||||
return &GEP;
|
||||
}
|
||||
}
|
||||
|
||||
if (Operand->getType()->getPointerAddressSpace() != GEP.getAddressSpace())
|
||||
return new AddrSpaceCastInst(Operand, GEP.getType());
|
||||
return new BitCastInst(Operand, GEP.getType());
|
||||
}
|
||||
|
||||
@@ -1712,6 +1726,9 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
||||
if (NGEP->getType() == GEP.getType())
|
||||
return ReplaceInstUsesWith(GEP, NGEP);
|
||||
NGEP->takeName(&GEP);
|
||||
|
||||
if (NGEP->getType()->getPointerAddressSpace() != GEP.getAddressSpace())
|
||||
return new AddrSpaceCastInst(NGEP, GEP.getType());
|
||||
return new BitCastInst(NGEP, GEP.getType());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user