diff --git a/llvm/lib/Analysis/StackSafetyAnalysis.cpp b/llvm/lib/Analysis/StackSafetyAnalysis.cpp --- a/llvm/lib/Analysis/StackSafetyAnalysis.cpp +++ b/llvm/lib/Analysis/StackSafetyAnalysis.cpp @@ -252,6 +252,10 @@ ConstantRange StackSafetyLocalAnalysis::getAccessRange(Value *Addr, const Value *AllocaPtr, ConstantRange SizeRange) { + // Zero-size loads and stores do not access memory. + if (SizeRange.isEmptySet()) + return ConstantRange::getEmpty(PointerSize); + if (!SE.isSCEVable(Addr->getType())) return UnknownRange; diff --git a/llvm/test/Analysis/StackSafetyAnalysis/local.ll b/llvm/test/Analysis/StackSafetyAnalysis/local.ll --- a/llvm/test/Analysis/StackSafetyAnalysis/local.ll +++ b/llvm/test/Analysis/StackSafetyAnalysis/local.ll @@ -368,3 +368,20 @@ store %v, * %p, align 4 ret void } + +%zerosize_type = type {} + +define void @ZeroSize(%zerosize_type *%p) { +; CHECK-LABEL: @ZeroSize dso_preemptable{{$}} +; CHECK-NEXT: args uses: +; CHECK-NEXT: p[]: empty-set +; CHECK-NEXT: allocas uses: +; CHECK-NEXT: x[0]: empty-set +; CHECK-NOT: ]: +entry: + %x = alloca %zerosize_type, align 4 + store %zerosize_type undef, %zerosize_type* %x, align 4 + store %zerosize_type undef, %zerosize_type* undef, align 4 + %val = load %zerosize_type, %zerosize_type* %p, align 4 + ret void +}