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/Scalar | |
| 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/Scalar')
| -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)) {  | 

