[clang] [Clang] Swap range metadata to attribute for intrinsics. (PR #94851)
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)
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)
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)
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)
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)
@@ -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)
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)
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)
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)
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)
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)
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)
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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
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)
@@ -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)
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