63 acc Dialect
63.1 Beginner Summary
acc is the MLIR dialect for OpenACC.
OpenACC is a directive-based programming model. A C, C++, or Fortran frontend can use it to say “this region can run in parallel”, “this data should be available on the device”, or “this loop has gang, worker, or vector parallelism” without immediately choosing a final GPU or CPU implementation.
The acc dialect preserves those OpenACC meanings in MLIR. It is not just a runtime-call dialect. It models high-level OpenACC constructs, decomposed data clauses, loop parallelism, atomic operations, routines, privatization recipes, and lower-level code-generation forms used on the path toward GPU and LLVM IR.
You usually see acc after a frontend has parsed OpenACC directives and before the compiler has fully lowered offload regions to GPU, SCF, LLVM, and runtime calls.
63.2 Why This Dialect Exists
OpenACC carries source-level intent that would be lost if a frontend lowered directly to runtime calls.
For example, these source concepts need to remain visible to the compiler:
- compute constructs such as
parallel,kernels, andserial; - loop parallelism clauses such as
gang,worker,vector,seq,independent,auto,collapse, andtile; - structured and unstructured data lifetimes;
- entry and exit behavior for data clauses such as
copy,copyin,copyout,create,present,deviceptr,attach, anddelete; - implicit data mapping rules;
- privatization, firstprivate, and reduction semantics;
routinedirectives for functions called from accelerator code;- host fallback behavior when an
ifclause disables device execution.
The dialect makes those semantics inspectable and transformable. That lets MLIR run analysis, verification, canonicalization, region rewriting, GPU preparation, and LLVM IR translation without throwing away OpenACC structure too early.
63.3 When It Matters
acc matters when compiling OpenACC-enabled source code.
You are likely to see it when:
- a frontend lowers OpenACC pragmas or directives to MLIR;
- data clauses are decomposed into explicit entry and exit operations;
- implicit data attributes need to be generated;
- OpenACC compute regions are prepared for device execution;
- OpenACC loops are converted to
scf.fororscf.parallel; - routines are specialized for accelerator execution;
- host fallback code is created for OpenACC
ifclauses; - OpenACC data operations are translated to LLVM IR runtime mapper calls.
It is less relevant for programs that do not use OpenACC. It is also not the final GPU dialect. In a full offload pipeline, acc cooperates with scf, gpu, memref, llvm, and target-specific dialects.
63.4 When To Use It
Use acc when the source program has OpenACC semantics that should survive into MLIR.
This includes:
- frontend lowering from C, C++, or Fortran OpenACC;
- compiler passes that reason about OpenACC data mapping or offload regions;
- transformations that prepare OpenACC loops for GPU-like parallel execution;
- lowering flows that must preserve source-level directive information for diagnostics or later decisions.
Do not use acc as a generic parallel programming dialect. If your input is already target-independent loop IR, use scf, affine, linalg, or gpu as appropriate. Use acc when the OpenACC programming model itself is part of the meaning.
63.5 Core Concepts
63.5.1 High-Level Constructs
The dialect has operations that directly correspond to OpenACC constructs:
acc.parallel
acc.kernels
acc.serial
acc.loop
acc.data
acc.enter_data
acc.exit_data
acc.host_data
acc.update
acc.init
acc.shutdown
acc.set
acc.wait
acc.routine
These are useful early because they look like the original program. A beginner should read them as “OpenACC syntax, represented in MLIR form.”
63.5.2 Decomposed Data Clauses
OpenACC clauses often describe two phases: what happens when a region begins and what happens when it ends. The acc dialect decomposes those phases into separate operations.
For example, an OpenACC copy(x) clause is not a single acc.copy op. Instead it is represented as:
acc.copyinat region entry;acc.copyoutat region exit;- a
dataClauseattribute that remembers the original user spelling wasacc_copy.
This makes dataflow explicit. The result of an entry operation is an accelerator view of the value, and that result is threaded into compute or data constructs.
63.5.3 Bounds
OpenACC data clauses can map array slices. acc.bounds records normalized zero-based bounds information so the dialect does not need to understand every source language’s array model.
The type for a bounds value is:
!acc.data_bounds_ty
Accessor operations expose parts of a bounds value:
acc.get_lowerbound
acc.get_upperbound
acc.get_extent
acc.get_stride
63.5.4 Structured And Unstructured Data
Structured data operations are tied to a lexical region, such as acc.data or data clauses on acc.parallel. Unstructured data operations are standalone directives such as acc.enter_data and acc.exit_data.
Many data operations carry a structured flag because OpenACC distinguishes structured and dynamic reference counters. That distinction affects runtime mapping behavior.
63.5.5 Device Types
Several clauses can be specialized for particular OpenACC device types. The main device-type values are:
nonestardefaulthostmulticorenvidiaradeon
Device-type-aware operands appear on operations such as acc.parallel, acc.kernels, acc.serial, acc.loop, and data operations with async or wait behavior.
63.5.6 Parallel Levels
OpenACC uses a hierarchy of parallelism:
- gang;
- worker;
- vector;
- sequential.
The dialect represents high-level clauses on acc.loop and later codegen parallel dimensions with attributes such as:
#acc.par_dim<thread_x>
#acc.par_dims[block_x, thread_x]
The codegen mapping uses these to attach GPU-style execution dimensions to SCF loops and compute regions.
63.5.7 Recipes
Privatization, firstprivate, and reduction can require source-language-specific initialization, copying, combining, or destruction. The acc dialect stores those rules in recipe operations:
acc.private.recipe
acc.firstprivate.recipe
acc.reduction.recipe
Recipe materialization later clones those regions into the construct that uses them. This keeps the high-level OpenACC operation clean while still allowing complex C++, Fortran, or frontend-specific behavior.
63.5.8 Compute Lowering
High-level compute constructs can be lowered to:
acc.kernel_environment
acc.compute_region
acc.par_width
acc.kernel_environment captures the data environment. acc.compute_region contains the code intended for device execution. acc.par_width describes a known or unknown launch width for a parallel dimension.
This is an intermediate OpenACC code-generation form. It is closer to GPU execution than acc.parallel, but it is still in the acc dialect.
63.6 Operations
The acc dialect defines 64 generated operations.
63.6.1 Compute And Control Constructs
| Operation | Purpose |
|---|---|
acc.parallel |
Structured OpenACC parallel construct. Runs one region with programmer-directed parallelism. |
acc.kernels |
Structured OpenACC kernels construct. Lets the compiler identify and generate kernels from a region. |
acc.serial |
Structured OpenACC serial construct. Represents accelerator execution with serial semantics. |
acc.loop |
OpenACC loop construct. Carries loop bounds and clauses such as gang, worker, vector, seq, auto, independent, collapse, tile, cache, private, firstprivate, and reduction. |
acc.data |
Structured data region. Threads decomposed data-clause operands into a region. |
acc.host_data |
Host-data region, commonly used for use_device behavior. |
acc.enter_data |
Standalone unstructured data-entry directive. |
acc.exit_data |
Standalone unstructured data-exit directive. |
acc.update |
Standalone update directive. Uses decomposed update_device or update_host data operands. |
acc.init |
Runtime initialization directive. |
acc.shutdown |
Runtime shutdown directive. |
acc.set |
Runtime set directive, for example default device configuration. |
acc.wait |
Wait directive for asynchronous activity queues. |
acc.routine |
Represents an OpenACC routine directive for functions callable from accelerator code. |
acc.declare |
Implicit declare region. |
acc.declare_enter |
Entry side of an implicit declare data region. |
acc.declare_exit |
Exit side of an implicit declare data region. |
acc.global_ctor |
Holds global construction operations associated with OpenACC declare behavior. |
acc.global_dtor |
Holds global destruction operations associated with OpenACC declare behavior. |
63.6.2 Data Entry Operations
These operations usually produce an accelerator-side value. That result is then used by an acc.data, acc.parallel, acc.kernels, acc.serial, acc.enter_data, acc.update, or related operation.
| Operation | Purpose |
|---|---|
acc.copyin |
Entry side of copyin and the entry side of copy. Copies host data to the device if needed. |
acc.create |
Entry side of create and copyout. Creates device storage without necessarily copying host contents. |
acc.present |
Requires that data is already present on the device. |
acc.nocreate |
Uses data if present without creating a new mapping. |
acc.deviceptr |
Says the variable is already a device pointer. |
acc.getdeviceptr |
Gets the device address for a variable, often when an exit operation has no visible matching entry operation. |
acc.attach |
Attaches a pointer field by updating the device copy with the device address of its pointee. |
acc.use_device |
Models host_data use_device. |
acc.update_device |
Entry-style operation for updating device data from host data. |
acc.declare_device_resident |
Data action for declare device_resident. |
acc.declare_link |
Data action for declare link. |
acc.cache |
Cache directive associated with a loop. |
acc.private |
Data operation for private variables. Usually references a private recipe. |
acc.firstprivate |
Data operation for firstprivate variables. Usually references a firstprivate recipe. |
acc.firstprivate_map |
Helper produced during recipe materialization so the firstprivate initial value is available on the device. |
acc.reduction |
Data operation for reduction variables. Usually references a reduction recipe. |
63.6.3 Data Exit Operations
These operations consume an accelerator-side value and describe the exit action.
| Operation | Purpose |
|---|---|
acc.copyout |
Exit side of copyout, copy, and related clauses. Copies data back to the host. |
acc.delete |
Exit side of create or delete-like behavior. Removes a device mapping. |
acc.detach |
Reverse of attach. |
acc.update_host |
Exit-style operation for updating host data from device data. Also represents update self. |
63.6.4 Bounds Operations
| Operation | Purpose |
|---|---|
acc.bounds |
Records normalized lower bound, upper bound, extent, stride, and start index for a data clause. |
acc.get_lowerbound |
Extracts a lower bound from !acc.data_bounds_ty. Missing lower bound means zero. |
acc.get_upperbound |
Extracts or computes an upper bound from bounds information. |
acc.get_extent |
Extracts or computes an extent from bounds information. |
acc.get_stride |
Extracts a stride. Missing stride means one. |
63.6.5 Atomic Operations
| Operation | Purpose |
|---|---|
acc.atomic.read |
OpenACC atomic read. |
acc.atomic.write |
OpenACC atomic write. |
acc.atomic.update |
OpenACC atomic update with a region that computes the new value. |
acc.atomic.capture |
OpenACC atomic capture, combining update and read/capture behavior. |
63.6.6 Recipe Operations
| Operation | Purpose |
|---|---|
acc.private.recipe |
Symbol operation defining how to initialize and optionally destroy a private value. |
acc.firstprivate.recipe |
Symbol operation defining how to initialize, copy, and optionally destroy a firstprivate value. |
acc.reduction.recipe |
Symbol operation defining reduction initialization, combination, and optional destruction. |
acc.yield |
Yields values from OpenACC regions and terminates many acc regions. |
acc.terminator |
Terminates OpenACC regions that do not yield values. |
63.6.7 Code-Generation Helper Operations
These are lower-level than the frontend-like constructs.
| Operation | Purpose |
|---|---|
acc.kernel_environment |
Captures the data environment around a lowered compute region. |
acc.compute_region |
Isolated region prepared for device execution. Carries launch arguments and captured inputs. |
acc.par_width |
Represents the launch width for a GPU parallel dimension such as thread_x or block_x. |
acc.predicate_region |
Groups operations at intermediate loop-nest points where predication or synchronization may be needed. |
acc.privatize |
Creates a private handle for codegen. |
acc.private_local |
Materializes local storage for an !acc.private_type handle in the current parallel context. |
acc.unwrap_private |
Gets the underlying value from a private handle. |
acc.reduction_init |
Codegen operation for initializing a reduction value. |
acc.reduction_combine_region |
Codegen operation holding the inlined combiner region. |
acc.reduction_combine |
Combines a private reduction value into a shared reduction value. |
acc.reduction_accumulate |
Accumulates a partial value into a private reduction value. |
63.7 Attributes And Types
63.7.1 Types
| Type | Meaning |
|---|---|
!acc.data_bounds_ty |
Opaque bounds value produced by acc.bounds. |
!acc.declare_token |
Token returned by acc.declare_enter and consumed by acc.declare_exit. |
!acc.private_type<T> |
Codegen handle for privatized storage whose underlying type is T. |
acc.compute_region can also use !gpu.async.token as an optional stream operand. That type comes from the gpu dialect, not from acc.
63.7.2 Important Attributes And Enums
| Attribute or enum | Important values |
|---|---|
DeviceType |
none, star, default, host, multicore, nvidia, radeon. |
DataClause |
acc_copyin, acc_copyin_readonly, acc_copy, acc_copyout, acc_copyout_zero, acc_present, acc_create, acc_create_zero, acc_delete, acc_attach, acc_detach, acc_no_create, acc_private, acc_firstprivate, acc_deviceptr, acc_getdeviceptr, acc_update_host, acc_update_self, acc_update_device, acc_use_device, acc_reduction, acc_declare_device_resident, acc_declare_link, acc_cache, acc_cache_readonly. |
DataClauseModifier |
none, zero, readonly, alwaysin, alwaysout, always, capture. |
ReductionOperator |
none, add, mul, max, min, iand, ior, xor, eqv, neqv, land, lor, maximum, minimum, maxnum, minnum. |
VariableTypeCategory |
uncategorized, scalar, array, composite, nonscalar, aggregate. |
LoopParMode |
seq, auto, independent. |
ParLevel |
seq, gang_dim1, gang_dim2, gang_dim3, worker, vector. |
GangArgType |
Num, Dim, Static. |
CombinedConstructsType |
kernels_loop, parallel_loop, serial_loop. |
Construct |
IDs for OpenACC constructs such as parallel, kernels, loop, data, enter data, exit data, host data, atomic, declare, init, shutdown, set, update, routine, wait, runtime API, and serial. |
#acc.par_dim<...> |
One GPU parallel dimension used during codegen. |
#acc.par_dims[...] |
Ordered list of GPU parallel dimensions. |
#acc.var_name<...> |
Carries a source variable name for diagnostics and analysis. |
#acc.declare<...> and #acc.declare_action<...> |
Carry declare metadata on globals and declare actions. |
63.8 Transformations
63.8.1 Data And Semantic Completion
| Pass | Purpose |
|---|---|
acc-implicit-data |
Generates implicit data operations for variables used in OpenACC compute constructs. |
acc-implicit-declare |
Adds implicit acc.declare metadata for globals referenced in compute or routine regions. |
acc-implicit-routine |
Creates implicit acc.routine operations for functions called from accelerator regions. |
openacc-legalize-data-values |
Rewrites uses in compute regions to use the accelerator values produced by data-clause operations. |
offload-target-verifier |
Verifies that values and symbols used in offload regions are legal for the chosen execution model. |
The implicit-data pass is especially important for beginners. OpenACC lets many variables get data attributes implicitly. In MLIR, those implicit choices become explicit acc.copyin, acc.firstprivate, acc.present, or related operations.
63.8.2 Region And Loop Rewriting
| Pass | Purpose |
|---|---|
acc-legalize-serial |
Rewrites acc.serial as acc.parallel with one gang, one worker, and vector length one. |
acc-loop-tiling |
Applies OpenACC tile clauses by creating tiled loop nests. |
acc-if-clause-lowering |
Splits compute constructs with if clauses into device and host paths using scf.if. |
offload-livein-value-canonicalization |
Sinks or rematerializes live-in values for regions that will be outlined. |
acc-emit-remarks-loop |
Emits optimization remarks explaining loop parallelism mapping. |
63.8.3 Recipe And Privatization Lowering
| Pass | Purpose |
|---|---|
acc-recipe-materialization |
Clones private, firstprivate, and reduction recipe regions into the construct that uses them. |
This pass turns symbolic recipe references into actual IR. It may introduce operations such as acc.firstprivate_map, acc.reduction_init, and acc.reduction_combine_region.
63.8.4 Compute And Device Specialization
| Pass | Purpose |
|---|---|
acc-compute-lowering |
Replaces acc.parallel, acc.kernels, and acc.serial with acc.kernel_environment plus acc.compute_region; lowers acc.loop to SCF loops with parallel-dimension attributes. |
acc-specialize-for-device |
Strips or inlines host-side OpenACC constructs when compiling code that is already specialized for device execution. |
acc-specialize-for-host |
Converts OpenACC operations to host-compatible forms, including atomic and loop lowering. |
acc-routine-lowering |
Creates specialized device versions of functions marked by acc.routine. |
acc-routine-to-gpu-func |
Moves routine functions into a GPU module as gpu.func operations. |
acc-bind-routine |
Rewrites calls in offload regions to use bind(name) targets from acc.routine. |
acc-declare-gpu-module-insertion |
Copies globals marked with acc.declare into the GPU module. |
acc-compute-lowering is the main structural lowering pass for compute constructs. It is where high-level OpenACC compute regions become the intermediate acc.compute_region representation.
63.9 Conversions / Lowering Paths
63.9.1 convert-openacc-to-scf
convert-openacc-to-scf is a conversion pass for conditional standalone data operations.
It handles:
acc.enter_datawith anifcondition;acc.exit_datawith anifcondition;acc.updatewith anifcondition.
If the condition is dynamic, the operation is moved into an scf.if then region and the if operand is removed from the cloned OpenACC operation. If the condition is a constant true, the condition is removed. If it is a constant false, the operation is erased.
63.9.2 OpenACC Compute Lowering
acc-compute-lowering is not named as a conversion pass, but conceptually it is the key OpenACC compute lowering step.
It rewrites:
acc.parallel,acc.kernels, andacc.serialtoacc.kernel_environmentcontainingacc.compute_region;- launch-related clauses to
acc.par_width; acc.looptoscf.parallel,scf.for, orscf.execute_regiondepending on its context and parallelism mode;- loop parallelism to
#acc.par_dims[...]attributes.
This is where the IR stops looking like source-level OpenACC and starts looking like a compiler-managed offload region.
63.9.3 Host And Device Specialization
OpenACC if clauses and separate host/device compilation require specialization.
Important paths:
acc-if-clause-loweringbuilds explicit device and host paths for compute constructs withif.acc-specialize-for-hostlowers OpenACC constructs to host-compatible IR for fallback execution.acc-specialize-for-deviceremoves host-only OpenACC structure from device code.
These passes are why the dialect has both high-level operations and helper operations. The compiler needs a place to stand while it splits one source construct into different execution paths.
63.9.4 Routine And GPU Lowering
OpenACC routines are handled by a sequence of transforms:
acc-implicit-routinecreates routine declarations when calls from offload regions require them.acc-routine-loweringcreates specialized device function bodies wrapped inacc.compute_region.acc-bind-routineappliesbind(name)call targets.acc-routine-to-gpu-funcmoves device routine functions into a GPU module asgpu.func.
63.9.5 LLVM IR Translation
The OpenACC LLVM IR translation interface lowers a focused subset of acc:
acc.data;acc.enter_data;acc.exit_data;acc.update;acc.yieldandacc.terminator;- helper data operations such as
acc.create,acc.copyin,acc.copyout,acc.delete,acc.update_device, andacc.getdeviceptras no-op carriers consumed by their parent data operation.
The translation emits OpenACC runtime mapper calls through LLVM’s OpenMP IR builder support. Other OpenACC operations must be lowered, specialized, or removed before final LLVM IR translation. If an unsupported acc operation reaches this translation path, the interface reports an error.
63.9.6 Common Pipeline Shape
A simplified OpenACC lowering path looks like this:
frontend OpenACC constructs
-> acc dialect high-level constructs and data-clause operations
-> implicit data / implicit declare / implicit routine
-> recipe materialization
-> if-clause lowering and host/device specialization as needed
-> acc-compute-lowering
-> loop/offload canonicalization and verification
-> routine-to-gpu and GPU lowering where applicable
-> convert-openacc-to-scf for standalone data/update if clauses
-> LLVM dialect and OpenACC LLVM IR translation for data/runtime operations
Real pipelines vary. The main principle is stable: preserve OpenACC meaning early, make implicit clauses explicit, lower compute regions structurally, then specialize for host/device and translate runtime data operations late.
63.10 Example IR
63.10.1 A Simple Parallel Region With A Loop
module {
func.func @parallel_loop(%n : index) {
%c0 = arith.constant 0 : index
%c1 = arith.constant 1 : index
acc.parallel {
acc.loop gang vector control(%i : index) =
(%c0 : index) to (%n : index) step (%c1 : index) {
acc.yield
} attributes {independent = [#acc.device_type<none>]}
acc.yield
}
return
}
}
This preserves the source idea: a parallel region contains a loop with gang and vector parallelism. Later passes decide how that maps to SCF and GPU dimensions.
63.10.2 A Structured Data Region
module {
func.func @data_region(%a : memref<f32>) {
%copy = acc.copyin varPtr(%a : memref<f32>) -> memref<f32>
acc.data dataOperands(%copy : memref<f32>) {
acc.terminator
}
acc.delete accPtr(%copy : memref<f32>)
return
}
}
acc.copyin creates the accelerator-side value. acc.data uses that value in its data operand list. acc.delete models the exit action.
63.10.3 A Lowered Compute Region
module {
func.func @compute_region(%data : memref<1024xf32>, %width : index) {
%w = acc.par_width %width {par_dim = #acc.par_dim<thread_x>}
acc.compute_region launch(%tid = %w)
ins(%arg0 = %data) : (memref<1024xf32>) {
acc.yield
} {origin = "acc.parallel"}
return
}
}
This is no longer a source-like acc.parallel. It is an isolated offload region with an explicit launch-width operand and explicit captured inputs.
63.10.4 Standalone Data With An if Clause
module {
func.func @enter_data_if(%a : memref<f32>, %cond : i1) {
%create = acc.create varPtr(%a : memref<f32>) -> memref<f32>
acc.enter_data if(%cond) dataOperands(%create : memref<f32>)
return
}
}
convert-openacc-to-scf can lower this to an scf.if containing an unconditional acc.enter_data.
63.11 Mental Model
Think of acc as a staged representation of OpenACC.
At the beginning, it looks like the source program:
parallel, kernels, serial, loop, data, update, routine
In the middle, it makes hidden OpenACC semantics explicit:
copyin, create, present, copyout, delete, bounds, recipes, implicit clauses
Later, it becomes an offload-oriented form:
kernel_environment, compute_region, par_width, par_dims, reduction helpers
At the end, the remaining OpenACC data/runtime operations are translated to LLVM IR runtime calls, while compute code is handled through SCF, GPU, and target-specific lowering.
63.12 Gotchas
accis semantic IR, not just syntax. A simple source clause may become multiple operations.- Data clauses are decomposed. There is no single
acc.copyoperation. - The result of data-entry operations is important. It represents the value to use for accelerator-side access.
acc.boundsvalues are normalized and source-language agnostic. Frontends must provide the needed bounds information when the type system cannot.device_typeoperands and attributes must stay consistent. Many operations have helper APIs because manually editing the operand lists is error-prone.- Recipes are symbolic until materialized. Seeing
acc.private.recipedoes not mean privatization has already been inlined into the compute region. acc.compute_regionis isolated from above. Values used inside must be passed as launch or input arguments, or rematerialized inside.- Direct OpenACC LLVM IR translation supports only a subset of operations. High-level compute constructs must be lowered or removed first.
- Host fallback and device specialization can produce very different IR from the same source directive.
63.13 Source Map
Primary source files:
mlir/include/mlir/Dialect/OpenACC/OpenACCBase.tdmlir/include/mlir/Dialect/OpenACC/OpenACCOps.tdmlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.tdmlir/include/mlir/Dialect/OpenACC/OpenACCOpsTypes.tdmlir/include/mlir/Dialect/OpenACC/OpenACCAttributes.tdmlir/include/mlir/Dialect/OpenACC/OpenACCCGAttributes.tdmlir/include/mlir/Dialect/OpenACC/OpenACCOpsInterfaces.tdmlir/include/mlir/Dialect/OpenACC/OpenACCTypeInterfaces.tdmlir/lib/Dialect/OpenACC/IR/OpenACC.cppmlir/lib/Dialect/OpenACC/IR/OpenACCCG.cpp
Transform source files:
mlir/include/mlir/Dialect/OpenACC/Transforms/Passes.tdmlir/lib/Dialect/OpenACC/Transforms/ACCImplicitData.cppmlir/lib/Dialect/OpenACC/Transforms/ACCImplicitDeclare.cppmlir/lib/Dialect/OpenACC/Transforms/ACCImplicitRoutine.cppmlir/lib/Dialect/OpenACC/Transforms/ACCRecipeMaterialization.cppmlir/lib/Dialect/OpenACC/Transforms/ACCComputeLowering.cppmlir/lib/Dialect/OpenACC/Transforms/ACCLegalizeSerial.cppmlir/lib/Dialect/OpenACC/Transforms/ACCLoopTiling.cppmlir/lib/Dialect/OpenACC/Transforms/ACCIfClauseLowering.cppmlir/lib/Dialect/OpenACC/Transforms/ACCSpecializeForDevice.cppmlir/lib/Dialect/OpenACC/Transforms/ACCSpecializeForHost.cppmlir/lib/Dialect/OpenACC/Transforms/ACCRoutineLowering.cppmlir/lib/Dialect/OpenACC/Transforms/ACCRoutineToGPUFunc.cppmlir/lib/Dialect/OpenACC/Transforms/ACCBindRoutine.cppmlir/lib/Dialect/OpenACC/Transforms/ACCDeclareGPUModuleInsertion.cppmlir/lib/Dialect/OpenACC/Transforms/ACCEmitRemarksLoop.cppmlir/lib/Dialect/OpenACC/Transforms/OffloadLiveInValueCanonicalization.cppmlir/lib/Dialect/OpenACC/Transforms/OffloadTargetVerifier.cppmlir/lib/Dialect/OpenACC/Transforms/LegalizeDataValues.cpp
Conversion and translation source files:
mlir/include/mlir/Conversion/OpenACCToSCF/ConvertOpenACCToSCF.hmlir/lib/Conversion/OpenACCToSCF/OpenACCToSCF.cppmlir/include/mlir/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.hmlir/lib/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.cpp
Tests:
mlir/test/Dialect/OpenACCmlir/test/Conversion/OpenACCToSCFmlir/test/lib/Dialect/OpenACCmlir/unittests/Dialect/OpenACC