diff options
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | 12 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/load-bitcast-vec.ll | 4 | 
2 files changed, 12 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp index c58e63d08e3..65aaef28d87 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -2344,8 +2344,16 @@ Instruction *InstCombiner::visitBitCast(BitCastInst &CI) {        // If the source pointer is dereferenceable, then assume it points to an        // allocated object and apply "inbounds" to the GEP.        bool CanBeNull; -      if (Src->getPointerDereferenceableBytes(DL, CanBeNull)) -        GEP->setIsInBounds(); +      if (Src->getPointerDereferenceableBytes(DL, CanBeNull)) { +        // In a non-default address space (not 0), a null pointer can not be +        // assumed inbounds, so ignore that case (dereferenceable_or_null). +        // The reason is that 'null' is not treated differently in these address +        // spaces, and we consequently ignore the 'gep inbounds' special case +        // for 'null' which allows 'inbounds' on 'null' if the indices are +        // zeros. +        if (SrcPTy->getAddressSpace() == 0 || !CanBeNull) +          GEP->setIsInBounds(); +      }        return GEP;      }    } diff --git a/llvm/test/Transforms/InstCombine/load-bitcast-vec.ll b/llvm/test/Transforms/InstCombine/load-bitcast-vec.ll index 4874f2f5f42..644f1f5ae70 100644 --- a/llvm/test/Transforms/InstCombine/load-bitcast-vec.ll +++ b/llvm/test/Transforms/InstCombine/load-bitcast-vec.ll @@ -100,11 +100,11 @@ define float @matching_scalar_smallest_deref_addrspace(<4 x float> addrspace(4)*    ret float %r  } -; TODO: Is a null pointer inbounds in any address space? +; A null pointer can't be assumed inbounds in a non-default address space.  define float @matching_scalar_smallest_deref_or_null_addrspace(<4 x float> addrspace(4)* dereferenceable_or_null(1) %p) {  ; CHECK-LABEL: @matching_scalar_smallest_deref_or_null_addrspace( -; CHECK-NEXT:    [[BC:%.*]] = getelementptr inbounds <4 x float>, <4 x float> addrspace(4)* [[P:%.*]], i64 0, i64 0 +; CHECK-NEXT:    [[BC:%.*]] = getelementptr <4 x float>, <4 x float> addrspace(4)* [[P:%.*]], i64 0, i64 0  ; CHECK-NEXT:    [[R:%.*]] = load float, float addrspace(4)* [[BC]], align 16  ; CHECK-NEXT:    ret float [[R]]  ;  | 

