[clang] [Clang] Swap range metadata to attribute for intrinsics. (PR #94851)

2024-06-08 Thread Andreas Jonson via cfe-commits

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

Continues to swap out range metadata to range attribute for calls to be able to 
deprecate range metadata on calls in the future

>From 6b4556ea373d90a780c132ab2c51ae46d40a3f49 Mon Sep 17 00:00:00 2001
From: Andreas Jonson 
Date: Sun, 26 May 2024 10:02:25 +0200
Subject: [PATCH] [Clang] swap range metadata to attribute for Intrinsics.

---
 clang/lib/CodeGen/CGBuiltin.cpp | 18 --
 clang/test/CodeGenOpenCL/builtins-amdgcn.cl |  7 +++
 clang/test/CodeGenOpenCL/builtins-r600.cl   |  7 +++
 3 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index c16b69ba87567..e053e1a46cbb1 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -734,17 +734,15 @@ static llvm::Value *EmitOverflowIntrinsic(CodeGenFunction 
&CGF,
   return CGF.Builder.CreateExtractValue(Tmp, 0);
 }
 
-static Value *emitRangedBuiltin(CodeGenFunction &CGF,
-unsigned IntrinsicID,
+static Value *emitRangedBuiltin(CodeGenFunction &CGF, unsigned IntrinsicID,
 int low, int high) {
-llvm::MDBuilder MDHelper(CGF.getLLVMContext());
-llvm::MDNode *RNode = MDHelper.createRange(APInt(32, low), APInt(32, 
high));
-Function *F = CGF.CGM.getIntrinsic(IntrinsicID, {});
-llvm::Instruction *Call = CGF.Builder.CreateCall(F);
-Call->setMetadata(llvm::LLVMContext::MD_range, RNode);
-Call->setMetadata(llvm::LLVMContext::MD_noundef,
-  llvm::MDNode::get(CGF.getLLVMContext(), std::nullopt));
-return Call;
+  Function *F = CGF.CGM.getIntrinsic(IntrinsicID, {});
+  llvm::CallInst *Call = CGF.Builder.CreateCall(F);
+  llvm::ConstantRange CR(APInt(32, low), APInt(32, high));
+  Call->addRangeRetAttr(CR);
+  Call->setMetadata(llvm::LLVMContext::MD_noundef,
+llvm::MDNode::get(CGF.getLLVMContext(), std::nullopt));
+  return Call;
 }
 
 namespace {
diff --git a/clang/test/CodeGenOpenCL/builtins-amdgcn.cl 
b/clang/test/CodeGenOpenCL/builtins-amdgcn.cl
index ffc190b76db98..121d1f15449e3 100644
--- a/clang/test/CodeGenOpenCL/builtins-amdgcn.cl
+++ b/clang/test/CodeGenOpenCL/builtins-amdgcn.cl
@@ -605,9 +605,9 @@ void test_s_getreg(volatile global uint *out)
 }
 
 // CHECK-LABEL: @test_get_local_id(
-// CHECK: tail call{{.*}} i32 @llvm.amdgcn.workitem.id.x(), !range 
[[$WI_RANGE:![0-9]*]], !noundef
-// CHECK: tail call{{.*}} i32 @llvm.amdgcn.workitem.id.y(), !range 
[[$WI_RANGE]], !noundef
-// CHECK: tail call{{.*}} i32 @llvm.amdgcn.workitem.id.z(), !range 
[[$WI_RANGE]], !noundef
+// CHECK: tail call range(i32 0, 1024){{.*}} i32 @llvm.amdgcn.workitem.id.x(), 
!noundef
+// CHECK: tail call range(i32 0, 1024){{.*}} i32 @llvm.amdgcn.workitem.id.y(), 
!noundef
+// CHECK: tail call range(i32 0, 1024{{.*}}) i32 @llvm.amdgcn.workitem.id.z(), 
!noundef
 void test_get_local_id(int d, global int *out)
 {
switch (d) {
@@ -891,6 +891,5 @@ void test_set_fpenv(unsigned long env) {
   __builtin_amdgcn_set_fpenv(env);
 }
 
-// CHECK-DAG: [[$WI_RANGE]] = !{i32 0, i32 1024}
 // CHECK-DAG: [[$WS_RANGE]] = !{i16 1, i16 1025}
 // CHECK-DAG: attributes #[[$NOUNWIND_READONLY]] = { convergent mustprogress 
nocallback nofree nounwind willreturn memory(none) }
diff --git a/clang/test/CodeGenOpenCL/builtins-r600.cl 
b/clang/test/CodeGenOpenCL/builtins-r600.cl
index c6b40f079b3f2..e9d60be2ee444 100644
--- a/clang/test/CodeGenOpenCL/builtins-r600.cl
+++ b/clang/test/CodeGenOpenCL/builtins-r600.cl
@@ -39,9 +39,9 @@ void test_get_group_id(int d, global int *out)
 }
 
 // CHECK-LABEL: @test_get_local_id(
-// CHECK: tail call i32 @llvm.r600.read.tidig.x(), !range [[WI_RANGE:![0-9]*]]
-// CHECK: tail call i32 @llvm.r600.read.tidig.y(), !range [[WI_RANGE]]
-// CHECK: tail call i32 @llvm.r600.read.tidig.z(), !range [[WI_RANGE]]
+// CHECK: tail call range(i32 0, 1024) i32 @llvm.r600.read.tidig.x()
+// CHECK: tail call range(i32 0, 1024) i32 @llvm.r600.read.tidig.y()
+// CHECK: tail call range(i32 0, 1024) i32 @llvm.r600.read.tidig.z()
 void test_get_local_id(int d, global int *out)
 {
switch (d) {
@@ -52,4 +52,3 @@ void test_get_local_id(int d, global int *out)
}
 }
 
-// CHECK-DAG: [[WI_RANGE]] = !{i32 0, i32 1024}

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Swap range metadata to attribute for intrinsics. (PR #94851)

2024-06-11 Thread Andreas Jonson via cfe-commits

https://github.com/andjo403 updated 
https://github.com/llvm/llvm-project/pull/94851

>From 6b4556ea373d90a780c132ab2c51ae46d40a3f49 Mon Sep 17 00:00:00 2001
From: Andreas Jonson 
Date: Sun, 26 May 2024 10:02:25 +0200
Subject: [PATCH 1/2] [Clang] swap range metadata to attribute for Intrinsics.

---
 clang/lib/CodeGen/CGBuiltin.cpp | 18 --
 clang/test/CodeGenOpenCL/builtins-amdgcn.cl |  7 +++
 clang/test/CodeGenOpenCL/builtins-r600.cl   |  7 +++
 3 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index c16b69ba87567..e053e1a46cbb1 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -734,17 +734,15 @@ static llvm::Value *EmitOverflowIntrinsic(CodeGenFunction 
&CGF,
   return CGF.Builder.CreateExtractValue(Tmp, 0);
 }
 
-static Value *emitRangedBuiltin(CodeGenFunction &CGF,
-unsigned IntrinsicID,
+static Value *emitRangedBuiltin(CodeGenFunction &CGF, unsigned IntrinsicID,
 int low, int high) {
-llvm::MDBuilder MDHelper(CGF.getLLVMContext());
-llvm::MDNode *RNode = MDHelper.createRange(APInt(32, low), APInt(32, 
high));
-Function *F = CGF.CGM.getIntrinsic(IntrinsicID, {});
-llvm::Instruction *Call = CGF.Builder.CreateCall(F);
-Call->setMetadata(llvm::LLVMContext::MD_range, RNode);
-Call->setMetadata(llvm::LLVMContext::MD_noundef,
-  llvm::MDNode::get(CGF.getLLVMContext(), std::nullopt));
-return Call;
+  Function *F = CGF.CGM.getIntrinsic(IntrinsicID, {});
+  llvm::CallInst *Call = CGF.Builder.CreateCall(F);
+  llvm::ConstantRange CR(APInt(32, low), APInt(32, high));
+  Call->addRangeRetAttr(CR);
+  Call->setMetadata(llvm::LLVMContext::MD_noundef,
+llvm::MDNode::get(CGF.getLLVMContext(), std::nullopt));
+  return Call;
 }
 
 namespace {
diff --git a/clang/test/CodeGenOpenCL/builtins-amdgcn.cl 
b/clang/test/CodeGenOpenCL/builtins-amdgcn.cl
index ffc190b76db98..121d1f15449e3 100644
--- a/clang/test/CodeGenOpenCL/builtins-amdgcn.cl
+++ b/clang/test/CodeGenOpenCL/builtins-amdgcn.cl
@@ -605,9 +605,9 @@ void test_s_getreg(volatile global uint *out)
 }
 
 // CHECK-LABEL: @test_get_local_id(
-// CHECK: tail call{{.*}} i32 @llvm.amdgcn.workitem.id.x(), !range 
[[$WI_RANGE:![0-9]*]], !noundef
-// CHECK: tail call{{.*}} i32 @llvm.amdgcn.workitem.id.y(), !range 
[[$WI_RANGE]], !noundef
-// CHECK: tail call{{.*}} i32 @llvm.amdgcn.workitem.id.z(), !range 
[[$WI_RANGE]], !noundef
+// CHECK: tail call range(i32 0, 1024){{.*}} i32 @llvm.amdgcn.workitem.id.x(), 
!noundef
+// CHECK: tail call range(i32 0, 1024){{.*}} i32 @llvm.amdgcn.workitem.id.y(), 
!noundef
+// CHECK: tail call range(i32 0, 1024{{.*}}) i32 @llvm.amdgcn.workitem.id.z(), 
!noundef
 void test_get_local_id(int d, global int *out)
 {
switch (d) {
@@ -891,6 +891,5 @@ void test_set_fpenv(unsigned long env) {
   __builtin_amdgcn_set_fpenv(env);
 }
 
-// CHECK-DAG: [[$WI_RANGE]] = !{i32 0, i32 1024}
 // CHECK-DAG: [[$WS_RANGE]] = !{i16 1, i16 1025}
 // CHECK-DAG: attributes #[[$NOUNWIND_READONLY]] = { convergent mustprogress 
nocallback nofree nounwind willreturn memory(none) }
diff --git a/clang/test/CodeGenOpenCL/builtins-r600.cl 
b/clang/test/CodeGenOpenCL/builtins-r600.cl
index c6b40f079b3f2..e9d60be2ee444 100644
--- a/clang/test/CodeGenOpenCL/builtins-r600.cl
+++ b/clang/test/CodeGenOpenCL/builtins-r600.cl
@@ -39,9 +39,9 @@ void test_get_group_id(int d, global int *out)
 }
 
 // CHECK-LABEL: @test_get_local_id(
-// CHECK: tail call i32 @llvm.r600.read.tidig.x(), !range [[WI_RANGE:![0-9]*]]
-// CHECK: tail call i32 @llvm.r600.read.tidig.y(), !range [[WI_RANGE]]
-// CHECK: tail call i32 @llvm.r600.read.tidig.z(), !range [[WI_RANGE]]
+// CHECK: tail call range(i32 0, 1024) i32 @llvm.r600.read.tidig.x()
+// CHECK: tail call range(i32 0, 1024) i32 @llvm.r600.read.tidig.y()
+// CHECK: tail call range(i32 0, 1024) i32 @llvm.r600.read.tidig.z()
 void test_get_local_id(int d, global int *out)
 {
switch (d) {
@@ -52,4 +52,3 @@ void test_get_local_id(int d, global int *out)
}
 }
 
-// CHECK-DAG: [[WI_RANGE]] = !{i32 0, i32 1024}

>From 10f061528a6338be14b6aaad5ab3a17f880415c0 Mon Sep 17 00:00:00 2001
From: Andreas Jonson 
Date: Tue, 11 Jun 2024 20:38:27 +0200
Subject: [PATCH 2/2] [clang] Swap NoUndef metadata to return attribute.

---
 clang/lib/CodeGen/CGBuiltin.cpp | 3 +--
 clang/test/CodeGenOpenCL/builtins-amdgcn.cl | 6 +++---
 clang/test/CodeGenOpenCL/builtins-r600.cl   | 6 +++---
 3 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index e053e1a46cbb1..f21a8f1e7014a 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -740,8 +740,7 @@ static Value *emitRangedBuiltin(CodeGenFunction &CGF, 
unsigned IntrinsicID,
   llvm::CallInst *Call = CGF.Builder

[clang] [Clang] Swap range metadata to attribute for intrinsics. (PR #94851)

2024-06-11 Thread Andreas Jonson via cfe-commits

andjo403 wrote:

also changed the noundef to mach the range attribute

https://github.com/llvm/llvm-project/pull/94851
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Swap range metadata to attribute for intrinsics. (PR #94851)

2024-06-19 Thread Andreas Jonson via cfe-commits

https://github.com/andjo403 closed 
https://github.com/llvm/llvm-project/pull/94851
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [inline] Clone return range attribute on the callsite into inlined call (PR #92666)

2024-05-28 Thread Andreas Jonson via cfe-commits

https://github.com/andjo403 updated 
https://github.com/llvm/llvm-project/pull/92666

>From 1bc922a6797555b0bf69b187224ba054978fb7ad Mon Sep 17 00:00:00 2001
From: Andreas Jonson 
Date: Sat, 18 May 2024 19:42:03 +0200
Subject: [PATCH 1/2] [inline] Tests for clone return range attribute on the
 callsite into inlined call [NFC]

---
 .../Inline/ret_attr_align_and_noundef.ll  | 73 +++
 1 file changed, 73 insertions(+)

diff --git a/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll 
b/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll
index c038ffccf3e96..7e76401c0b4de 100644
--- a/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll
+++ b/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll
@@ -5,10 +5,12 @@
 
 declare ptr @foo()
 declare void @use.ptr(ptr) willreturn nounwind
+declare void @use.val(i8) willreturn nounwind
 declare void @bar()
 declare void @baz()
 declare ptr @llvm.ptrmask.p0.i64(ptr, i64)
 declare i1 @val()
+declare i8 @val8()
 
 define ptr @callee0123() {
 ; CHECK-LABEL: define ptr @callee0123() {
@@ -337,3 +339,74 @@ define ptr @caller12_todo() {
   %r = call nonnull ptr @callee12()
   ret ptr %r
 }
+
+define i8 @callee13() {
+; CHECK-LABEL: define i8 @callee13() {
+; CHECK-NEXT:[[R:%.*]] = call i8 @val8()
+; CHECK-NEXT:ret i8 [[R]]
+;
+  %r = call i8 @val8()
+  ret i8 %r
+}
+
+define i8 @caller13_okay_use_after_poison_anyways() {
+; CHECK-LABEL: define i8 @caller13_okay_use_after_poison_anyways() {
+; CHECK-NEXT:[[R_I:%.*]] = call i8 @val8()
+; CHECK-NEXT:call void @use.val(i8 [[R_I]])
+; CHECK-NEXT:ret i8 [[R_I]]
+;
+  %r = call range(i8 0, 10) i8 @callee13()
+  call void @use.val(i8 %r)
+  ret i8 %r
+}
+
+define i8 @callee14() {
+; CHECK-LABEL: define i8 @callee14() {
+; CHECK-NEXT:[[R:%.*]] = call noundef i8 @val8()
+; CHECK-NEXT:ret i8 [[R]]
+;
+  %r = call noundef i8 @val8()
+  ret i8 %r
+}
+
+define i8 @caller14_fail_creates_ub() {
+; CHECK-LABEL: define i8 @caller14_fail_creates_ub() {
+; CHECK-NEXT:[[R_I:%.*]] = call noundef i8 @val8()
+; CHECK-NEXT:call void @use.val(i8 [[R_I]])
+; CHECK-NEXT:ret i8 [[R_I]]
+;
+  %r = call range(i8 0, 10) i8 @callee14()
+  call void @use.val(i8 %r)
+  ret i8 %r
+}
+
+define i8 @caller14_okay_is_ub_anyways() {
+; CHECK-LABEL: define i8 @caller14_okay_is_ub_anyways() {
+; CHECK-NEXT:[[R_I:%.*]] = call noundef i8 @val8()
+; CHECK-NEXT:call void @use.val(i8 [[R_I]])
+; CHECK-NEXT:ret i8 [[R_I]]
+;
+  %r = call noundef range(i8 0, 10) i8 @callee14()
+  call void @use.val(i8 %r)
+  ret i8 %r
+}
+
+define i8 @callee15() {
+; CHECK-LABEL: define i8 @callee15() {
+; CHECK-NEXT:[[R:%.*]] = call range(i8 5, 10) i8 @val8()
+; CHECK-NEXT:ret i8 [[R]]
+;
+  %r = call range(i8 5, 10) i8 @val8()
+  ret i8 %r
+}
+
+define i8 @caller15_okay_intersect_ranges() {
+; CHECK-LABEL: define i8 @caller15_okay_intersect_ranges() {
+; CHECK-NEXT:[[R_I:%.*]] = call range(i8 5, 10) i8 @val8()
+; CHECK-NEXT:call void @use.val(i8 [[R_I]])
+; CHECK-NEXT:ret i8 [[R_I]]
+;
+  %r = call range(i8 0, 7) i8 @callee15()
+  call void @use.val(i8 %r)
+  ret i8 %r
+}

>From 4472fc7e3de2460bce3afb42e0c00ed13bf4980c Mon Sep 17 00:00:00 2001
From: Andreas Jonson 
Date: Sat, 18 May 2024 19:44:31 +0200
Subject: [PATCH 2/2] [inline] Clone return range attribute on the callsite
 into inlined call

---
 clang/test/Headers/__clang_hip_math.hip |  6 +++---
 llvm/lib/Transforms/Utils/InlineFunction.cpp| 13 -
 .../Transforms/Inline/ret_attr_align_and_noundef.ll |  6 +++---
 3 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/clang/test/Headers/__clang_hip_math.hip 
b/clang/test/Headers/__clang_hip_math.hip
index 1271868a53b86..26da82843c512 100644
--- a/clang/test/Headers/__clang_hip_math.hip
+++ b/clang/test/Headers/__clang_hip_math.hip
@@ -231,7 +231,7 @@ extern "C" __device__ uint64_t test___make_mantissa(const 
char *p) {
 
 // CHECK-LABEL: @test_abs(
 // CHECK-NEXT:  entry:
-// CHECK-NEXT:[[TMP0:%.*]] = tail call noundef i32 @llvm.abs.i32(i32 
[[X:%.*]], i1 true)
+// CHECK-NEXT:[[TMP0:%.*]] = tail call noundef range(i32 0, -2147483648) 
i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
 // CHECK-NEXT:ret i32 [[TMP0]]
 //
 extern "C" __device__ int test_abs(int x) {
@@ -240,7 +240,7 @@ extern "C" __device__ int test_abs(int x) {
 
 // CHECK-LABEL: @test_labs(
 // CHECK-NEXT:  entry:
-// CHECK-NEXT:[[TMP0:%.*]] = tail call noundef i64 @llvm.abs.i64(i64 
[[X:%.*]], i1 true)
+// CHECK-NEXT:[[TMP0:%.*]] = tail call noundef range(i64 0, 
-9223372036854775808) i64 @llvm.abs.i64(i64 [[X:%.*]], i1 true)
 // CHECK-NEXT:ret i64 [[TMP0]]
 //
 extern "C" __device__ long test_labs(long x) {
@@ -249,7 +249,7 @@ extern "C" __device__ long test_labs(long x) {
 
 // CHECK-LABEL: @test_llabs(
 // CHECK-NEXT:  entry:
-// CHECK-NEXT:[[TMP0:%.*]] = tail call noundef i64 @llvm.abs.i64(i64 
[[X:%.*]], i1 true)
+// CHECK-NEXT:[[TMP0:%.*

[clang] [llvm] [inline] Clone return range attribute on the callsite into inlined call (PR #92666)

2024-05-28 Thread Andreas Jonson via cfe-commits


@@ -1444,6 +1445,8 @@ static AttrBuilder 
IdentifyValidPoisonGeneratingAttributes(CallBase &CB) {
 Valid.addAttribute(Attribute::NonNull);
   if (CB.hasRetAttr(Attribute::Alignment))
 Valid.addAlignmentAttr(CB.getRetAlign());
+  if (CB.hasRetAttr(Attribute::Range))
+Valid.addRangeAttr(*CB.getRange());

andjo403 wrote:

fixed

https://github.com/llvm/llvm-project/pull/92666
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [inline] Clone return range attribute on the callsite into inlined call (PR #92666)

2024-05-28 Thread Andreas Jonson via cfe-commits

andjo403 wrote:

Comment fixed and need help with merging.

https://github.com/llvm/llvm-project/pull/92666
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [InstCombine] Swap out range metadata to range attribute for cttz/ctlz/ctpop (PR #88776)

2024-04-19 Thread Andreas Jonson via cfe-commits

andjo403 wrote:

This time it seems like I have managed to get all the tests to pass at least on 
linux, windows have not executed yet.

https://github.com/llvm/llvm-project/pull/88776
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [InstCombine] Swap out range metadata to range attribute for cttz/ctlz/ctpop (PR #88776)

2024-04-24 Thread Andreas Jonson via cfe-commits

andjo403 wrote:

I still have not asked for rights to merge do not know when there is a good 
time to do that feels like there is a lot of discussions about if it is needed 
to have it or not.

https://github.com/llvm/llvm-project/pull/88776
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [SCCP] Swap out range metadata to range attribute (PR #90134)

2024-04-25 Thread Andreas Jonson via cfe-commits

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

Also moved the range from the function's call sites to the functions return 
value as that is possible now.

>From f0c948df7b158235d8631186f54a31b4e7c0bdf1 Mon Sep 17 00:00:00 2001
From: Andreas Jonson 
Date: Thu, 25 Apr 2024 23:14:01 +0200
Subject: [PATCH 1/2] [NFC] update test to avoid diffs

---
 clang/test/CodeGen/attr-counted-by.c  | 48 +-
 .../discover-transitive-phis.ll   | 52 ++-
 .../cfi-nounwind-direct-call.ll   | 20 ++--
 .../Transforms/SCCP/ip-add-range-to-call.ll   | 62 +++--
 llvm/test/Transforms/SCCP/ip-ranges-casts.ll  | 68 --
 llvm/test/Transforms/SCCP/switch.ll   | 91 +++
 6 files changed, 211 insertions(+), 130 deletions(-)

diff --git a/clang/test/CodeGen/attr-counted-by.c 
b/clang/test/CodeGen/attr-counted-by.c
index 1fb39f9a346667..373b2e96c0ced6 100644
--- a/clang/test/CodeGen/attr-counted-by.c
+++ b/clang/test/CodeGen/attr-counted-by.c
@@ -66,7 +66,7 @@ struct anon_struct {
 // SANITIZE-WITH-ATTR-NEXT:[[TMP1:%.*]] = icmp ult i64 [[IDXPROM]], 
[[TMP0]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR-NEXT:br i1 [[TMP1]], label [[CONT3:%.*]], label 
[[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR:   handler.out_of_bounds:
-// SANITIZE-WITH-ATTR-NEXT:tail call void 
@__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB2:[0-9]+]], i64 
[[IDXPROM]]) #[[ATTR10:[0-9]+]], !nosanitize [[META2]]
+// SANITIZE-WITH-ATTR-NEXT:tail call void 
@__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB1:[0-9]+]], i64 
[[IDXPROM]]) #[[ATTR10:[0-9]+]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR-NEXT:unreachable, !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR:   cont3:
 // SANITIZE-WITH-ATTR-NEXT:[[ARRAY:%.*]] = getelementptr inbounds i8, ptr 
[[P]], i64 12
@@ -114,7 +114,7 @@ void test1(struct annotated *p, int index, int val) {
 // SANITIZE-WITH-ATTR-NEXT:[[TMP1:%.*]] = icmp ugt i64 [[TMP0]], 
[[INDEX]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR-NEXT:br i1 [[TMP1]], label [[CONT3:%.*]], label 
[[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR:   handler.out_of_bounds:
-// SANITIZE-WITH-ATTR-NEXT:tail call void 
@__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB4:[0-9]+]], i64 
[[INDEX]]) #[[ATTR10]], !nosanitize [[META2]]
+// SANITIZE-WITH-ATTR-NEXT:tail call void 
@__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB3:[0-9]+]], i64 
[[INDEX]]) #[[ATTR10]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR-NEXT:unreachable, !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR:   cont3:
 // SANITIZE-WITH-ATTR-NEXT:[[ARRAY:%.*]] = getelementptr inbounds i8, ptr 
[[P]], i64 12
@@ -203,7 +203,7 @@ size_t test2_bdos(struct annotated *p) {
 // SANITIZE-WITH-ATTR-NEXT:[[TMP1:%.*]] = icmp ugt i64 [[TMP0]], 
[[INDEX]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR-NEXT:br i1 [[TMP1]], label [[CONT3:%.*]], label 
[[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR:   handler.out_of_bounds:
-// SANITIZE-WITH-ATTR-NEXT:tail call void 
@__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB5:[0-9]+]], i64 
[[INDEX]]) #[[ATTR10]], !nosanitize [[META2]]
+// SANITIZE-WITH-ATTR-NEXT:tail call void 
@__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB4:[0-9]+]], i64 
[[INDEX]]) #[[ATTR10]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR-NEXT:unreachable, !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR:   cont3:
 // SANITIZE-WITH-ATTR-NEXT:[[ARRAY:%.*]] = getelementptr inbounds i8, ptr 
[[P]], i64 12
@@ -308,7 +308,7 @@ size_t test3_bdos(struct annotated *p) {
 // SANITIZE-WITH-ATTR-NEXT:[[TMP1:%.*]] = icmp ult i64 [[IDXPROM]], 
[[TMP0]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR-NEXT:br i1 [[TMP1]], label [[CONT4:%.*]], label 
[[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR:   handler.out_of_bounds:
-// SANITIZE-WITH-ATTR-NEXT:tail call void 
@__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB6:[0-9]+]], i64 
[[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]]
+// SANITIZE-WITH-ATTR-NEXT:tail call void 
@__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB5:[0-9]+]], i64 
[[IDXPROM]]) #[[ATTR10]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR-NEXT:unreachable, !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR:   cont4:
 // SANITIZE-WITH-ATTR-NEXT:[[TMP2:%.*]] = icmp sgt i32 
[[DOT_COUNTED_BY_LOAD]], 2
@@ -325,7 +325,7 @@ size_t test3_bdos(struct annotated *p) {
 // SANITIZE-WITH-ATTR-NEXT:[[TMP7:%.*]] = icmp ult i64 [[IDXPROM13]], 
[[TMP6]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR-NEXT:br i1 [[TMP7]], label [[CONT20:%.*]], label 
[[HANDLER_OUT_OF_BOUNDS16:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
 // SANITIZE-WITH-ATTR:   handl

[clang] [llvm] [SCCP] Swap out range metadata to range attribute (PR #90134)

2024-04-25 Thread Andreas Jonson via cfe-commits

andjo403 wrote:

CC @nikic as you have looked at the most of other range attribute PRs

https://github.com/llvm/llvm-project/pull/90134
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [inline] Clone return range attribute on the callsite into inlined call (PR #92666)

2024-05-18 Thread Andreas Jonson via cfe-commits

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

CC @goldsteinn @nikic 

>From 6dd513a670e813a5e6745044bc69fdd7a7b7c4d9 Mon Sep 17 00:00:00 2001
From: Andreas Jonson 
Date: Sat, 18 May 2024 19:42:03 +0200
Subject: [PATCH 1/2] [inline] Tests for clone return range attribute on the
 callsite into inlined call [NFC]

---
 .../Inline/ret_attr_align_and_noundef.ll  | 73 +++
 1 file changed, 73 insertions(+)

diff --git a/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll 
b/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll
index c038ffccf3e96..7e76401c0b4de 100644
--- a/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll
+++ b/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll
@@ -5,10 +5,12 @@
 
 declare ptr @foo()
 declare void @use.ptr(ptr) willreturn nounwind
+declare void @use.val(i8) willreturn nounwind
 declare void @bar()
 declare void @baz()
 declare ptr @llvm.ptrmask.p0.i64(ptr, i64)
 declare i1 @val()
+declare i8 @val8()
 
 define ptr @callee0123() {
 ; CHECK-LABEL: define ptr @callee0123() {
@@ -337,3 +339,74 @@ define ptr @caller12_todo() {
   %r = call nonnull ptr @callee12()
   ret ptr %r
 }
+
+define i8 @callee13() {
+; CHECK-LABEL: define i8 @callee13() {
+; CHECK-NEXT:[[R:%.*]] = call i8 @val8()
+; CHECK-NEXT:ret i8 [[R]]
+;
+  %r = call i8 @val8()
+  ret i8 %r
+}
+
+define i8 @caller13_okay_use_after_poison_anyways() {
+; CHECK-LABEL: define i8 @caller13_okay_use_after_poison_anyways() {
+; CHECK-NEXT:[[R_I:%.*]] = call i8 @val8()
+; CHECK-NEXT:call void @use.val(i8 [[R_I]])
+; CHECK-NEXT:ret i8 [[R_I]]
+;
+  %r = call range(i8 0, 10) i8 @callee13()
+  call void @use.val(i8 %r)
+  ret i8 %r
+}
+
+define i8 @callee14() {
+; CHECK-LABEL: define i8 @callee14() {
+; CHECK-NEXT:[[R:%.*]] = call noundef i8 @val8()
+; CHECK-NEXT:ret i8 [[R]]
+;
+  %r = call noundef i8 @val8()
+  ret i8 %r
+}
+
+define i8 @caller14_fail_creates_ub() {
+; CHECK-LABEL: define i8 @caller14_fail_creates_ub() {
+; CHECK-NEXT:[[R_I:%.*]] = call noundef i8 @val8()
+; CHECK-NEXT:call void @use.val(i8 [[R_I]])
+; CHECK-NEXT:ret i8 [[R_I]]
+;
+  %r = call range(i8 0, 10) i8 @callee14()
+  call void @use.val(i8 %r)
+  ret i8 %r
+}
+
+define i8 @caller14_okay_is_ub_anyways() {
+; CHECK-LABEL: define i8 @caller14_okay_is_ub_anyways() {
+; CHECK-NEXT:[[R_I:%.*]] = call noundef i8 @val8()
+; CHECK-NEXT:call void @use.val(i8 [[R_I]])
+; CHECK-NEXT:ret i8 [[R_I]]
+;
+  %r = call noundef range(i8 0, 10) i8 @callee14()
+  call void @use.val(i8 %r)
+  ret i8 %r
+}
+
+define i8 @callee15() {
+; CHECK-LABEL: define i8 @callee15() {
+; CHECK-NEXT:[[R:%.*]] = call range(i8 5, 10) i8 @val8()
+; CHECK-NEXT:ret i8 [[R]]
+;
+  %r = call range(i8 5, 10) i8 @val8()
+  ret i8 %r
+}
+
+define i8 @caller15_okay_intersect_ranges() {
+; CHECK-LABEL: define i8 @caller15_okay_intersect_ranges() {
+; CHECK-NEXT:[[R_I:%.*]] = call range(i8 5, 10) i8 @val8()
+; CHECK-NEXT:call void @use.val(i8 [[R_I]])
+; CHECK-NEXT:ret i8 [[R_I]]
+;
+  %r = call range(i8 0, 7) i8 @callee15()
+  call void @use.val(i8 %r)
+  ret i8 %r
+}

>From 9a6ad2805ea6d02050e9ac16e4041ca3277e52a4 Mon Sep 17 00:00:00 2001
From: Andreas Jonson 
Date: Sat, 18 May 2024 19:44:31 +0200
Subject: [PATCH 2/2] [inline] Clone return range attribute on the callsite
 intoinlined call

---
 clang/test/Headers/__clang_hip_math.hip |  6 +++---
 llvm/lib/Transforms/Utils/InlineFunction.cpp| 13 -
 .../Transforms/Inline/ret_attr_align_and_noundef.ll |  6 +++---
 3 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/clang/test/Headers/__clang_hip_math.hip 
b/clang/test/Headers/__clang_hip_math.hip
index 1271868a53b86..26da82843c512 100644
--- a/clang/test/Headers/__clang_hip_math.hip
+++ b/clang/test/Headers/__clang_hip_math.hip
@@ -231,7 +231,7 @@ extern "C" __device__ uint64_t test___make_mantissa(const 
char *p) {
 
 // CHECK-LABEL: @test_abs(
 // CHECK-NEXT:  entry:
-// CHECK-NEXT:[[TMP0:%.*]] = tail call noundef i32 @llvm.abs.i32(i32 
[[X:%.*]], i1 true)
+// CHECK-NEXT:[[TMP0:%.*]] = tail call noundef range(i32 0, -2147483648) 
i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
 // CHECK-NEXT:ret i32 [[TMP0]]
 //
 extern "C" __device__ int test_abs(int x) {
@@ -240,7 +240,7 @@ extern "C" __device__ int test_abs(int x) {
 
 // CHECK-LABEL: @test_labs(
 // CHECK-NEXT:  entry:
-// CHECK-NEXT:[[TMP0:%.*]] = tail call noundef i64 @llvm.abs.i64(i64 
[[X:%.*]], i1 true)
+// CHECK-NEXT:[[TMP0:%.*]] = tail call noundef range(i64 0, 
-9223372036854775808) i64 @llvm.abs.i64(i64 [[X:%.*]], i1 true)
 // CHECK-NEXT:ret i64 [[TMP0]]
 //
 extern "C" __device__ long test_labs(long x) {
@@ -249,7 +249,7 @@ extern "C" __device__ long test_labs(long x) {
 
 // CHECK-LABEL: @test_llabs(
 // CHECK-NEXT:  entry:
-// CHECK-NEXT:[[TMP0:%.*]] = tail call noundef i64 @llvm.abs.i64(i64 
[[X:%.*]], i1 true)
+// CH

[clang] [llvm] [inline] Clone return range attribute on the callsite into inlined call (PR #92666)

2024-05-19 Thread Andreas Jonson via cfe-commits

andjo403 wrote:

hmm noticed #91101 now looks like I need to coordinate with that PR

https://github.com/llvm/llvm-project/pull/92666
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [Inliner] Propagate more attributes to params when inlining (PR #91101)

2024-05-19 Thread Andreas Jonson via cfe-commits


@@ -1427,8 +1429,20 @@ static void AddParamAndFnBasicAttributes(const CallBase 
&CB,
   ValidExactParamAttrs[ArgNo].getAlignment().valueOrOne())
 AL = AL.removeParamAttribute(Context, I, Attribute::Alignment);
 
+  auto ExistingRange = AL.getParamRange(I);
   AL = AL.addParamAttributes(Context, I, ValidExactParamAttrs[ArgNo]);
 
+  // For range we use the exact intersection.
+  if (ExistingRange.has_value()) {
+if (auto NewRange = ValidExactParamAttrs[ArgNo].getRange()) {
+  auto CombinedRange = 
ExistingRange->exactIntersectWith(*NewRange);
+  if (!CombinedRange.has_value())
+CombinedRange =
+ConstantRange::getEmpty(NewRange->getBitWidth());
+  AL = AL.removeParamAttribute(Context, I, Attribute::Range);

andjo403 wrote:

Is this to make it more clear what is happening that removeParamAttribute is 
called? as addRangeParamAttr will replace the current value there is no need to 
call removeParamAttribute.

https://github.com/llvm/llvm-project/pull/91101
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [Inliner] Propagate more attributes to params when inlining (PR #91101)

2024-05-19 Thread Andreas Jonson via cfe-commits


@@ -1427,8 +1429,20 @@ static void AddParamAndFnBasicAttributes(const CallBase 
&CB,
   ValidExactParamAttrs[ArgNo].getAlignment().valueOrOne())
 AL = AL.removeParamAttribute(Context, I, Attribute::Alignment);
 
+  auto ExistingRange = AL.getParamRange(I);
   AL = AL.addParamAttributes(Context, I, ValidExactParamAttrs[ArgNo]);
 
+  // For range we use the exact intersection.
+  if (ExistingRange.has_value()) {
+if (auto NewRange = ValidExactParamAttrs[ArgNo].getRange()) {
+  auto CombinedRange = 
ExistingRange->exactIntersectWith(*NewRange);

andjo403 wrote:

What is the reason to poison all values if exactIntersectWith is returning 
nullopt? is it not better to remove the range attribute instead of setting an 
empty range? or selecting the smallest range as is done by calling 
`intersectWith` feels like it is possible to assume that both ranges are valid 
only that the intersection gives multiple ranges.

https://github.com/llvm/llvm-project/pull/91101
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [Inliner] Propagate more attributes to params when inlining (PR #91101)

2024-05-22 Thread Andreas Jonson via cfe-commits


@@ -1427,8 +1429,20 @@ static void AddParamAndFnBasicAttributes(const CallBase 
&CB,
   ValidExactParamAttrs[ArgNo].getAlignment().valueOrOne())
 AL = AL.removeParamAttribute(Context, I, Attribute::Alignment);
 
+  auto ExistingRange = AL.getParamRange(I);
   AL = AL.addParamAttributes(Context, I, ValidExactParamAttrs[ArgNo]);
 
+  // For range we use the exact intersection.
+  if (ExistingRange.has_value()) {
+if (auto NewRange = ValidExactParamAttrs[ArgNo].getRange()) {
+  auto CombinedRange = 
ExistingRange->exactIntersectWith(*NewRange);
+  if (!CombinedRange.has_value())
+CombinedRange =
+ConstantRange::getEmpty(NewRange->getBitWidth());
+  AL = AL.removeParamAttribute(Context, I, Attribute::Range);

andjo403 wrote:

hmm if it have not missed something in the end this will be called 
https://github.com/llvm/llvm-project/blob/3591da9f1ccbd8b19fef4814f96638dbbe9c2b40/llvm/lib/IR/Attributes.cpp#L1782-L1790
so swap will be called and replace the current value or?

https://github.com/llvm/llvm-project/pull/91101
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [Inliner] Propagate more attributes to params when inlining (PR #91101)

2024-05-22 Thread Andreas Jonson via cfe-commits


@@ -1427,8 +1429,20 @@ static void AddParamAndFnBasicAttributes(const CallBase 
&CB,
   ValidExactParamAttrs[ArgNo].getAlignment().valueOrOne())
 AL = AL.removeParamAttribute(Context, I, Attribute::Alignment);
 
+  auto ExistingRange = AL.getParamRange(I);
   AL = AL.addParamAttributes(Context, I, ValidExactParamAttrs[ArgNo]);
 
+  // For range we use the exact intersection.
+  if (ExistingRange.has_value()) {
+if (auto NewRange = ValidExactParamAttrs[ArgNo].getRange()) {
+  auto CombinedRange = 
ExistingRange->exactIntersectWith(*NewRange);

andjo403 wrote:

But is it an empty range? if eg the ranges is [30, 20) and [10, 40) values in 
the ranges [10,20) and [30,40) are not poison but exactIntersectWith will 
return nullopt. I Think that it is possible to get ranges like that.

https://github.com/llvm/llvm-project/pull/91101
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [Inliner] Propagate more attributes to params when inlining (PR #91101)

2024-05-22 Thread Andreas Jonson via cfe-commits

https://github.com/andjo403 edited 
https://github.com/llvm/llvm-project/pull/91101
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [Inliner] Propagate more attributes to params when inlining (PR #91101)

2024-05-22 Thread Andreas Jonson via cfe-commits


@@ -1427,8 +1429,17 @@ static void AddParamAndFnBasicAttributes(const CallBase 
&CB,
   ValidExactParamAttrs[ArgNo].getAlignment().valueOrOne())
 AL = AL.removeParamAttribute(Context, I, Attribute::Alignment);
 
+  auto ExistingRange = AL.getParamRange(I);
   AL = AL.addParamAttributes(Context, I, ValidExactParamAttrs[ArgNo]);
 
+  // For range we use the exact intersection.

andjo403 wrote:

this comment is not correct anymore

https://github.com/llvm/llvm-project/pull/91101
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [inline] Clone return range attribute on the callsite into inlined call (PR #92666)

2024-05-26 Thread Andreas Jonson via cfe-commits

andjo403 wrote:

It was the usage of exactIntersectWith in 
https://github.com/llvm/llvm-project/pull/91101 vs the intersectWith that I 
used that I wanted to sort out but think that we have conluded that it shall be 
intersectWith.
so this it ready for review

https://github.com/llvm/llvm-project/pull/92666
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits