Author: Xiang Li Date: 2022-10-06T15:00:50-07:00 New Revision: 2bdfececef4330b3a6489cdb67c57eb771d5f9e4
URL: https://github.com/llvm/llvm-project/commit/2bdfececef4330b3a6489cdb67c57eb771d5f9e4 DIFF: https://github.com/llvm/llvm-project/commit/2bdfececef4330b3a6489cdb67c57eb771d5f9e4.diff LOG: [HLSL] Remove global ctor/dtor variable for non-lib profile. After generated call for ctor/dtor for entry, global variable for ctor/dtor are useless. Remove them for non-lib profiles. Lib profile still need these in case export function used the global variable which require ctor/dtor. Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D133993 Added: Modified: clang/lib/CodeGen/CGHLSLRuntime.cpp clang/test/CodeGenHLSL/GlobalConstructorFunction.hlsl clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl clang/test/CodeGenHLSL/GlobalConstructors.hlsl clang/test/CodeGenHLSL/GlobalDestructors.hlsl Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index 20106ab664835..96a8f22aa877e 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -212,4 +212,14 @@ void CGHLSLRuntime::generateGlobalCtorDtorCalls() { for (auto *Fn : DtorFns) B.CreateCall(FunctionCallee(Fn)); } + + // No need to keep global ctors/dtors for non-lib profile after call to + // ctors/dtors added for entry. + Triple T(M.getTargetTriple()); + if (T.getEnvironment() != Triple::EnvironmentType::Library) { + if (auto *GV = M.getNamedGlobal("llvm.global_ctors")) + GV->eraseFromParent(); + if (auto *GV = M.getNamedGlobal("llvm.global_dtors")) + GV->eraseFromParent(); + } } diff --git a/clang/test/CodeGenHLSL/GlobalConstructorFunction.hlsl b/clang/test/CodeGenHLSL/GlobalConstructorFunction.hlsl index db47c5c565805..d65dec4a1ddf4 100644 --- a/clang/test/CodeGenHLSL/GlobalConstructorFunction.hlsl +++ b/clang/test/CodeGenHLSL/GlobalConstructorFunction.hlsl @@ -17,6 +17,10 @@ __attribute__((destructor)) void call_me_last(void) { [numthreads(1,1,1)] void main(unsigned GI : SV_GroupIndex) {} +// Make sure global variable for ctors/dtors removed. +// CHECK-NOT:@llvm.global_ctors +// CHECK-NOT:@llvm.global_dtors + //CHECK: define void @main() //CHECK-NEXT: entry: //CHECK-NEXT: call void @"?call_me_first@@YAXXZ"() diff --git a/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl b/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl index 4a366946219b4..e7fe4e0c4caf7 100644 --- a/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl +++ b/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl @@ -1,5 +1,8 @@ // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -S -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s +// Make sure global variable for ctors exist for lib profile. +// CHECK:@llvm.global_ctors + RWBuffer<float> Buffer; [shader("compute")] diff --git a/clang/test/CodeGenHLSL/GlobalConstructors.hlsl b/clang/test/CodeGenHLSL/GlobalConstructors.hlsl index cb250766099d5..332302e1a8bb0 100644 --- a/clang/test/CodeGenHLSL/GlobalConstructors.hlsl +++ b/clang/test/CodeGenHLSL/GlobalConstructors.hlsl @@ -5,6 +5,9 @@ RWBuffer<float> Buffer; [numthreads(1,1,1)] void main(unsigned GI : SV_GroupIndex) {} +// Make sure global variable for ctors/dtors removed. +// CHECK-NOT:@llvm.global_ctors +// CHECK-NOT:@llvm.global_dtors //CHECK: define void @main() //CHECK-NEXT: entry: //CHECK-NEXT: call void @_GLOBAL__sub_I_GlobalConstructors.hlsl() diff --git a/clang/test/CodeGenHLSL/GlobalDestructors.hlsl b/clang/test/CodeGenHLSL/GlobalDestructors.hlsl index 6d618ff18eb22..03505e3e46c4b 100644 --- a/clang/test/CodeGenHLSL/GlobalDestructors.hlsl +++ b/clang/test/CodeGenHLSL/GlobalDestructors.hlsl @@ -1,5 +1,10 @@ -// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -std=hlsl202x -S -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s -// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -std=hlsl202x -S -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s --check-prefixes=CHECK +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -std=hlsl202x -S -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s --check-prefixes=CS,CHECK +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -std=hlsl202x -S -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s --check-prefixes=LIB,CHECK + +// Make sure global variable for dtors exist for lib profile. +// LIB:@llvm.global_dtors +// Make sure global variable for dtors removed for compute profile. +// CS-NOT:llvm.global_dtors struct Tail { Tail() { @@ -40,6 +45,9 @@ void main(unsigned GI : SV_GroupIndex) { Wag(); } +// Make sure global variable for ctors/dtors removed. +// CHECK-NOT:@llvm.global_ctors +// CHECK-NOT:@llvm.global_dtors //CHECK: define void @main() //CHECK-NEXT: entry: //CHECK-NEXT: call void @_GLOBAL__sub_I_GlobalDestructors.hlsl() _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits