[llvm] [ValueTracking] Handle range attributes in isGuaranteedNotToBeUndefOrPoison (PR #88199)

Andreas Jonson via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 9 14:21:46 PDT 2024


https://github.com/andjo403 created https://github.com/llvm/llvm-project/pull/88199

None

>From 92b23cfd9d8e0671b099a72d40b9440af4773dc4 Mon Sep 17 00:00:00 2001
From: Andreas Jonson <andjo403 at hotmail.com>
Date: Tue, 9 Apr 2024 23:14:52 +0200
Subject: [PATCH 1/2] [ValueTracking] Add test for range attributes in
 isGuaranteedNotToBeUndefOrPoison

---
 llvm/test/Transforms/InstSimplify/freeze.ll | 39 +++++++++++++++++++--
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/llvm/test/Transforms/InstSimplify/freeze.ll b/llvm/test/Transforms/InstSimplify/freeze.ll
index 6c4b16076e724e..32629cf7d24b01 100644
--- a/llvm/test/Transforms/InstSimplify/freeze.ll
+++ b/llvm/test/Transforms/InstSimplify/freeze.ll
@@ -269,12 +269,12 @@ define ptr @call_noundef_ptr(ptr %ptr) {
 define ptr @invoke_noundef_ptr(ptr %ptr) personality i8 1 {
 ; CHECK-LABEL: @invoke_noundef_ptr(
 ; CHECK-NEXT:    invoke void @f3(ptr noundef [[PTR:%.*]])
-; CHECK-NEXT:    to label [[NORMAL:%.*]] unwind label [[UNWIND:%.*]]
+; CHECK-NEXT:            to label [[NORMAL:%.*]] unwind label [[UNWIND:%.*]]
 ; CHECK:       normal:
 ; CHECK-NEXT:    ret ptr [[PTR]]
 ; CHECK:       unwind:
 ; CHECK-NEXT:    [[TMP1:%.*]] = landingpad ptr
-; CHECK-NEXT:    cleanup
+; CHECK-NEXT:            cleanup
 ; CHECK-NEXT:    resume ptr [[PTR]]
 ;
   %q = freeze ptr %ptr
@@ -443,7 +443,7 @@ EXIT:
 define i32 @brcond_switch(i32 %x) {
 ; CHECK-LABEL: @brcond_switch(
 ; CHECK-NEXT:    switch i32 [[X:%.*]], label [[EXIT:%.*]] [
-; CHECK-NEXT:    i32 0, label [[A:%.*]]
+; CHECK-NEXT:      i32 0, label [[A:%.*]]
 ; CHECK-NEXT:    ]
 ; CHECK:       A:
 ; CHECK-NEXT:    ret i32 [[X]]
@@ -496,6 +496,39 @@ A:
 B:
   ret i1 1
 }
+
+define i8 @range_attr(i8 noundef range(i8 1, 0) %x) {
+; CHECK-LABEL: @range_attr(
+; CHECK-NEXT:    ret i8 [[X:%.*]]
+;
+  %y = freeze i8 %x
+  ret i8 %y
+}
+
+declare noundef range(i8 1, 0) i8 @returns_range_helper()
+
+define i8 @range_return() {
+; CHECK-LABEL: @range_return(
+; CHECK-NEXT:    [[X:%.*]] = call i8 @returns_range_helper()
+; CHECK-NEXT:    ret i8 [[X]]
+;
+  %x = call i8 @returns_range_helper()
+  %y = freeze i8 %x
+  ret i8 %y
+}
+
+declare noundef i8 @returns_i8_helper()
+
+define i8 @range_call() {
+; CHECK-LABEL: @range_call(
+; CHECK-NEXT:    [[X:%.*]] = call range(i8 1, 0) i8 @returns_i8_helper()
+; CHECK-NEXT:    ret i8 [[X]]
+;
+  %x = call range(i8 1, 0) i8 @returns_i8_helper()
+  %y = freeze i8 %x
+  ret i8 %y
+}
+
 declare void @f1(i1)
 declare void @f2()
 declare void @f3(ptr)

>From 7c3feeb59089ce1da81efd1df362159eeee977ac Mon Sep 17 00:00:00 2001
From: Andreas Jonson <andjo403 at hotmail.com>
Date: Tue, 9 Apr 2024 23:20:18 +0200
Subject: [PATCH 2/2] [ValueTracking] Handle range attributes in
 isGuaranteedNotToBeUndefOrPoison

---
 llvm/lib/Analysis/ValueTracking.cpp         | 4 ++++
 llvm/test/Transforms/InstSimplify/freeze.ll | 9 ++++++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index ca48cfe7738154..33d1855db9519b 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -7008,6 +7008,8 @@ static bool isGuaranteedNotToBeUndefOrPoison(
     return false;
 
   if (const auto *A = dyn_cast<Argument>(V)) {
+    if (includesPoison(Kind) && A->hasAttribute(Attribute::Range))
+      return false;
     if (A->hasAttribute(Attribute::NoUndef) ||
         A->hasAttribute(Attribute::Dereferenceable) ||
         A->hasAttribute(Attribute::DereferenceableOrNull))
@@ -7055,6 +7057,8 @@ static bool isGuaranteedNotToBeUndefOrPoison(
       return true;
 
     if (const auto *CB = dyn_cast<CallBase>(V)) {
+      if (includesPoison(Kind) && CB->hasRetAttr(Attribute::Range))
+        return false;
       if (CB->hasRetAttr(Attribute::NoUndef) ||
           CB->hasRetAttr(Attribute::Dereferenceable) ||
           CB->hasRetAttr(Attribute::DereferenceableOrNull))
diff --git a/llvm/test/Transforms/InstSimplify/freeze.ll b/llvm/test/Transforms/InstSimplify/freeze.ll
index 32629cf7d24b01..6792b6603dfde4 100644
--- a/llvm/test/Transforms/InstSimplify/freeze.ll
+++ b/llvm/test/Transforms/InstSimplify/freeze.ll
@@ -499,7 +499,8 @@ B:
 
 define i8 @range_attr(i8 noundef range(i8 1, 0) %x) {
 ; CHECK-LABEL: @range_attr(
-; CHECK-NEXT:    ret i8 [[X:%.*]]
+; CHECK-NEXT:    [[X:%.*]] = freeze i8 [[X1:%.*]]
+; CHECK-NEXT:    ret i8 [[X]]
 ;
   %y = freeze i8 %x
   ret i8 %y
@@ -510,7 +511,8 @@ declare noundef range(i8 1, 0) i8 @returns_range_helper()
 define i8 @range_return() {
 ; CHECK-LABEL: @range_return(
 ; CHECK-NEXT:    [[X:%.*]] = call i8 @returns_range_helper()
-; CHECK-NEXT:    ret i8 [[X]]
+; CHECK-NEXT:    [[Y:%.*]] = freeze i8 [[X]]
+; CHECK-NEXT:    ret i8 [[Y]]
 ;
   %x = call i8 @returns_range_helper()
   %y = freeze i8 %x
@@ -522,7 +524,8 @@ declare noundef i8 @returns_i8_helper()
 define i8 @range_call() {
 ; CHECK-LABEL: @range_call(
 ; CHECK-NEXT:    [[X:%.*]] = call range(i8 1, 0) i8 @returns_i8_helper()
-; CHECK-NEXT:    ret i8 [[X]]
+; CHECK-NEXT:    [[Y:%.*]] = freeze i8 [[X]]
+; CHECK-NEXT:    ret i8 [[Y]]
 ;
   %x = call range(i8 1, 0) i8 @returns_i8_helper()
   %y = freeze i8 %x



More information about the llvm-commits mailing list