[clang] cac0686 - [HIP] Make sure, unused hip-pinned-shadow global var is kept within device code
via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 3 21:24:55 PST 2020
Author: hsmahesha
Date: 2020-03-04T10:54:26+05:30
New Revision: cac068600e55e489844156d3581b61eeecee7d4e
URL: https://github.com/llvm/llvm-project/commit/cac068600e55e489844156d3581b61eeecee7d4e
DIFF: https://github.com/llvm/llvm-project/commit/cac068600e55e489844156d3581b61eeecee7d4e.diff
LOG: [HIP] Make sure, unused hip-pinned-shadow global var is kept within device code
Summary:
hip-pinned-shadow global var should remain in the final code object irrespective
of whether it is used or not within the code. Add it to used list, so that it
will not get eliminated when it is unused.
Reviewers: yaxunl, tra, hliao
Reviewed By: yaxunl
Subscribers: hliao, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D75402
Added:
Modified:
clang/lib/CodeGen/CodeGenModule.cpp
clang/lib/CodeGen/CodeGenModule.h
clang/test/CodeGenCUDA/hip-pinned-shadow.cu
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index faff623a2973..719cb05d9ec8 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1916,9 +1916,9 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
}
}
-void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) {
- assert(!GV->isDeclaration() &&
- "Only globals with definition can force usage.");
+void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV, bool SkipCheck) {
+ assert(SkipCheck || (!GV->isDeclaration() &&
+ "Only globals with definition can force usage."));
LLVMUsed.emplace_back(GV);
}
@@ -4071,9 +4071,17 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D,
}
}
- if (!IsHIPPinnedShadowVar)
+ // HIPPinnedShadowVar should remain in the final code object irrespective of
+ // whether it is used or not within the code. Add it to used list, so that
+ // it will not get eliminated when it is unused. Also, it is an extern var
+ // within device code, and it should *not* get initialized within device code.
+ if (IsHIPPinnedShadowVar)
+ addUsedGlobal(GV, /*SkipCheck=*/true);
+ else
GV->setInitializer(Init);
- if (emitter) emitter->finalize(GV);
+
+ if (emitter)
+ emitter->finalize(GV);
// If it is safe to mark the global 'constant', do so now.
GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor &&
diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h
index ff8cea486cc2..fc4486659426 100644
--- a/clang/lib/CodeGen/CodeGenModule.h
+++ b/clang/lib/CodeGen/CodeGenModule.h
@@ -1037,7 +1037,7 @@ class CodeGenModule : public CodeGenTypeCache {
void MaybeHandleStaticInExternC(const SomeDecl *D, llvm::GlobalValue *GV);
/// Add a global to a list to be added to the llvm.used metadata.
- void addUsedGlobal(llvm::GlobalValue *GV);
+ void addUsedGlobal(llvm::GlobalValue *GV, bool SkipCheck = false);
/// Add a global to a list to be added to the llvm.compiler.used metadata.
void addCompilerUsedGlobal(llvm::GlobalValue *GV);
diff --git a/clang/test/CodeGenCUDA/hip-pinned-shadow.cu b/clang/test/CodeGenCUDA/hip-pinned-shadow.cu
index 75798f7e1dec..1d22ed6dc94c 100644
--- a/clang/test/CodeGenCUDA/hip-pinned-shadow.cu
+++ b/clang/test/CodeGenCUDA/hip-pinned-shadow.cu
@@ -4,6 +4,8 @@
// RUN: -emit-llvm -o - -x hip %s | FileCheck -check-prefixes=HIPDEV %s
// RUN: %clang_cc1 -triple x86_64 -std=c++11 \
// RUN: -emit-llvm -o - -x hip %s | FileCheck -check-prefixes=HIPHOST %s
+// RUN: %clang_cc1 -triple amdgcn -fcuda-is-device -std=c++11 -fvisibility hidden -fapply-global-visibility-to-externs \
+// RUN: -O3 -emit-llvm -o - -x hip %s | FileCheck -check-prefixes=HIPDEVUNSED %s
struct textureReference {
int a;
@@ -21,3 +23,5 @@ __attribute__((hip_pinned_shadow)) texture<float, 2, 1> tex;
// HIPDEV-NOT: declare{{.*}}void @_ZN7textureIfLi2ELi1EEC1Ev
// HIPHOST: define{{.*}}@_ZN7textureIfLi2ELi1EEC1Ev
// HIPHOST: call i32 @__hipRegisterVar{{.*}}@tex{{.*}}i32 0, i32 4, i32 0, i32 0)
+// HIPDEVUNSED: @tex = external addrspace(1) global %struct.texture
+// HIPDEVUNSED-NOT: declare{{.*}}void @_ZN7textureIfLi2ELi1EEC1Ev
More information about the cfe-commits
mailing list