[llvm] [GlobalsAA] Handle self-referencing stores in `AnalyzeUsesOfPointer` (PR #213631)

Antonio Frighetto via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 3 02:26:01 PDT 2026


https://github.com/antoniofrighetto created https://github.com/llvm/llvm-project/pull/213631

Correctly recognize that a global address does escape when it is stored into itself. Such globals were previously incorrectly marked as non-address-taken.

Fixes: https://github.com/llvm/llvm-project/issues/213232.

>From 3c93c8222e9d19cefb392edf6a90401b7bb1585c Mon Sep 17 00:00:00 2001
From: Antonio Frighetto <me at antoniofrighetto.com>
Date: Mon, 3 Aug 2026 11:05:51 +0200
Subject: [PATCH 1/2] [GlobalsAA] Introduce test (NFC)

---
 .../Analysis/GlobalsModRef/self-addresstaken.ll  | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
 create mode 100644 llvm/test/Analysis/GlobalsModRef/self-addresstaken.ll

diff --git a/llvm/test/Analysis/GlobalsModRef/self-addresstaken.ll b/llvm/test/Analysis/GlobalsModRef/self-addresstaken.ll
new file mode 100644
index 0000000000000..3b21b19bae5c0
--- /dev/null
+++ b/llvm/test/Analysis/GlobalsModRef/self-addresstaken.ll
@@ -0,0 +1,16 @@
+; RUN: opt < %s -passes='require<globals-aa>,aa-eval' -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+; Ensure @g is correctly marked as address taken when it is stored into itself.
+
+ at g = internal global ptr null
+
+; CHECK-LABEL: self_addresstaken
+; CHECK:       NoAlias:	ptr* %p, ptr* @g
+
+define ptr @self_addresstaken() {
+  store ptr @g, ptr @g, align 8
+  %p = load ptr, ptr @g, align 8
+  store ptr null, ptr %p, align 8
+  %q = load ptr, ptr @g, align 8
+  ret ptr %q
+}

>From 43f54fdc27b266c42efa98de6b47b148256b0e40 Mon Sep 17 00:00:00 2001
From: Antonio Frighetto <me at antoniofrighetto.com>
Date: Mon, 3 Aug 2026 11:06:19 +0200
Subject: [PATCH 2/2] [GlobalsAA] Handle self-referencing stores in
 `AnalyzeUsesOfPointer`

Correctly recognize that a global address does escape when it is
stored into itself. Such globals were previously incorrectly marked
as non-address-taken.

Fixes: https://github.com/llvm/llvm-project/issues/213232.
---
 llvm/lib/Analysis/GlobalsModRef.cpp                   | 3 ++-
 llvm/test/Analysis/GlobalsModRef/self-addresstaken.ll | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Analysis/GlobalsModRef.cpp b/llvm/lib/Analysis/GlobalsModRef.cpp
index 1a0ae25b2b6b3..6471cc0d52cbd 100644
--- a/llvm/lib/Analysis/GlobalsModRef.cpp
+++ b/llvm/lib/Analysis/GlobalsModRef.cpp
@@ -328,7 +328,8 @@ bool GlobalsAAResult::AnalyzeUsesOfPointer(Value *V,
       if (Readers)
         Readers->insert(LI->getParent()->getParent());
     } else if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
-      if (V == SI->getOperand(1)) {
+      // Check the pointer operand use of the store.
+      if (&U == &SI->getOperandUse(1)) {
         if (Writers)
           Writers->insert(SI->getParent()->getParent());
       } else if (SI->getOperand(1) != OkayStoreDest) {
diff --git a/llvm/test/Analysis/GlobalsModRef/self-addresstaken.ll b/llvm/test/Analysis/GlobalsModRef/self-addresstaken.ll
index 3b21b19bae5c0..57fd8259f6790 100644
--- a/llvm/test/Analysis/GlobalsModRef/self-addresstaken.ll
+++ b/llvm/test/Analysis/GlobalsModRef/self-addresstaken.ll
@@ -5,7 +5,7 @@
 @g = internal global ptr null
 
 ; CHECK-LABEL: self_addresstaken
-; CHECK:       NoAlias:	ptr* %p, ptr* @g
+; CHECK:       MayAlias:	ptr* %p, ptr* @g
 
 define ptr @self_addresstaken() {
   store ptr @g, ptr @g, align 8



More information about the llvm-commits mailing list