[llvm] Resolve FIXME: Try SCEV getRange. (PR #80623)

via llvm-commits llvm-commits at lists.llvm.org
Sun Feb 4 20:00:29 PST 2024


https://github.com/AtariDreams updated https://github.com/llvm/llvm-project/pull/80623

>From b61b6f7dd337117a4dc743fb154066271a4a0b58 Mon Sep 17 00:00:00 2001
From: Rose <83477269+AtariDreams at users.noreply.github.com>
Date: Sun, 4 Feb 2024 19:01:36 -0500
Subject: [PATCH] Resolve FIXME: Try SCEV getRange.

Using the range to see if it is a single constant value instead of seeing if there is a constant size is more accurate.
---
 llvm/lib/CodeGen/SafeStack.cpp | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/CodeGen/SafeStack.cpp b/llvm/lib/CodeGen/SafeStack.cpp
index 0a26247a4d165..8b4d69e4ad820 100644
--- a/llvm/lib/CodeGen/SafeStack.cpp
+++ b/llvm/lib/CodeGen/SafeStack.cpp
@@ -263,10 +263,16 @@ bool SafeStack::IsMemIntrinsicSafe(const MemIntrinsic *MI, const Use &U,
       return true;
   }
 
-  const auto *Len = dyn_cast<ConstantInt>(MI->getLength());
-  // Non-constant size => unsafe. FIXME: try SCEV getRange.
-  if (!Len) return false;
-  return IsAccessSafe(U, Len->getZExtValue(), AllocaPtr, AllocaSize);
+  const SCEV *LenSCEV = SE.getSCEV(MI->getLength());
+  ConstantRange LenRange = SE.getUnsignedRange(LenSCEV);
+  auto element = LenRange.getSingleElement();
+  if (element) {
+    uint64_t Len = element->getZExtValue();
+    return IsAccessSafe(U, Len, AllocaPtr, AllocaSize);
+  } else {
+    // If the length is not a single constant value, it's unsafe.
+    return false;
+  }
 }
 
 /// Check whether a given allocation must be put on the safe



More information about the llvm-commits mailing list