[clang] [Clang][CodeGen] Emit dereferenceable and nofree for indirect arguments (PR #213347)
Sayan Sivakumaran via cfe-commits
cfe-commits at lists.llvm.org
Sun Aug 2 08:13:37 PDT 2026
================
@@ -46,35 +46,35 @@ struct copy_ctor {
copy_ctor(copy_ctor const &);
};
test(copy_ctor);
-// CHECK: define void @_Z7forward9copy_ctor(ptr dead_on_unwind noalias {{[^,]*}} sret(%struct.copy_ctor) align 8 %{{.*}}, ptr nonnull align 8 dead_on_return %{{.*}})
+// CHECK: define void @_Z7forward9copy_ctor(ptr dead_on_unwind noalias {{[^,]*}} sret(%struct.copy_ctor) align 8 %{{.*}}, ptr nofree align 8 dead_on_return dereferenceable(8) %{{.*}})
//
// CHECK: declare ptr @_ZN9copy_ctorC1ERKS_(ptr {{[^,]*}} returned {{[^,]*}}, ptr nonnull align 8 dereferenceable(8))
//
// CHECK: define void @_Z14test_copy_ctorv()
// CHECK: %[[tmp:.*]] = alloca %struct.copy_ctor, align 8
// CHECK: call void @_Z13def_copy_ctorv(ptr dead_on_unwind nonnull writable sret(%struct.copy_ctor) align 8 %[[tmp]])
-// CHECK: call void @_Z3use9copy_ctor(ptr nonnull align 8 dead_on_return %[[tmp]])
+// CHECK: call void @_Z3use9copy_ctor(ptr nofree align 8 dead_on_return dereferenceable(8) %[[tmp]])
// CHECK: ret void
//
-// CHECK: declare void @_Z3use9copy_ctor(ptr align 8 dead_on_return)
+// CHECK: declare void @_Z3use9copy_ctor(ptr nofree align 8 dead_on_return dereferenceable(8))
// CHECK: declare void @_Z13def_copy_ctorv(ptr dead_on_unwind writable sret(%struct.copy_ctor) align 8)
struct __attribute__((aligned(16))) aligned_copy_ctor {
double d, e;
aligned_copy_ctor(aligned_copy_ctor const &);
};
test(aligned_copy_ctor);
-// CHECK: define void @_Z7forward17aligned_copy_ctor(ptr dead_on_unwind noalias {{[^,]*}} sret(%struct.aligned_copy_ctor) align 16 %{{.*}}, ptr nonnull align 16 dead_on_return %{{.*}})
+// CHECK: define void @_Z7forward17aligned_copy_ctor(ptr dead_on_unwind noalias {{[^,]*}} sret(%struct.aligned_copy_ctor) align 16 %{{.*}}, ptr nofree align 16 dead_on_return dereferenceable(16) %{{.*}})
//
// CHECK: declare ptr @_ZN17aligned_copy_ctorC1ERKS_(ptr {{[^,]*}} returned {{[^,]*}}, ptr nonnull align 16 dereferenceable(16))
//
// CHECK: define void @_Z22test_aligned_copy_ctorv()
// CHECK: %[[tmp:.*]] = alloca %struct.aligned_copy_ctor, align 16
// CHECK: call void @_Z21def_aligned_copy_ctorv(ptr dead_on_unwind nonnull writable sret(%struct.aligned_copy_ctor) align 16 %[[tmp]])
-// CHECK: call void @_Z3use17aligned_copy_ctor(ptr nonnull align 16 dead_on_return %[[tmp]])
+// CHECK: call void @_Z3use17aligned_copy_ctor(ptr nofree align 16 dead_on_return dereferenceable(16) %[[tmp]])
----------------
sivakusayan wrote:
It's confusing why `nonnull` was removed here, but apparently the test file runs with optimizations on:
```
RUN: %clang_cc1 -no-enable-noundef-analysis -O1 -triple wasm32-unknown-unknown -emit-llvm -o - %s \
```
I think it's weird for a codegen test to do that, but I'm guessing I'm missing some context.
https://github.com/llvm/llvm-project/pull/213347
More information about the cfe-commits
mailing list