From a9f083d30500565091626213f9775f89b1376335 Mon Sep 17 00:00:00 2001 From: Tejas Joshi Date: Mon, 4 Sep 2023 10:46:52 +0100 Subject: [PATCH] [SCEV] Fix potentially empty set for unsigned ranges The following commit enabled the analysis of ranges for heap allocations: 22ca38da25e19a7c5fcfeb3f22159aba92ec381e The range turns out to be empty in cases such as the one in test (which is [1,1)), leading to an assertion failure. This patch fixes for the same case. Fixes https://github.com/llvm/llvm-project/issues/63856 Reviewed By: fhahn Differential Revision: https://reviews.llvm.org/D159160 (cherry picked from commit 0609b65aaf03b083d282a4ffe8bf660351dac461) --- llvm/lib/Analysis/ScalarEvolution.cpp | 2 +- llvm/test/Analysis/ScalarEvolution/malloc.ll | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 111d4d3..39ab48b 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -6833,7 +6833,7 @@ const ConstantRange &ScalarEvolution::getRangeRef( if (llvm::isKnownNonZero(V, DL)) MinVal = Align; ConservativeResult = ConservativeResult.intersectWith( - {MinVal, MaxVal + 1}, RangeType); + ConstantRange::getNonEmpty(MinVal, MaxVal + 1), RangeType); } } diff --git a/llvm/test/Analysis/ScalarEvolution/malloc.ll b/llvm/test/Analysis/ScalarEvolution/malloc.ll index 80d1d65..578220c 100644 --- a/llvm/test/Analysis/ScalarEvolution/malloc.ll +++ b/llvm/test/Analysis/ScalarEvolution/malloc.ll @@ -23,4 +23,15 @@ define ptr @f2() { ret ptr %alloc } +define ptr @undefined_max() { +; CHECK-LABEL: 'undefined_max' +; CHECK-NEXT: Classifying expressions for: @undefined_max +; CHECK-NEXT: %alloc = call nonnull ptr @malloc(i64 -1) +; CHECK-NEXT: --> %alloc U: full-set S: full-set +; CHECK-NEXT: Determining loop execution counts for: @undefined_max +; + %alloc = call nonnull ptr @malloc(i64 -1) + ret ptr %alloc +} + declare noalias noundef ptr @malloc(i64 noundef) allockind("alloc,uninitialized") allocsize(0) -- 2.7.4