From fb4acd37fe60a08a0077560d2814053d76ea1c41 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Tue, 18 Aug 2020 14:51:51 -0400 Subject: [PATCH] [OPENMP]Fix PR47158, case 2: do not report host-only functions in unused function in device mode. If the function is not marked exlicitly as declare target and it calls function(s), marked as declare target device_type(host), these host-only functions should not be dignosed as used in device mode, if the caller function is not used in device mode too. Differential Revision: https://reviews.llvm.org/D86164 --- clang/lib/Sema/Sema.cpp | 3 ++- clang/test/OpenMP/declare_target_messages.cpp | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index b9d655b..47484c5 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -1551,7 +1551,8 @@ public: S.shouldIgnoreInHostDeviceCheck(FD) || InUsePath.count(FD)) return; // Finalize analysis of OpenMP-specific constructs. - if (Caller && S.LangOpts.OpenMP && UsePath.size() == 1) + if (Caller && S.LangOpts.OpenMP && UsePath.size() == 1 && + (ShouldEmitRootNode || InOMPDeviceContext)) S.finalizeOpenMPDelayedAnalysis(Caller, FD, Loc); if (Caller) S.DeviceKnownEmittedFns[FD] = {Caller, Loc}; diff --git a/clang/test/OpenMP/declare_target_messages.cpp b/clang/test/OpenMP/declare_target_messages.cpp index 3a78e49..7287a66 100644 --- a/clang/test/OpenMP/declare_target_messages.cpp +++ b/clang/test/OpenMP/declare_target_messages.cpp @@ -167,7 +167,7 @@ void bazzz() {bazz();} #pragma omp declare target to(bazzz) device_type(nohost) // omp45-error {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} void any() {bazz();} // host5-error {{function with 'device_type(nohost)' is not available on host}} void host1() {bazz();} // host5-error {{function with 'device_type(nohost)' is not available on host}} -#pragma omp declare target to(host1) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} dev5-note 4 {{marked as 'device_type(host)' here}} +#pragma omp declare target to(host1) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} dev5-note 3 {{marked as 'device_type(host)' here}} void host2() {bazz();} //host5-error {{function with 'device_type(nohost)' is not available on host}} #pragma omp declare target to(host2) void device() {host1();} // dev5-error {{function with 'device_type(host)' is not available on device}} @@ -183,7 +183,7 @@ void any4() {any2();} #pragma omp end declare target void any5() {any();} -void any6() {host1();} // dev5-error {{function with 'device_type(host)' is not available on device}} +void any6() {host1();} void any7() {device();} // host5-error {{function with 'device_type(nohost)' is not available on host}} void any8() {any2();} -- 2.7.4