[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