diff --git a/flang/include/flang/Lower/OpenACC.h b/flang/include/flang/Lower/OpenACC.h new file mode 100644 --- /dev/null +++ b/flang/include/flang/Lower/OpenACC.h @@ -0,0 +1,31 @@ +//===-- Lower/OpenACC.h -- lower OpenACC directives -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_LOWER_OPENACC_H +#define FORTRAN_LOWER_OPENACC_H + +namespace Fortran { +namespace parser { +struct OpenACCConstruct; +} // namespace parser + +namespace lower { + +class AbstractConverter; + +namespace pft { +struct Evaluation; +} // namespace pft + +void genOpenACCConstruct(AbstractConverter &, pft::Evaluation &, + const parser::OpenACCConstruct &); + +} // namespace lower +} // namespace Fortran + +#endif // FORTRAN_LOWER_OPENACC_H diff --git a/flang/include/flang/Lower/PFTBuilder.h b/flang/include/flang/Lower/PFTBuilder.h --- a/flang/include/flang/Lower/PFTBuilder.h +++ b/flang/include/flang/Lower/PFTBuilder.h @@ -131,8 +131,8 @@ parser::ForallConstruct>; using Directives = - std::tuple; + std::tuple; template static constexpr bool isActionStmt{common::HasMember}; diff --git a/flang/lib/Lower/CMakeLists.txt b/flang/lib/Lower/CMakeLists.txt --- a/flang/lib/Lower/CMakeLists.txt +++ b/flang/lib/Lower/CMakeLists.txt @@ -13,6 +13,7 @@ IntrinsicCall.cpp IO.cpp Mangler.cpp + OpenACC.cpp OpenMP.cpp PFTBuilder.cpp diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp new file mode 100644 --- /dev/null +++ b/flang/lib/Lower/OpenACC.cpp @@ -0,0 +1,48 @@ +//===-- OpenMP.cpp -- OpenACC directive lowering --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Lower/OpenACC.h" +#include "flang/Lower/Bridge.h" +#include "flang/Lower/FIRBuilder.h" +#include "flang/Lower/PFTBuilder.h" +#include "flang/Parser/parse-tree.h" +#include "llvm/Frontend/OpenACC/ACC.h.inc" + +#define TODO() llvm_unreachable("not yet implemented") + +void Fortran::lower::genOpenACCConstruct( + Fortran::lower::AbstractConverter &absConv, + Fortran::lower::pft::Evaluation &eval, + const Fortran::parser::OpenACCConstruct &accConstruct) { + + std::visit( + common::visitors{ + [&](const Fortran::parser::OpenACCBlockConstruct &blockConstruct) { + TODO(); + }, + [&](const Fortran::parser::OpenACCCombinedConstruct + &combinedConstruct) { TODO(); }, + [&](const Fortran::parser::OpenACCLoopConstruct &loopConstruct) { + TODO(); + }, + [&](const Fortran::parser::OpenACCStandaloneConstruct + &standaloneConstruct) { TODO(); }, + [&](const Fortran::parser::OpenACCRoutineConstruct + &routineConstruct) { TODO(); }, + [&](const Fortran::parser::OpenACCCacheConstruct &cacheConstruct) { + TODO(); + }, + [&](const Fortran::parser::OpenACCWaitConstruct &waitConstruct) { + TODO(); + }, + [&](const Fortran::parser::OpenACCAtomicConstruct &atomicConstruct) { + TODO(); + }, + }, + accConstruct.u); +} diff --git a/flang/test/Lower/pre-fir-tree05.f90 b/flang/test/Lower/pre-fir-tree05.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Lower/pre-fir-tree05.f90 @@ -0,0 +1,33 @@ +! RUN: %f18 -fdebug-pre-fir-tree -fparse-only -fopenacc %s | FileCheck %s + +! Test structure of the Pre-FIR tree with OpenACC construct + +! CHECK: Subroutine foo +subroutine foo() + ! CHECK-NEXT: <> + ! CHECK-NEXT: <> + !$acc parallel + !$acc loop + ! CHECK-NEXT: <> + ! CHECK-NEXT: NonLabelDoStmt + do i=1,5 + ! CHECK-NEXT: PrintStmt + print *, "hey" + ! CHECK-NEXT: <> + ! CHECK-NEXT: NonLabelDoStmt + do j=1,5 + ! CHECK-NEXT: PrintStmt + print *, "hello", i, j + ! CHECK-NEXT: EndDoStmt + ! CHECK-NEXT: <> + end do + ! CHECK-NEXT: EndDoStmt + ! CHECK-NEXT: <> + end do + !$acc end parallel + ! CHECK-NEXT: <> + ! CHECK-NEXT: <> + ! CHECK-NEXT: ContinueStmt +end subroutine +! CHECK-NEXT: EndSubroutine foo +