diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-01-31 23:48:40 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-01-31 23:48:40 +0000 |
commit | 2a46d810387abcc29ce4ca28d27aab02e7a94e37 (patch) | |
tree | 0dbe0a87044a525bbfe85bb4a062886ae9b9009b /llvm/lib/Transforms | |
parent | 1575cb893c5f1c8c5984a577bb239e4ecbad0796 (diff) | |
download | bcm5719-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.cpp | 9 |
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)) { |