https://github.com/OCHyams created 
https://github.com/llvm/llvm-project/pull/144346

None

>From 99c40d7c7eeaf8f1a58b7223491abe0e4ad9936a Mon Sep 17 00:00:00 2001
From: Orlando Cazalet-Hyams <orlando.hy...@sony.com>
Date: Mon, 16 Jun 2025 12:07:08 +0100
Subject: [PATCH 1/2] [KeyInstr][Clang] Memcopyable members init - store

---
 clang/lib/CodeGen/CGClass.cpp                 |  2 +
 .../init-member-memcopyable.cpp               | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 
clang/test/DebugInfo/KeyInstructions/init-member-memcopyable.cpp

diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index 13792c1042046..c91bfa4ba86b7 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -1341,6 +1341,8 @@ void CodeGenFunction::EmitCtorPrologue(const 
CXXConstructorDecl *CD,
     ApplyAtomGroup Grp(getDebugInfo());
     CM.addMemberInitializer(Member);
   }
+
+  ApplyAtomGroup Grp(getDebugInfo());
   CM.finish();
 }
 
diff --git a/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable.cpp 
b/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable.cpp
new file mode 100644
index 0000000000000..b73683c660b4e
--- /dev/null
+++ b/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable.cpp
@@ -0,0 +1,38 @@
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -gkey-instructions %s 
-gno-column-info -debug-info-kind=line-tables-only -emit-llvm -o - \
+// RUN: | FileCheck %s
+
+// g::h can be memcpy'd (in this case emitted as load/stored), check the
+// assignment gets Key Instructions metadata.
+
+struct e {
+  e(e &);
+};
+
+struct g {
+  e f;
+  int h;
+};
+
+// CHECK: define{{.*}}void @_ZN1gC2ERS_
+// CHECK-NEXT: entry:
+// CHECK-NEXT: %this.addr = alloca ptr, align 8
+// CHECK-NEXT: %.addr = alloca ptr, align 8
+// CHECK-NEXT: store ptr %this, ptr %this.addr, align 8
+// CHECK-NEXT: store ptr %0, ptr %.addr, align 8
+// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 8
+// CHECK-NEXT: %1 = load ptr, ptr %.addr, align 8
+// CHECK-NEXT: call void @_ZN1eC1ERS_
+// CHECK-NEXT: %h = getelementptr inbounds nuw %struct.g, ptr %this1, i32 0, 
i32 1
+// CHECK-NEXT: %2 = load ptr, ptr %.addr, align 8
+// CHECK-NEXT: %h2 = getelementptr inbounds nuw %struct.g, ptr %2, i32 0, i32 1
+// CHECK-NEXT: %3 = load i32, ptr %h2, align 4, !dbg [[G1R2:!.*]]
+// CHECK-NEXT: store i32 %3, ptr %h, align 4, !dbg [[G1R1:!.*]]
+// CHECK-NEXT: ret void, !dbg
+
+// CHECK: [[G1R2]] = !DILocation(line: 11, scope: ![[#]], atomGroup: 1, 
atomRank: 2)
+// CHECK: [[G1R1]] = !DILocation(line: 11, scope: ![[#]], atomGroup: 1, 
atomRank: 1)
+
+[[gnu::nodebug]]
+void fun(g *x) {
+  g y = g(*x);
+}

>From c21aa9413009b645c3af49682213fe32ca1c694c Mon Sep 17 00:00:00 2001
From: Orlando Cazalet-Hyams <orlando.hy...@sony.com>
Date: Mon, 16 Jun 2025 13:11:33 +0100
Subject: [PATCH 2/2] [KeyInstr][Clang] Memcopyable members init - memcpy

---
 clang/lib/CodeGen/CGClass.cpp                 |  3 +-
 .../init-member-memcopyable-2.cpp             | 36 +++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 
clang/test/DebugInfo/KeyInstructions/init-member-memcopyable-2.cpp

diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index c91bfa4ba86b7..c78267857bc9e 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -1000,7 +1000,8 @@ namespace {
     void emitMemcpyIR(Address DestPtr, Address SrcPtr, CharUnits Size) {
       DestPtr = DestPtr.withElementType(CGF.Int8Ty);
       SrcPtr = SrcPtr.withElementType(CGF.Int8Ty);
-      CGF.Builder.CreateMemCpy(DestPtr, SrcPtr, Size.getQuantity());
+      auto *I = CGF.Builder.CreateMemCpy(DestPtr, SrcPtr, Size.getQuantity());
+      CGF.addInstToCurrentSourceAtom(I, nullptr);
     }
 
     void addInitialField(FieldDecl *F) {
diff --git a/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable-2.cpp 
b/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable-2.cpp
new file mode 100644
index 0000000000000..3df5dc357169e
--- /dev/null
+++ b/clang/test/DebugInfo/KeyInstructions/init-member-memcopyable-2.cpp
@@ -0,0 +1,36 @@
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -gkey-instructions %s 
-gno-column-info -debug-info-kind=line-tables-only -emit-llvm -o - \
+// RUN: | FileCheck %s
+
+// g::h and i can be memcpy'd, check the assignment gets Key Instructions 
metadata.
+
+struct e {
+  e(e &);
+};
+
+struct g {
+  e f;
+  int h;
+  int i;
+};
+
+// CHECK: define{{.*}}void @_ZN1gC2ERS_
+// CHECK-NEXT: entry:
+// CHECK-NEXT: %this.addr = alloca ptr, align 8
+// CHECK-NEXT: %.addr = alloca ptr, align 8
+// CHECK-NEXT: store ptr %this, ptr %this.addr, align 8
+// CHECK-NEXT: store ptr %0, ptr %.addr, align 8
+// CHECK-NEXT: %this1 = load ptr, ptr %this.addr, align 8
+// CHECK-NEXT: %1 = load ptr, ptr %.addr, align 8
+// CHECK-NEXT: call void @_ZN1eC1ERS_
+// CHECK-NEXT: %h = getelementptr inbounds nuw %struct.g, ptr %this1, i32 0, 
i32 1
+// CHECK-NEXT: %2 = load ptr, ptr %.addr, align 8
+// CHECK-NEXT: %h2 = getelementptr inbounds nuw %struct.g, ptr %2, i32 0, i32 1
+// CHECK-NEXT: call void @llvm.memcpy{{.*}}(ptr align 4 %h, ptr align 4 %h2, 
i64 8, i1 false), !dbg [[G1R1:!.*]]
+// CHECK-NEXT: ret void, !dbg
+
+// CHECK: [[G1R1]] = !DILocation(line: 10, scope: ![[#]], atomGroup: 1, 
atomRank: 1)
+
+[[gnu::nodebug]]
+void fun(g *x) {
+  g y = g(*x);
+}

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

Reply via email to