[clang] [Clang] Emit lifetime markers for non-aggregate temporary allocas (PR #90849)

2024-05-21 Thread via cfe-commits

https://github.com/Lukacma closed 
https://github.com/llvm/llvm-project/pull/90849
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Emit lifetime markers for non-aggregate temporary allocas (PR #90849)

2024-05-20 Thread Eli Friedman via cfe-commits

https://github.com/efriedma-quic approved this pull request.

LGTM

https://github.com/llvm/llvm-project/pull/90849
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Emit lifetime markers for non-aggregate temporary allocas (PR #90849)

2024-05-20 Thread via cfe-commits


@@ -1,13 +1,15 @@
-// RUN: %clang_cc1 -emit-llvm -triple arm64-- -o - %s -O0 | FileCheck %s 
--check-prefix=CHECK-O0
-// RUN: %clang_cc1 -emit-llvm -disable-llvm-optzns -triple arm64-- -o - %s -O3 
| FileCheck %s --check-prefix=CHECK-O3
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 
UTC_ARGS: --version 4

Lukacma wrote:

Sorry about that. I used update_cc_test_checks so I do not have to write whole 
llvm IR manually, but I heavily modified it. I wasn't planning for this test to 
be regenerable using update_cc_test_checks, I just forgot to remove the note. 
It is fixed now

https://github.com/llvm/llvm-project/pull/90849
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Emit lifetime markers for non-aggregate temporary allocas (PR #90849)

2024-05-20 Thread via cfe-commits

https://github.com/Lukacma updated 
https://github.com/llvm/llvm-project/pull/90849

>From 18c489682d38837d7b0abc7b9ecf829a9df4bd0c Mon Sep 17 00:00:00 2001
From: Marian Lukac 
Date: Thu, 2 May 2024 11:33:13 +
Subject: [PATCH 1/3] [Clang] Added lifetime markers for temp. allocated
 Aggregate types

---
 clang/lib/CodeGen/CGCall.cpp  | 10 
 clang/test/CodeGen/aarch64-byval-temp.c   | 46 +--
 ...-acle-__ARM_FEATURE_SVE_VECTOR_OPERATORS.c |  2 +
 ...cle-__ARM_FEATURE_SVE_VECTOR_OPERATORS.cpp |  2 +
 clang/test/CodeGen/nofpclass.c| 22 +
 5 files changed, 70 insertions(+), 12 deletions(-)

diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 1b4ca2a8b2fe8..8fdde5326b8ed 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -5202,6 +5202,16 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo 
,
   Val = Builder.CreateFreeze(Val);
 IRCallArgs[FirstIRArg] = Val;
 
+// Emit lifetime markers for the temporary alloca.
+llvm::TypeSize ByvalTempElementSize =
+CGM.getDataLayout().getTypeAllocSize(Addr.getElementType());
+llvm::Value *LifetimeSize =
+EmitLifetimeStart(ByvalTempElementSize, Addr.getPointer());
+
+// Add cleanup code to emit the end lifetime marker after the call.
+if (LifetimeSize) // In case we disabled lifetime markers.
+  CallLifetimeEndAfterCall.emplace_back(Addr, LifetimeSize);
+
 I->copyInto(*this, Addr);
   } else {
 // We want to avoid creating an unnecessary temporary+copy here;
diff --git a/clang/test/CodeGen/aarch64-byval-temp.c 
b/clang/test/CodeGen/aarch64-byval-temp.c
index e9e2586406e5c..765a298f83ed0 100644
--- a/clang/test/CodeGen/aarch64-byval-temp.c
+++ b/clang/test/CodeGen/aarch64-byval-temp.c
@@ -1,13 +1,15 @@
-// RUN: %clang_cc1 -emit-llvm -triple arm64-- -o - %s -O0 | FileCheck %s 
--check-prefix=CHECK-O0
-// RUN: %clang_cc1 -emit-llvm -disable-llvm-optzns -triple arm64-- -o - %s -O3 
| FileCheck %s --check-prefix=CHECK-O3
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 
UTC_ARGS: --version 4
+// RUN: %clang_cc1 -emit-llvm -triple arm64-- 
-fexperimental-max-bitint-width=1024  -o - %s -O0 | FileCheck %s 
--check-prefix=CHECK-O0
+// RUN: %clang_cc1 -emit-llvm -disable-llvm-optzns 
-fexperimental-max-bitint-width=1024  -triple arm64-- -o - %s -O3 | FileCheck 
%s --check-prefix=CHECK-O3
 
 struct large {
 void* pointers[8];
 };
 
 void pass_large(struct large);
+void pass_large_BitInt(_BitInt(129));
 
-// For arm64, we don't use byval to pass structs but instead we create
+// For arm64, we don't use byval to pass structs and _BitInt(>128) type, but 
instead we create
 // temporary allocas.
 //
 // Make sure we generate the appropriate lifetime markers for the temporary
@@ -71,3 +73,41 @@ void example(void) {
 // Mark the end of the lifetime of `l`.
 // CHECK-O3-NEXT: call void @llvm.lifetime.end.p0(i64 64, ptr %l)
 // CHECK-O3-NEXT: ret void
+
+void example_BitInt(void) {
+_BitInt(129) l = {0};
+pass_large_BitInt(l);
+pass_large_BitInt(l);
+}
+// CHECK-O0-LABEL: define dso_local void @example_BitInt(
+// CHECK-O0-NEXT:  entry:
+// CHECK-O0-NEXT:[[L:%.*]] = alloca i129, align 16
+// CHECK-O0-NEXT:[[INDIRECT_ARG_TEMP:%.*]] = alloca i129, align 16
+// CHECK-O0-NEXT:[[INDIRECT_ARG_TEMP1:%.*]] = alloca i129, align 16
+// CHECK-O0-NEXT:store i129 0, ptr [[L]], align 16
+// CHECK-O0-NEXT:[[TMP0:%.*]] = load i129, ptr [[L]], align 16
+// CHECK-O0-NEXT:store i129 [[TMP0]], ptr [[INDIRECT_ARG_TEMP]], align 16
+// CHECK-O0-NEXT:call void @pass_large_BitInt(ptr noundef 
[[INDIRECT_ARG_TEMP]])
+// CHECK-O0-NEXT:[[TMP1:%.*]] = load i129, ptr [[L]], align 16
+// CHECK-O0-NEXT:store i129 [[TMP1]], ptr [[INDIRECT_ARG_TEMP1]], align 16
+// CHECK-O0-NEXT:call void @pass_large_BitInt(ptr noundef 
[[INDIRECT_ARG_TEMP1]])
+// CHECK-O0-NEXT:ret void
+//
+// CHECK-O3-LABEL: define dso_local void @example_BitInt(
+// CHECK-O3-NEXT:  entry:
+// CHECK-O3-NEXT:[[L:%.*]] = alloca i129, align 16
+// CHECK-O3-NEXT:[[INDIRECT_ARG_TEMP:%.*]] = alloca i129, align 16
+// CHECK-O3-NEXT:[[INDIRECT_ARG_TEMP1:%.*]] = alloca i129, align 16
+// CHECK-O3-NEXT:call void @llvm.lifetime.start.p0(i64 32, ptr [[L]]) 
+// CHECK-O3-NEXT:store i129 0, ptr [[L]], align 16, !tbaa [[TBAA6:![0-9]+]]
+// CHECK-O3-NEXT:[[TMP0:%.*]] = load i129, ptr [[L]], align 16, !tbaa 
[[TBAA6]]
+// CHECK-O3-NEXT:call void @llvm.lifetime.start.p0(i64 32, ptr 
[[INDIRECT_ARG_TEMP]]) 
+// CHECK-O3-NEXT:store i129 [[TMP0]], ptr [[INDIRECT_ARG_TEMP]], align 16, 
!tbaa [[TBAA6]]
+// CHECK-O3-NEXT:call void @pass_large_BitInt(ptr noundef 
[[INDIRECT_ARG_TEMP]])
+// CHECK-O3-NEXT:call void @llvm.lifetime.end.p0(i64 32, ptr 
[[INDIRECT_ARG_TEMP]]) 
+// CHECK-O3-NEXT:[[TMP1:%.*]] = load i129, ptr 

[clang] [Clang] Emit lifetime markers for non-aggregate temporary allocas (PR #90849)

2024-05-15 Thread Eli Friedman via cfe-commits


@@ -1,13 +1,15 @@
-// RUN: %clang_cc1 -emit-llvm -triple arm64-- -o - %s -O0 | FileCheck %s 
--check-prefix=CHECK-O0
-// RUN: %clang_cc1 -emit-llvm -disable-llvm-optzns -triple arm64-- -o - %s -O3 
| FileCheck %s --check-prefix=CHECK-O3
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 
UTC_ARGS: --version 4

efriedma-quic wrote:

It looks like the existing checks didn't get regenerated?  Did you modify the 
output of update_cc_test_checks hand?  (Don't do that; someone will regenerate 
the test at some point and destroy your customizations.)

https://github.com/llvm/llvm-project/pull/90849
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Emit lifetime markers for non-aggregate temporary allocas (PR #90849)

2024-05-15 Thread via cfe-commits

https://github.com/Lukacma updated 
https://github.com/llvm/llvm-project/pull/90849

>From 18c489682d38837d7b0abc7b9ecf829a9df4bd0c Mon Sep 17 00:00:00 2001
From: Marian Lukac 
Date: Thu, 2 May 2024 11:33:13 +
Subject: [PATCH 1/2] [Clang] Added lifetime markers for temp. allocated
 Aggregate types

---
 clang/lib/CodeGen/CGCall.cpp  | 10 
 clang/test/CodeGen/aarch64-byval-temp.c   | 46 +--
 ...-acle-__ARM_FEATURE_SVE_VECTOR_OPERATORS.c |  2 +
 ...cle-__ARM_FEATURE_SVE_VECTOR_OPERATORS.cpp |  2 +
 clang/test/CodeGen/nofpclass.c| 22 +
 5 files changed, 70 insertions(+), 12 deletions(-)

diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 1b4ca2a8b2fe8..8fdde5326b8ed 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -5202,6 +5202,16 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo 
,
   Val = Builder.CreateFreeze(Val);
 IRCallArgs[FirstIRArg] = Val;
 
+// Emit lifetime markers for the temporary alloca.
+llvm::TypeSize ByvalTempElementSize =
+CGM.getDataLayout().getTypeAllocSize(Addr.getElementType());
+llvm::Value *LifetimeSize =
+EmitLifetimeStart(ByvalTempElementSize, Addr.getPointer());
+
+// Add cleanup code to emit the end lifetime marker after the call.
+if (LifetimeSize) // In case we disabled lifetime markers.
+  CallLifetimeEndAfterCall.emplace_back(Addr, LifetimeSize);
+
 I->copyInto(*this, Addr);
   } else {
 // We want to avoid creating an unnecessary temporary+copy here;
diff --git a/clang/test/CodeGen/aarch64-byval-temp.c 
b/clang/test/CodeGen/aarch64-byval-temp.c
index e9e2586406e5c..765a298f83ed0 100644
--- a/clang/test/CodeGen/aarch64-byval-temp.c
+++ b/clang/test/CodeGen/aarch64-byval-temp.c
@@ -1,13 +1,15 @@
-// RUN: %clang_cc1 -emit-llvm -triple arm64-- -o - %s -O0 | FileCheck %s 
--check-prefix=CHECK-O0
-// RUN: %clang_cc1 -emit-llvm -disable-llvm-optzns -triple arm64-- -o - %s -O3 
| FileCheck %s --check-prefix=CHECK-O3
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 
UTC_ARGS: --version 4
+// RUN: %clang_cc1 -emit-llvm -triple arm64-- 
-fexperimental-max-bitint-width=1024  -o - %s -O0 | FileCheck %s 
--check-prefix=CHECK-O0
+// RUN: %clang_cc1 -emit-llvm -disable-llvm-optzns 
-fexperimental-max-bitint-width=1024  -triple arm64-- -o - %s -O3 | FileCheck 
%s --check-prefix=CHECK-O3
 
 struct large {
 void* pointers[8];
 };
 
 void pass_large(struct large);
+void pass_large_BitInt(_BitInt(129));
 
-// For arm64, we don't use byval to pass structs but instead we create
+// For arm64, we don't use byval to pass structs and _BitInt(>128) type, but 
instead we create
 // temporary allocas.
 //
 // Make sure we generate the appropriate lifetime markers for the temporary
@@ -71,3 +73,41 @@ void example(void) {
 // Mark the end of the lifetime of `l`.
 // CHECK-O3-NEXT: call void @llvm.lifetime.end.p0(i64 64, ptr %l)
 // CHECK-O3-NEXT: ret void
+
+void example_BitInt(void) {
+_BitInt(129) l = {0};
+pass_large_BitInt(l);
+pass_large_BitInt(l);
+}
+// CHECK-O0-LABEL: define dso_local void @example_BitInt(
+// CHECK-O0-NEXT:  entry:
+// CHECK-O0-NEXT:[[L:%.*]] = alloca i129, align 16
+// CHECK-O0-NEXT:[[INDIRECT_ARG_TEMP:%.*]] = alloca i129, align 16
+// CHECK-O0-NEXT:[[INDIRECT_ARG_TEMP1:%.*]] = alloca i129, align 16
+// CHECK-O0-NEXT:store i129 0, ptr [[L]], align 16
+// CHECK-O0-NEXT:[[TMP0:%.*]] = load i129, ptr [[L]], align 16
+// CHECK-O0-NEXT:store i129 [[TMP0]], ptr [[INDIRECT_ARG_TEMP]], align 16
+// CHECK-O0-NEXT:call void @pass_large_BitInt(ptr noundef 
[[INDIRECT_ARG_TEMP]])
+// CHECK-O0-NEXT:[[TMP1:%.*]] = load i129, ptr [[L]], align 16
+// CHECK-O0-NEXT:store i129 [[TMP1]], ptr [[INDIRECT_ARG_TEMP1]], align 16
+// CHECK-O0-NEXT:call void @pass_large_BitInt(ptr noundef 
[[INDIRECT_ARG_TEMP1]])
+// CHECK-O0-NEXT:ret void
+//
+// CHECK-O3-LABEL: define dso_local void @example_BitInt(
+// CHECK-O3-NEXT:  entry:
+// CHECK-O3-NEXT:[[L:%.*]] = alloca i129, align 16
+// CHECK-O3-NEXT:[[INDIRECT_ARG_TEMP:%.*]] = alloca i129, align 16
+// CHECK-O3-NEXT:[[INDIRECT_ARG_TEMP1:%.*]] = alloca i129, align 16
+// CHECK-O3-NEXT:call void @llvm.lifetime.start.p0(i64 32, ptr [[L]]) 
+// CHECK-O3-NEXT:store i129 0, ptr [[L]], align 16, !tbaa [[TBAA6:![0-9]+]]
+// CHECK-O3-NEXT:[[TMP0:%.*]] = load i129, ptr [[L]], align 16, !tbaa 
[[TBAA6]]
+// CHECK-O3-NEXT:call void @llvm.lifetime.start.p0(i64 32, ptr 
[[INDIRECT_ARG_TEMP]]) 
+// CHECK-O3-NEXT:store i129 [[TMP0]], ptr [[INDIRECT_ARG_TEMP]], align 16, 
!tbaa [[TBAA6]]
+// CHECK-O3-NEXT:call void @pass_large_BitInt(ptr noundef 
[[INDIRECT_ARG_TEMP]])
+// CHECK-O3-NEXT:call void @llvm.lifetime.end.p0(i64 32, ptr 
[[INDIRECT_ARG_TEMP]]) 
+// CHECK-O3-NEXT:[[TMP1:%.*]] = load i129, ptr 

[clang] [Clang] Emit lifetime markers for non-aggregate temporary allocas (PR #90849)

2024-05-15 Thread via cfe-commits

https://github.com/Lukacma edited 
https://github.com/llvm/llvm-project/pull/90849
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits