[mlir][acc] Add ACCSpecializeForDevice and ACCSpecializeForHost passe⦠(#173527) [mlir][acc] Add ACCSpecializeForDevice and ACCSpecializeForHost passes Add two new transformation passes for specializing OpenACC IR for different execution contexts: ACCSpecializeForDevice: - Strips OpenACC constructs that are invalid in device code - Replaces data entry ops with their var operands - Unwraps regions from compute/data constructs - Erases runtime operations (init, shutdown, wait, etc.) This pass is applicable in two contexts: 1. Functions marked with `acc.specialized_routine` attribute, where the entire function body is device code 2. Non-specialized functions, where patterns are applied only to `acc` operations nested inside compute constructs (parallel, serial, kernels), not to the constructs themselves ACCSpecializeForHost: - Converts orphan `acc` operations for host execution - Transforms `acc.atomic.*` to load/store via `PointerLikeType` interface - Converts `acc.loop` to `scf.for` or `scf.execute_region` - Replaces orphan data entry ops with their var operands This pass operates in two modes: 1. Default (orphan) mode: Only converts `acc` operations that are not inside or attached to compute regions. Used for host `acc routine`s where compute constructs should be preserved. 2. Host fallback mode (enable-host-fallback=true): Converts ALL `acc` operations including compute constructs, data regions, and runtime ops. This is used to allow testing of the full conversion. These patterns will be used to handle conditional host execution of `acc` regions with if clause. The pattern population functions (populateACCSpecializeForDevice, populateACCOrphanToHostPatterns, populateACCHostFallbackPatterns) are exposed so other passes can reuse these patterns. --------- Co-authored-by: Susan Tan <zujunt@nvidia.com> Co-authored-by: Scott Manley <rscottmanley@gmail.com>
Welcome to the LLVM project!
This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.
The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.
C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.
Other components include: the libc++ C++ standard library, the LLD linker, and more.
Consult the Getting Started with LLVM page for information on building and running LLVM.
For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.
Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.
The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.