[llvm] [SCEV] Don't create SCEVPtrToAddr for unstable pointer representations. (PR #180718)

via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 10 02:46:57 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-analysis

Author: Florian Hahn (fhahn)

<details>
<summary>Changes</summary>

Conservatively treat unstable pointers as SCEVCouldNotCompute in getPtrToAddrExpr, and return SCEVUnknown when constructing from IR.

This surfaced as part of the discussion in
https://github.com/llvm/llvm-project/pull/178861.

---
Full diff: https://github.com/llvm/llvm-project/pull/180718.diff


2 Files Affected:

- (modified) llvm/lib/Analysis/ScalarEvolution.cpp (+12-2) 
- (modified) llvm/test/Analysis/ScalarEvolution/ptrtoaddr.ll (+3-6) 


``````````diff
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 0603b9feaa860..45f1b543b8fc7 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -1127,6 +1127,12 @@ const SCEV *ScalarEvolution::getLosslessPtrToIntExpr(const SCEV *Op) {
 
 const SCEV *ScalarEvolution::getPtrToAddrExpr(const SCEV *Op) {
   assert(Op->getType()->isPointerTy() && "Op must be a pointer");
+
+  // Treat pointers with unstable representation conservatively, since the
+  // address bits may change.
+  if (DL.hasUnstableRepresentation(Op->getType()))
+    return getCouldNotCompute();
+
   Type *Ty = DL.getAddressType(Op->getType());
 
   // Use the rewriter to sink the cast down to SCEVUnknown leaves.
@@ -8175,8 +8181,12 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) {
       return getSCEV(U->getOperand(0));
     break;
 
-  case Instruction::PtrToAddr:
-    return getPtrToAddrExpr(getSCEV(U->getOperand(0)));
+  case Instruction::PtrToAddr: {
+    const SCEV *IntOp = getPtrToAddrExpr(getSCEV(U->getOperand(0)));
+    if (isa<SCEVCouldNotCompute>(IntOp))
+      return getUnknown(V);
+    return IntOp;
+  }
 
   case Instruction::PtrToInt: {
     // Pointer to integer cast is straight-forward, so do model it.
diff --git a/llvm/test/Analysis/ScalarEvolution/ptrtoaddr.ll b/llvm/test/Analysis/ScalarEvolution/ptrtoaddr.ll
index 2de02b8a319e0..82b8302db7cfd 100644
--- a/llvm/test/Analysis/ScalarEvolution/ptrtoaddr.ll
+++ b/llvm/test/Analysis/ScalarEvolution/ptrtoaddr.ll
@@ -89,13 +89,12 @@ define void @ptrtoaddr_of_gep_with_unknown_int(ptr %in, ptr %out0, ptr %offset)
   ret void
 }
 
-; FIXME: Currently not handled correctly.
 ; ptrtoaddr of a pointer with unstable representation should return SCEVUnknown.
 define void @ptrtoaddr_unstable(ptr addrspace(2) %in, ptr %out) {
 ; CHECK-LABEL: 'ptrtoaddr_unstable'
 ; CHECK-NEXT:  Classifying expressions for: @ptrtoaddr_unstable
 ; CHECK-NEXT:    %p = ptrtoaddr ptr addrspace(2) %in to i64
-; CHECK-NEXT:    --> (ptrtoaddr ptr addrspace(2) %in to i64) U: full-set S: full-set
+; CHECK-NEXT:    --> %p U: full-set S: full-set
 ; CHECK-NEXT:  Determining loop execution counts for: @ptrtoaddr_unstable
 ;
   %p = ptrtoaddr ptr addrspace(2) %in to i64
@@ -103,7 +102,6 @@ define void @ptrtoaddr_unstable(ptr addrspace(2) %in, ptr %out) {
   ret void
 }
 
-; FIXME: Currently not handled correctly.
 ; ptrtoaddr of GEP on unstable pointer should return SCEVUnknown.
 define void @ptrtoaddr_unstable_gep(ptr addrspace(2) %in, ptr %out) {
 ; CHECK-LABEL: 'ptrtoaddr_unstable_gep'
@@ -111,7 +109,7 @@ define void @ptrtoaddr_unstable_gep(ptr addrspace(2) %in, ptr %out) {
 ; CHECK-NEXT:    %gep = getelementptr inbounds i8, ptr addrspace(2) %in, i64 42
 ; CHECK-NEXT:    --> (42 + %in) U: full-set S: full-set
 ; CHECK-NEXT:    %p = ptrtoaddr ptr addrspace(2) %gep to i64
-; CHECK-NEXT:    --> (42 + (ptrtoaddr ptr addrspace(2) %in to i64)) U: full-set S: full-set
+; CHECK-NEXT:    --> %p U: full-set S: full-set
 ; CHECK-NEXT:  Determining loop execution counts for: @ptrtoaddr_unstable_gep
 ;
   %gep = getelementptr inbounds i8, ptr addrspace(2) %in, i64 42
@@ -120,13 +118,12 @@ define void @ptrtoaddr_unstable_gep(ptr addrspace(2) %in, ptr %out) {
   ret void
 }
 
-; FIXME: Currently not handled correctly.
 ; ptrtoaddr of nullptr in unstable address space should return SCEVUnknown.
 define void @ptrtoaddr_unstable_null(ptr %out) {
 ; CHECK-LABEL: 'ptrtoaddr_unstable_null'
 ; CHECK-NEXT:  Classifying expressions for: @ptrtoaddr_unstable_null
 ; CHECK-NEXT:    %p = ptrtoaddr ptr addrspace(2) null to i64
-; CHECK-NEXT:    --> 0 U: [0,1) S: [0,1)
+; CHECK-NEXT:    --> %p U: [0,1) S: [0,1)
 ; CHECK-NEXT:  Determining loop execution counts for: @ptrtoaddr_unstable_null
 ;
   %p = ptrtoaddr ptr addrspace(2) null to i64

``````````

</details>


https://github.com/llvm/llvm-project/pull/180718


More information about the llvm-commits mailing list