Index: lib/IR/Value.cpp =================================================================== --- lib/IR/Value.cpp +++ lib/IR/Value.cpp @@ -656,10 +656,8 @@ CanBeNull = true; } } else if (auto *AI = dyn_cast(this)) { - const ConstantInt *ArraySize = dyn_cast(AI->getArraySize()); - if (ArraySize && AI->getAllocatedType()->isSized()) { - DerefBytes = DL.getTypeStoreSize(AI->getAllocatedType()) * - ArraySize->getZExtValue(); + if (AI->getAllocatedType()->isSized() && !AI->isArrayAllocation()) { + DerefBytes = DL.getTypeStoreSize(AI->getAllocatedType()); CanBeNull = false; } } else if (auto *GV = dyn_cast(this)) { Index: test/Analysis/ValueTracking/memory-dereferenceable.ll =================================================================== --- test/Analysis/ValueTracking/memory-dereferenceable.ll +++ test/Analysis/ValueTracking/memory-dereferenceable.ll @@ -42,18 +42,6 @@ %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