[llvm-branch-commits] [clang] [flang] [mlir] [Flang][OpenMP] Improve implicit declare_target propagation (PR #214184)
Sergio Afonso via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Aug 5 08:56:43 PDT 2026
================
@@ -1433,16 +1433,38 @@ static void getDeclareTargetInfo(
} else {
List<Clause> clauses = makeClauses(construct.v.Clauses(), semaCtx);
if (clauses.empty()) {
+ // Case: implicit capture of the enclosing function/subroutine.
Fortran::lower::pft::FunctionLikeUnit *owningProc =
eval.getOwningProcedure();
- // Main programs are never device routines. Skip them so that a bare
- // '!$omp declare target' inside an interface body that lives in a named
- // main program does not incorrectly mark _QQmain as a device function.
- if (owningProc && !owningProc->isMainProgram()) {
- // Case: declare target, implicit capture of enclosing
- // function/subroutine.
+ bool owningProcNotMainProgram =
+ owningProc && !owningProc->isMainProgram();
+
+ const semantics::Symbol *owningSym =
+ owningProcNotMainProgram
+ ? &owningProc->getSubprogramSymbol()
+ : (owningProc ? owningProc->getMainProgramSymbol() : nullptr);
+
+ // A bare '!$omp declare target' may appear in the specification part of
+ // an interface body. In that case the PFT records the directive as an
+ // evaluation of the enclosing program unit rather than of the interface
+ // body's subprogram, so eval.getOwningProcedure() points at the main
+ // program. Detect this by comparing the program unit lexically containing
+ // the directive with the procedure currently being lowered; when they
+ // differ, the directive belongs to the interface-body subprogram, which
+ // is the symbol we must capture.
+ const semantics::Scope &progUnitScope =
+ semantics::GetProgramUnitContaining(
+ semaCtx.FindScope(construct.v.source));
+ const semantics::Symbol *lexicalSym = progUnitScope.symbol();
+
+ if (lexicalSym && lexicalSym != owningSym) {
----------------
skatrak wrote:
Good catch, fixed it and added a test. I haven't tested it, but I suspect we currently have a similar bug in `declare simd`, which is what I based these changes on.
https://github.com/llvm/llvm-project/pull/214184
More information about the llvm-branch-commits
mailing list