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:
Bjorn Steinbrink 2017-12-20 10:01:30 +00:00
parent c067c30d9e
commit 030123e8e8
2 changed files with 2 additions and 16 deletions

View File

@ -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)) {

View File

@ -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