summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2017-01-31 23:48:40 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2017-01-31 23:48:40 +0000
commit2a46d810387abcc29ce4ca28d27aab02e7a94e37 (patch)
tree0dbe0a87044a525bbfe85bb4a062886ae9b9009b /llvm/lib/Transforms
parent1575cb893c5f1c8c5984a577bb239e4ecbad0796 (diff)
downloadbcm5719-llvm-2a46d810387abcc29ce4ca28d27aab02e7a94e37.tar.gz
bcm5719-llvm-2a46d810387abcc29ce4ca28d27aab02e7a94e37.zip
InferAddressSpaces: Fix broken casting of constants
llvm-svn: 293718
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
index 279bec7cf8f..8a8f82af82c 100644
--- a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
+++ b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
@@ -675,10 +675,15 @@ static bool handleMemIntrinsicPtrUse(MemIntrinsic *MI,
// \p returns true if it is OK to change the address space of constant \p C with
// a ConstantExpr addrspacecast.
bool InferAddressSpaces::isSafeToCastConstAddrSpace(Constant *C, unsigned NewAS) const {
- if (C->getType()->getPointerAddressSpace() == NewAS)
+ unsigned SrcAS = C->getType()->getPointerAddressSpace();
+ if (SrcAS == NewAS || isa<UndefValue>(C))
return true;
- if (isa<UndefValue>(C) || isa<ConstantPointerNull>(C))
+ // Prevent illegal casts between different non-flat address spaces.
+ if (SrcAS != FlatAddrSpace && NewAS != FlatAddrSpace)
+ return false;
+
+ if (isa<ConstantPointerNull>(C))
return true;
if (auto *Op = dyn_cast<Operator>(C)) {
OpenPOWER on IntegriCloud