[clang] 02d04d5 - [OPENMP50]Do not mark the function as used if referenced only in declare
Alexey Bataev via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 10 13:34:24 PST 2019
Author: Alexey Bataev
Date: 2019-12-10T16:30:14-05:00
New Revision: 02d04d569edd39a17f27995565b7b65ac06afb35
URL: https://github.com/llvm/llvm-project/commit/02d04d569edd39a17f27995565b7b65ac06afb35
DIFF: https://github.com/llvm/llvm-project/commit/02d04d569edd39a17f27995565b7b65ac06afb35.diff
LOG: [OPENMP50]Do not mark the function as used if referenced only in declare
variant directive.
If the function is used only in declare variant directive as a variant
function, it should not be marked as used to prevent emission of the
target-specific functions. Build the reference in the unevaluated
context.
Added:
Modified:
clang/lib/Parse/ParseOpenMP.cpp
clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
clang/test/OpenMP/declare_variant_mixed_codegen.cpp
Removed:
################################################################################
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index 89f7f909b379..442d2ce0e0f5 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -1078,9 +1078,16 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr,
SourceLocation RLoc;
// Parse with IsAddressOfOperand set to true to parse methods as DeclRefExprs
// instead of MemberExprs.
- ExprResult AssociatedFunction =
- ParseOpenMPParensExpr(getOpenMPDirectiveName(OMPD_declare_variant), RLoc,
- /*IsAddressOfOperand=*/true);
+ ExprResult AssociatedFunction;
+ {
+ // Do not mark function as is used to prevent its emission if this is the
+ // only place where it is used.
+ EnterExpressionEvaluationContext Unevaluated(
+ Actions, Sema::ExpressionEvaluationContext::Unevaluated);
+ AssociatedFunction = ParseOpenMPParensExpr(
+ getOpenMPDirectiveName(OMPD_declare_variant), RLoc,
+ /*IsAddressOfOperand=*/true);
+ }
if (!AssociatedFunction.isUsable()) {
if (!Tok.is(tok::annot_pragma_openmp_end))
while (!SkipUntil(tok::annot_pragma_openmp_end, StopBeforeMatch))
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index e9456ebda581..71399ff35908 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -385,8 +385,13 @@ static void instantiateOMPDeclareVariantAttr(
};
ExprResult VariantFuncRef;
- if (Expr *E = Attr.getVariantFuncRef())
+ if (Expr *E = Attr.getVariantFuncRef()) {
+ // Do not mark function as is used to prevent its emission if this is the
+ // only place where it is used.
+ EnterExpressionEvaluationContext Unevaluated(
+ S, Sema::ExpressionEvaluationContext::ConstantEvaluated);
VariantFuncRef = Subst(E);
+ }
// Check function/variant ref.
Optional<std::pair<FunctionDecl *, Expr *>> DeclVarData =
diff --git a/clang/test/OpenMP/declare_variant_mixed_codegen.cpp b/clang/test/OpenMP/declare_variant_mixed_codegen.cpp
index dea42d1c2170..0c13f5f2f120 100644
--- a/clang/test/OpenMP/declare_variant_mixed_codegen.cpp
+++ b/clang/test/OpenMP/declare_variant_mixed_codegen.cpp
@@ -27,6 +27,7 @@
// CHECK-DAG: ret i32 85
// CHECK-DAG: ret i32 86
// CHECK-DAG: ret i32 87
+// CHECK-DAG: ret i32 88
// CHECK-NOT: ret i32 {{1|4|81|84}}
#ifndef HEADER
@@ -45,8 +46,10 @@ int test();
#pragma omp declare variant(test) match(implementation = {vendor(llvm)}, device={kind(cpu)})
int call() { return 1; }
+static int stat_unused_no_emit() { return 1; }
static int stat_unused_();
#pragma omp declare variant(stat_unused_) match(implementation = {vendor(llvm)}, device={kind(cpu)})
+#pragma omp declare variant(stat_unused_no_emit) match(implementation = {vendor(xxx)}, device={kind(gpu)})
static int stat_unused() { return 1; }
static int stat_used_();
@@ -134,4 +137,12 @@ int fn_variant2() { return 1; }
#pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm)}, device={kind(fpga)})
int fn2() { return 87; }
+#pragma omp declare variant(stat_unused_no_emit) match(implementation = {vendor(xxx)}, device={kind(gpu)})
+template <typename T>
+static T stat_unused_T() { return 88; }
+
+int bazzzzzzzz() {
+ return stat_unused_T<int>();
+}
+
#endif // HEADER
More information about the cfe-commits
mailing list