[llvm] [clang] [lld] [FuncAttrs] Deduce `noundef` attributes for return values (PR #76553)
nikic wrote: Yeah, we should skip this inference for functions with the sanitize_memory attribute. https://github.com/llvm/llvm-project/pull/76553 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [lld] [FuncAttrs] Deduce `noundef` attributes for return values (PR #76553)
dtcxzyw wrote: > Can you please fix or revert > https://lab.llvm.org/buildbot/#/builders/74/builds/24592 ? Thank you for reporting this! I will check the error log. https://github.com/llvm/llvm-project/pull/76553 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [lld] [FuncAttrs] Deduce `noundef` attributes for return values (PR #76553)
vitalybuka wrote: Another problem is that there was assumption that definition and declaration will be consistent, for msan is a part of ABI. Clang will generate them consistently for all modules, with declaration and definition of the function. Is possible that after this patch some definitions will get noundef, but declarations in other modules will still have none? If that is so, it breaks msan. https://github.com/llvm/llvm-project/pull/76553 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [lld] [FuncAttrs] Deduce `noundef` attributes for return values (PR #76553)
vitalybuka wrote: ``` This patch deduces noundef attributes for return values. IIUC, a function returns noundef values iff all of its return values are guaranteed not to be undef or poison. ``` https://github.com/llvm/llvm-project/pull/76553 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [lld] [FuncAttrs] Deduce `noundef` attributes for return values (PR #76553)
https://github.com/dtcxzyw closed https://github.com/llvm/llvm-project/pull/76553 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [lld] [FuncAttrs] Deduce `noundef` attributes for return values (PR #76553)
https://github.com/dtcxzyw edited https://github.com/llvm/llvm-project/pull/76553 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [lld] [FuncAttrs] Deduce `noundef` attributes for return values (PR #76553)
https://github.com/nikic approved this pull request. LGTM, assuming Linux CI passes now. https://github.com/llvm/llvm-project/pull/76553 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [lld] [FuncAttrs] Deduce `noundef` attributes for return values (PR #76553)
dtcxzyw wrote: > There are lld test failures. Done. https://github.com/llvm/llvm-project/pull/76553 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [lld] [FuncAttrs] Deduce `noundef` attributes for return values (PR #76553)
https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/76553 >From 30dcc33c4ea3ab50397a7adbe85fe977d4a400bd Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Fri, 29 Dec 2023 14:27:22 +0800 Subject: [PATCH 1/2] [FuncAttrs] Add pre-commit tests. NFC. --- llvm/test/Transforms/FunctionAttrs/noundef.ll | 145 ++ 1 file changed, 145 insertions(+) create mode 100644 llvm/test/Transforms/FunctionAttrs/noundef.ll diff --git a/llvm/test/Transforms/FunctionAttrs/noundef.ll b/llvm/test/Transforms/FunctionAttrs/noundef.ll new file mode 100644 index 00..9eca495e111e8f --- /dev/null +++ b/llvm/test/Transforms/FunctionAttrs/noundef.ll @@ -0,0 +1,145 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 +; RUN: opt < %s -passes='function-attrs' -S | FileCheck %s + +define i32 @test_ret_constant() { +; CHECK-LABEL: define i32 @test_ret_constant( +; CHECK-SAME: ) #[[ATTR0:[0-9]+]] { +; CHECK-NEXT:ret i32 0 +; + ret i32 0 +} + +define i32 @test_ret_poison() { +; CHECK-LABEL: define i32 @test_ret_poison( +; CHECK-SAME: ) #[[ATTR0]] { +; CHECK-NEXT:ret i32 poison +; + ret i32 poison +} + +define i32 @test_ret_undef() { +; CHECK-LABEL: define i32 @test_ret_undef( +; CHECK-SAME: ) #[[ATTR0]] { +; CHECK-NEXT:ret i32 undef +; + ret i32 undef +} + +define i32 @test_ret_param(i32 %x) { +; CHECK-LABEL: define i32 @test_ret_param( +; CHECK-SAME: i32 returned [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:ret i32 [[X]] +; + ret i32 %x +} + +define i32 @test_ret_noundef_param(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_noundef_param( +; CHECK-SAME: i32 noundef returned [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:ret i32 [[X]] +; + ret i32 %x +} + +define i32 @test_ret_noundef_expr(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_noundef_expr( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[Y:%.*]] = add i32 [[X]], 1 +; CHECK-NEXT:ret i32 [[Y]] +; + %y = add i32 %x, 1 + ret i32 %y +} + +define i32 @test_ret_create_poison_expr(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_create_poison_expr( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[Y:%.*]] = add nsw i32 [[X]], 1 +; CHECK-NEXT:ret i32 [[Y]] +; + %y = add nsw i32 %x, 1 + ret i32 %y +} + +define i32 @test_ret_freezed(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_freezed( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[Y:%.*]] = add nsw i32 [[X]], 1 +; CHECK-NEXT:[[Z:%.*]] = freeze i32 [[Y]] +; CHECK-NEXT:ret i32 [[Z]] +; + %y = add nsw i32 %x, 1 + %z = freeze i32 %y + ret i32 %z +} + +define i32 @test_ret_control_flow(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_control_flow( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[COND:%.*]] = icmp eq i32 [[X]], 0 +; CHECK-NEXT:br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] +; CHECK: if.then: +; CHECK-NEXT:ret i32 2 +; CHECK: if.else: +; CHECK-NEXT:[[RET:%.*]] = add i32 [[X]], 1 +; CHECK-NEXT:ret i32 [[RET]] +; + %cond = icmp eq i32 %x, 0 + br i1 %cond, label %if.then, label %if.else +if.then: + ret i32 2 +if.else: + %ret = add i32 %x, 1 + ret i32 %ret +} + +define i32 @test_ret_control_flow_may_poison(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_control_flow_may_poison( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[COND:%.*]] = icmp eq i32 [[X]], 0 +; CHECK-NEXT:br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] +; CHECK: if.then: +; CHECK-NEXT:ret i32 2 +; CHECK: if.else: +; CHECK-NEXT:[[RET:%.*]] = add nsw i32 [[X]], 1 +; CHECK-NEXT:ret i32 [[RET]] +; + %cond = icmp eq i32 %x, 0 + br i1 %cond, label %if.then, label %if.else +if.then: + ret i32 2 +if.else: + %ret = add nsw i32 %x, 1 + ret i32 %ret +} + +; TODO: use context-sensitive analysis +define i32 @test_ret_control_flow_never_poison(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_control_flow_never_poison( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[COND:%.*]] = icmp eq i32 [[X]], 2147483647 +; CHECK-NEXT:br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] +; CHECK: if.then: +; CHECK-NEXT:ret i32 2 +; CHECK: if.else: +; CHECK-NEXT:[[RET:%.*]] = add nsw i32 [[X]], 1 +; CHECK-NEXT:ret i32 [[RET]] +; + %cond = icmp eq i32 %x, 2147483647 + br i1 %cond, label %if.then, label %if.else +if.then: + ret i32 2 +if.else: + %ret = add nsw i32 %x, 1 + ret i32 %ret +} + +define i32 @test_noundef_prop() { +; CHECK-LABEL: define i32 @test_noundef_prop( +; CHECK-SAME: ) #[[ATTR0]] { +; CHECK-NEXT:[[RET:%.*]] = call i32 @test_ret_constant() +; CHECK-NEXT:ret i32 [[RET]] +; + %ret = call i32 @test_ret_constant() + ret i32 %ret +} >From fe11127cd7e9ed4669243502eda5991504b9809a Mon Sep 17 00:00:00 2001 From: Yingwei Zheng
[llvm] [clang] [lld] [FuncAttrs] Deduce `noundef` attributes for return values (PR #76553)
https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/76553 >From 30dcc33c4ea3ab50397a7adbe85fe977d4a400bd Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Fri, 29 Dec 2023 14:27:22 +0800 Subject: [PATCH 1/2] [FuncAttrs] Add pre-commit tests. NFC. --- llvm/test/Transforms/FunctionAttrs/noundef.ll | 145 ++ 1 file changed, 145 insertions(+) create mode 100644 llvm/test/Transforms/FunctionAttrs/noundef.ll diff --git a/llvm/test/Transforms/FunctionAttrs/noundef.ll b/llvm/test/Transforms/FunctionAttrs/noundef.ll new file mode 100644 index 00..9eca495e111e8f --- /dev/null +++ b/llvm/test/Transforms/FunctionAttrs/noundef.ll @@ -0,0 +1,145 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 +; RUN: opt < %s -passes='function-attrs' -S | FileCheck %s + +define i32 @test_ret_constant() { +; CHECK-LABEL: define i32 @test_ret_constant( +; CHECK-SAME: ) #[[ATTR0:[0-9]+]] { +; CHECK-NEXT:ret i32 0 +; + ret i32 0 +} + +define i32 @test_ret_poison() { +; CHECK-LABEL: define i32 @test_ret_poison( +; CHECK-SAME: ) #[[ATTR0]] { +; CHECK-NEXT:ret i32 poison +; + ret i32 poison +} + +define i32 @test_ret_undef() { +; CHECK-LABEL: define i32 @test_ret_undef( +; CHECK-SAME: ) #[[ATTR0]] { +; CHECK-NEXT:ret i32 undef +; + ret i32 undef +} + +define i32 @test_ret_param(i32 %x) { +; CHECK-LABEL: define i32 @test_ret_param( +; CHECK-SAME: i32 returned [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:ret i32 [[X]] +; + ret i32 %x +} + +define i32 @test_ret_noundef_param(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_noundef_param( +; CHECK-SAME: i32 noundef returned [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:ret i32 [[X]] +; + ret i32 %x +} + +define i32 @test_ret_noundef_expr(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_noundef_expr( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[Y:%.*]] = add i32 [[X]], 1 +; CHECK-NEXT:ret i32 [[Y]] +; + %y = add i32 %x, 1 + ret i32 %y +} + +define i32 @test_ret_create_poison_expr(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_create_poison_expr( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[Y:%.*]] = add nsw i32 [[X]], 1 +; CHECK-NEXT:ret i32 [[Y]] +; + %y = add nsw i32 %x, 1 + ret i32 %y +} + +define i32 @test_ret_freezed(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_freezed( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[Y:%.*]] = add nsw i32 [[X]], 1 +; CHECK-NEXT:[[Z:%.*]] = freeze i32 [[Y]] +; CHECK-NEXT:ret i32 [[Z]] +; + %y = add nsw i32 %x, 1 + %z = freeze i32 %y + ret i32 %z +} + +define i32 @test_ret_control_flow(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_control_flow( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[COND:%.*]] = icmp eq i32 [[X]], 0 +; CHECK-NEXT:br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] +; CHECK: if.then: +; CHECK-NEXT:ret i32 2 +; CHECK: if.else: +; CHECK-NEXT:[[RET:%.*]] = add i32 [[X]], 1 +; CHECK-NEXT:ret i32 [[RET]] +; + %cond = icmp eq i32 %x, 0 + br i1 %cond, label %if.then, label %if.else +if.then: + ret i32 2 +if.else: + %ret = add i32 %x, 1 + ret i32 %ret +} + +define i32 @test_ret_control_flow_may_poison(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_control_flow_may_poison( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[COND:%.*]] = icmp eq i32 [[X]], 0 +; CHECK-NEXT:br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] +; CHECK: if.then: +; CHECK-NEXT:ret i32 2 +; CHECK: if.else: +; CHECK-NEXT:[[RET:%.*]] = add nsw i32 [[X]], 1 +; CHECK-NEXT:ret i32 [[RET]] +; + %cond = icmp eq i32 %x, 0 + br i1 %cond, label %if.then, label %if.else +if.then: + ret i32 2 +if.else: + %ret = add nsw i32 %x, 1 + ret i32 %ret +} + +; TODO: use context-sensitive analysis +define i32 @test_ret_control_flow_never_poison(i32 noundef %x) { +; CHECK-LABEL: define i32 @test_ret_control_flow_never_poison( +; CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:[[COND:%.*]] = icmp eq i32 [[X]], 2147483647 +; CHECK-NEXT:br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] +; CHECK: if.then: +; CHECK-NEXT:ret i32 2 +; CHECK: if.else: +; CHECK-NEXT:[[RET:%.*]] = add nsw i32 [[X]], 1 +; CHECK-NEXT:ret i32 [[RET]] +; + %cond = icmp eq i32 %x, 2147483647 + br i1 %cond, label %if.then, label %if.else +if.then: + ret i32 2 +if.else: + %ret = add nsw i32 %x, 1 + ret i32 %ret +} + +define i32 @test_noundef_prop() { +; CHECK-LABEL: define i32 @test_noundef_prop( +; CHECK-SAME: ) #[[ATTR0]] { +; CHECK-NEXT:[[RET:%.*]] = call i32 @test_ret_constant() +; CHECK-NEXT:ret i32 [[RET]] +; + %ret = call i32 @test_ret_constant() + ret i32 %ret +} >From 46188dfe1a8069c94fc4628660889e070e6a82cb Mon Sep 17 00:00:00 2001 From: Yingwei Zheng