diff --git a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp index 352a1b331001a..1976baff783fa 100644 --- a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp +++ b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp @@ -1048,7 +1048,8 @@ bool InferAddressSpacesImpl::updateAddressSpace( } else { // Otherwise, infer the address space from its pointer operands. SmallVector ConstantPtrOps; - for (Value *PtrOperand : getPointerOperands(V, *DL, TTI)) { + SmallVector PtrOps = getPointerOperands(V, *DL, TTI); + for (Value *PtrOperand : PtrOps) { auto I = InferredAddrSpace.find(PtrOperand); unsigned OperandAS; if (I == InferredAddrSpace.end()) { @@ -1079,12 +1080,18 @@ bool InferAddressSpacesImpl::updateAddressSpace( if (NewAS == FlatAddrSpace) break; } + if (NewAS != FlatAddrSpace && NewAS != UninitializedAddressSpace) { if (any_of(ConstantPtrOps, [=](Constant *C) { return !isSafeToCastConstAddrSpace(C, NewAS); })) NewAS = FlatAddrSpace; } + + // operator(flat const, flat const, ...) -> flat + if (NewAS == UninitializedAddressSpace && + PtrOps.size() == ConstantPtrOps.size()) + NewAS = FlatAddrSpace; } unsigned OldAS = InferredAddrSpace.lookup(&V); diff --git a/llvm/test/Transforms/InferAddressSpaces/NVPTX/nullptr.ll b/llvm/test/Transforms/InferAddressSpaces/NVPTX/nullptr.ll new file mode 100644 index 0000000000000..af48db7773c42 --- /dev/null +++ b/llvm/test/Transforms/InferAddressSpaces/NVPTX/nullptr.ll @@ -0,0 +1,22 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -S -passes=infer-address-spaces %s | FileCheck %s + +target triple = "nvptx64-unknown-nvidiacl" + +define ptr @pr171890(i1 %c) { +; CHECK-LABEL: define ptr @pr171890( +; CHECK-SAME: i1 [[C:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[STACK:%.*]] = alloca i16, align 2 +; CHECK-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[STACK]] to ptr addrspace(5) +; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr addrspace(5) [[TMP0]] to ptr +; CHECK-NEXT: [[CONST:%.*]] = getelementptr i8, ptr null, i64 1 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], ptr [[TMP1]], ptr [[CONST]] +; CHECK-NEXT: ret ptr [[SEL]] +; +entry: + %stack = alloca i16, align 2 + %const = getelementptr i8, ptr null, i64 1 + %sel = select i1 %c, ptr %stack, ptr %const + ret ptr %sel +}