[clang] [Clang] Emit lifetime markers for non-aggregate temporary allocas (PR #90849)
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)
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)
@@ -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)
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)
@@ -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)
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)
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