[llvm] [AssumptionCache] Deduplicate affected values in removeAffectedValues (PR #205441)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 8 01:03:06 PDT 2026
https://github.com/fhahn updated https://github.com/llvm/llvm-project/pull/205441
>From 3260cc611c833ab84e3b17d854d1e381c4f09960 Mon Sep 17 00:00:00 2001
From: Kristianerik <kristian.erik at outlook.com>
Date: Wed, 24 Jun 2026 17:07:36 -0700
Subject: [PATCH] [AssumptionCache] Deduplicate affected values in
removeAffectedValues
---
llvm/lib/Analysis/AssumptionCache.cpp | 5 ++++-
.../duplicate-affected-value.ll | 17 +++++++++++++++++
2 files changed, 21 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/Transforms/DropUnnecessaryAssumes/duplicate-affected-value.ll
diff --git a/llvm/lib/Analysis/AssumptionCache.cpp b/llvm/lib/Analysis/AssumptionCache.cpp
index 94eb93e048720..4a89b1c89e895 100644
--- a/llvm/lib/Analysis/AssumptionCache.cpp
+++ b/llvm/lib/Analysis/AssumptionCache.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/AssumptionCache.h"
+#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
@@ -131,9 +132,11 @@ void AssumptionCache::removeAffectedValues(AssumeInst *CI) {
// an assertion failure. Avoid this by counting the number of expected
// matches.
#ifndef NDEBUG
+ SmallDenseSet<std::pair<Value *, unsigned>, 16> Seen;
DenseMap<Value *, int> ExpectedMatches;
for (auto &AV : Affected)
- if (AffectedValues.find_as(AV.Assume) != AffectedValues.end())
+ if (Seen.insert({AV.Assume, AV.Index}).second &&
+ AffectedValues.find_as(AV.Assume) != AffectedValues.end())
ExpectedMatches[AV.Assume]++;
#endif
diff --git a/llvm/test/Transforms/DropUnnecessaryAssumes/duplicate-affected-value.ll b/llvm/test/Transforms/DropUnnecessaryAssumes/duplicate-affected-value.ll
new file mode 100644
index 0000000000000..2c1475f48a6d4
--- /dev/null
+++ b/llvm/test/Transforms/DropUnnecessaryAssumes/duplicate-affected-value.ll
@@ -0,0 +1,17 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -passes=drop-unnecessary-assumes -S < %s | FileCheck %s
+; This test verifies that drop-unnecessary-assumes does not crash when
+; a separate_storage bundle has the same pointer for both arguments.
+
+declare void @llvm.assume(i1)
+
+define void @f(ptr %p) {
+; CHECK-LABEL: define void @f(
+; CHECK-SAME: ptr [[P:%.*]]) {
+; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr null, i64 0) ]
+; CHECK-NEXT: ret void
+;
+ call void @llvm.assume(i1 true) [ "separate_storage"(ptr %p, ptr %p), "dereferenceable"(ptr null, i64 0) ]
+ call void @llvm.assume(i1 true) [ "align"(ptr %p, i64 0) ]
+ ret void
+}
More information about the llvm-commits
mailing list