forked from OSchip/llvm-project
Give up on array allocas in getPointerDereferenceableBytes
Summary: As suggested by Eli Friedman, don't try to handle array allocas here, because of possible overflows, instead rely on instcombine converting them to allocations of array types. Reviewers: efriedma Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D41398 llvm-svn: 321159
This commit is contained in:
parent
c067c30d9e
commit
030123e8e8
|
@ -656,10 +656,8 @@ uint64_t Value::getPointerDereferenceableBytes(const DataLayout &DL,
|
|||
CanBeNull = true;
|
||||
}
|
||||
} else if (auto *AI = dyn_cast<AllocaInst>(this)) {
|
||||
const ConstantInt *ArraySize = dyn_cast<ConstantInt>(AI->getArraySize());
|
||||
if (ArraySize && AI->getAllocatedType()->isSized()) {
|
||||
DerefBytes = DL.getTypeStoreSize(AI->getAllocatedType()) *
|
||||
ArraySize->getZExtValue();
|
||||
if (!AI->isArrayAllocation()) {
|
||||
DerefBytes = DL.getTypeStoreSize(AI->getAllocatedType());
|
||||
CanBeNull = false;
|
||||
}
|
||||
} else if (auto *GV = dyn_cast<GlobalVariable>(this)) {
|
||||
|
|
|
@ -42,18 +42,6 @@ entry:
|
|||
%empty_alloca = alloca i8, i64 0
|
||||
%empty_load = load i8, i8* %empty_alloca
|
||||
|
||||
; Load from too small array alloca
|
||||
; CHECK-NOT: %small_array_alloca
|
||||
%small_array_alloca = alloca i8, i64 2
|
||||
%saa_cast = bitcast i8* %small_array_alloca to i32*
|
||||
%saa_load = load i32, i32* %saa_cast
|
||||
|
||||
; Load from array alloca
|
||||
; CHECK: %big_array_alloca{{.*}}(unaligned)
|
||||
%big_array_alloca = alloca i8, i64 4
|
||||
%baa_cast = bitcast i8* %big_array_alloca to i32*
|
||||
%baa_load = load i32, i32* %baa_cast
|
||||
|
||||
; Loads from sret arguments
|
||||
; CHECK: %sret_gep{{.*}}(aligned)
|
||||
%sret_gep = getelementptr inbounds %struct.A, %struct.A* %result, i64 0, i32 1, i64 2
|
||||
|
|
Loading…
Reference in New Issue