mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-13 14:35:54 +00:00
[InstCombine] don't assume 'inbounds' for bitcast deref or null pointer in non-default address space
Follow-up to D68244 to account for a corner case discussed in: https://bugs.llvm.org/show_bug.cgi?id=43501 Add one more restriction: if the pointer is deref-or-null and in a non-default (non-zero) address space, we can't assume inbounds. Differential Revision: https://reviews.llvm.org/D68706 llvm-svn: 374728
This commit is contained in:
parent
5dbe65e8a0
commit
048e400ca3
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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]]
|
||||
;
|
||||
|
Loading…
Reference in New Issue
Block a user