From b6ce6e5dacbc29b68a0263ddcf9b3c2705f766af Mon Sep 17 00:00:00 2001 From: Artur Pilipenko Date: Wed, 28 Sep 2016 17:57:16 +0000 Subject: Don't look through addrspacecast in GetPointerBaseWithConstantOffset Pointers in different addrspaces can have different sizes, so it's not valid to look through addrspace cast calculating base and offset for a value. This is similar to D13008. Reviewed By: reames Differential Revision: https://reviews.llvm.org/D24729 llvm-svn: 282612 --- llvm/lib/Analysis/ValueTracking.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'llvm/lib') diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 7983240c3dd..e409edb28fd 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2848,9 +2848,14 @@ Value *llvm::GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, ByteOffset += GEPOffset; Ptr = GEP->getPointerOperand(); - } else if (Operator::getOpcode(Ptr) == Instruction::BitCast || - Operator::getOpcode(Ptr) == Instruction::AddrSpaceCast) { + } else if (Operator::getOpcode(Ptr) == Instruction::BitCast) { Ptr = cast(Ptr)->getOperand(0); + } else if (AddrSpaceCastInst *ASCI = dyn_cast(Ptr)) { + Value *SourcePtr = ASCI->getPointerOperand(); + // Don't look through addrspace cast which changes pointer size + if (BitWidth != DL.getPointerTypeSizeInBits(SourcePtr->getType())) + break; + Ptr = SourcePtr; } else if (GlobalAlias *GA = dyn_cast(Ptr)) { if (GA->isInterposable()) break; -- cgit v1.2.3