[llvm] [ValueTracking] Teach isGuaranteedNotToBePoison to reason about ZExt (PR #228493)

Sayan Sivakumaran via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 2 08:46:20 PDT 2026


https://github.com/sivakusayan created https://github.com/llvm/llvm-project/pull/228493

None

>From 5278e8423ea8c4b63336e375cf97fafb8e845cce Mon Sep 17 00:00:00 2001
From: Sayan Sivakumaran <sivakusayan at gmail.com>
Date: Fri, 2 Oct 2026 10:41:56 -0500
Subject: [PATCH] Precommit tests

---
 llvm/unittests/Analysis/ValueTrackingTest.cpp | 24 +++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index 75cb0f52b15d5..8495c3878ec95 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -1198,6 +1198,30 @@ TEST_F(ValueTrackingTest, isGuaranteedNotToBePoison_phi) {
   }
 }
 
+TEST_F(ValueTrackingTest, isGuaranteedNotToBePoison_ZExt_NNeg) {
+  {
+    auto M = parseModule(R"(
+  declare void @llvm.assume(i1)
+
+  define i64 @test(i32 %X, i32 %Y) {
+    %res = icmp sge i32 %X, 0
+    call void @llvm.assume(i1 %res)
+
+    %ExtendX = zext nneg i32 %X to i64
+    %ExtendY = zext nneg i32 %Y to i64
+    ret i64 %ExtendY
+  })");
+    auto *F = M->getFunction("test");
+    auto *ExtendX = &findInstructionByName(F, "ExtendX");
+    auto *ExtendY = &findInstructionByName(F, "ExtendY");
+    AssumptionCache AC(*F);
+    SimplifyQuery SQ(M->getDataLayout(), /*DT=*/nullptr, &AC, /*CtxI=*/ExtendY);
+
+    EXPECT_TRUE(isGuaranteedNotToBePoison(ExtendX, SQ.AC, SQ.CtxI, SQ.DT));
+    EXPECT_FALSE(isGuaranteedNotToBePoison(ExtendY, SQ.AC, SQ.CtxI, SQ.DT));
+  }
+}
+
 TEST_F(ValueTrackingTest, isGuaranteedNotToBeUndefOrPoison) {
   parseAssembly("declare void @f(i32 noundef)"
                 "define void @test(i32 %x) {\n"



More information about the llvm-commits mailing list