[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