MLIR 23.0.0git
mlir::acc Namespace Reference

Namespaces

namespace  detail

Classes

class  ACCDeclareEnterOpConversion
 Pattern to erase acc.declare_enter and its associated acc.declare_exit. More...
class  ACCOpEraseConversion
 Pattern to simply erase an ACC op (for ops with no results). More...
class  ACCOpReplaceWithVarConversion
 Pattern to replace an ACC op with its var operand. More...
class  ACCRegionUnwrapConversion
 Pattern to unwrap a region from an ACC op and erase the wrapper. More...
struct  ConstructResource
struct  CurrentDeviceIdResource
class  OpenACCSupport
struct  RuntimeCounters

Enumerations

enum  OpenACCExecMapping { NONE = 0 , VECTOR = 1 , WORKER = 2 , GANG = 4 }
 Enumeration used to encode the execution mapping on a loop construct. More...

Functions

mlir::Value getVar (mlir::Operation *accDataClauseOp)
 Used to obtain the var from a data clause operation.
mlir::TypedValue< mlir::acc::PointerLikeType > getVarPtr (mlir::Operation *accDataClauseOp)
 Used to obtain the var from a data clause operation if it implements PointerLikeType.
mlir::Type getVarType (mlir::Operation *accDataClauseOp)
 Used to obtains the varType from a data clause operation which records the type of variable.
mlir::Value getAccVar (mlir::Operation *accDataClauseOp)
 Used to obtain the accVar from a data clause operation.
mlir::TypedValue< mlir::acc::PointerLikeType > getAccPtr (mlir::Operation *accDataClauseOp)
 Used to obtain the accVar from a data clause operation if it implements PointerLikeType.
mlir::Value getVarPtrPtr (mlir::Operation *accDataClauseOp)
 Used to obtain the varPtrPtr from a data clause operation.
mlir::SmallVector< mlir::ValuegetBounds (mlir::Operation *accDataClauseOp)
 Used to obtain bounds from an acc data clause operation.
mlir::SmallVector< mlir::ValuegetAsyncOperands (mlir::Operation *accDataClauseOp)
 Used to obtain async operands from an acc data clause operation.
mlir::ArrayAttr getAsyncOperandsDeviceType (mlir::Operation *accDataClauseOp)
 Returns an array of acc:DeviceTypeAttr attributes attached to an acc data clause operation, that correspond to the device types associated with the async clauses with an async-value.
mlir::ArrayAttr getAsyncOnly (mlir::Operation *accDataClauseOp)
 Returns an array of acc:DeviceTypeAttr attributes attached to an acc data clause operation, that correspond to the device types associated with the async clauses without an async-value.
std::optional< llvm::StringRef > getVarName (mlir::Operation *accOp)
 Used to obtain the name from an acc operation.
std::optional< mlir::acc::DataClause > getDataClause (mlir::Operation *accDataEntryOp)
 Used to obtain the dataClause from a data entry operation.
bool getImplicitFlag (mlir::Operation *accDataEntryOp)
 Used to find out whether data operation is implicit.
mlir::ValueRange getDataOperands (mlir::Operation *accOp)
 Used to get an immutable range iterating over the data operands.
mlir::MutableOperandRange getMutableDataOperands (mlir::Operation *accOp)
 Used to get a mutable range iterating over the data operands.
mlir::SymbolRefAttr getRecipe (mlir::Operation *accOp)
 Used to get the recipe attribute from a data clause operation.
bool isPointerLikeType (mlir::Type type)
 Used to check whether the provided type implements the PointerLikeType interface.
bool isMappableType (mlir::Type type)
 Used to check whether the provided type implements the MappableType interface.
static constexpr StringLiteral getDeclareAttrName ()
 Used to obtain the attribute name for declare.
static constexpr StringLiteral getDeclareActionAttrName ()
static constexpr StringLiteral getRoutineInfoAttrName ()
static constexpr StringLiteral getSpecializedRoutineAttrName ()
bool isAccRoutine (mlir::Operation *op)
 Used to check whether the current operation is marked with acc routine.
bool isSpecializedAccRoutine (mlir::Operation *op)
 Used to check whether this is a specialized accelerator version of acc routine function.
static constexpr StringLiteral getFromDefaultClauseAttrName ()
static constexpr StringLiteral getVarNameAttrName ()
static constexpr StringLiteral getCombinedConstructsAttrName ()
mlir::OperationgetEnclosingComputeOp (mlir::Region &region)
 Used to obtain the enclosing compute construct operation that contains the provided region.
bool isOnlyUsedByPrivateClauses (mlir::Value val, mlir::Region &region)
 Returns true if this value is only used by acc.private operations in the region.
bool isOnlyUsedByReductionClauses (mlir::Value val, mlir::Region &region)
 Returns true if this value is only used by acc.reduction operations in the region.
std::optional< ClauseDefaultValue > getDefaultAttr (mlir::Operation *op)
 Looks for an OpenACC default attribute on the current operation op or in a parent operation which encloses op.
mlir::acc::VariableTypeCategory getTypeCategory (mlir::Value var)
 Get the type category of an OpenACC variable.
std::string getVariableName (mlir::Value v)
 Attempts to extract the variable name from a value by walking through view-like operations until an acc.var_name attribute is found.
std::string getRecipeName (mlir::acc::RecipeKind kind, mlir::Type type)
 Get the recipe name for a given recipe kind and type.
mlir::Value getBaseEntity (mlir::Value val)
bool isValidSymbolUse (mlir::Operation *user, mlir::SymbolRefAttr symbol, mlir::Operation **definingOpPtr=nullptr)
 Check if a symbol use is valid for use in an OpenACC region.
bool isDeviceValue (mlir::Value val)
 Check if a value represents device data.
bool isValidValueUse (mlir::Value val, mlir::Region &region)
 Check if a value use is valid in an OpenACC region.
llvm::SmallVector< mlir::ValuegetDominatingDataClauses (mlir::Operation *computeConstructOp, mlir::DominanceInfo &domInfo, mlir::PostDominanceInfo &postDomInfo)
 Collects all data clauses that dominate the compute construct.
remark::detail::InFlightRemark emitRemark (mlir::Operation *op, const llvm::Twine &message, llvm::StringRef category="openacc")
 Emit an OpenACC remark for the given operation with the given message.
scf::ForOp convertACCLoopToSCFFor (LoopOp loopOp, RewriterBase &rewriter, bool enableCollapse)
 Convert a structured acc.loop to scf.for.
scf::ParallelOp convertACCLoopToSCFParallel (LoopOp loopOp, RewriterBase &rewriter)
 Convert acc.loop to scf.parallel.
scf::ExecuteRegionOp convertUnstructuredACCLoopToSCFExecuteRegion (LoopOp loopOp, RewriterBase &rewriter)
 Convert an unstructured acc.loop to scf.execute_region.
llvm::SmallVector< mlir::acc::LoopOp > uncollapseLoops (mlir::acc::LoopOp origLoop, unsigned tileCount, unsigned collapseCount, mlir::RewriterBase &rewriter)
 Uncollapse tile loops with multiple IVs and collapseCount < tileCount.
mlir::acc::LoopOp tileACCLoops (llvm::SmallVector< mlir::acc::LoopOp > &tileLoops, const llvm::SmallVector< mlir::Value > &tileSizes, int32_t defaultTileSize, mlir::RewriterBase &rewriter)
 Tile ACC loops according to the given tile sizes.
void populateACCSpecializeForDevicePatterns (RewritePatternSet &patterns)
 Populates all patterns for device specialization.
void populateACCOrphanToHostPatterns (RewritePatternSet &patterns, OpenACCSupport &accSupport, bool enableLoopConversion=true)
 Populates patterns for converting orphan ACC operations to host.
void populateACCHostFallbackPatterns (RewritePatternSet &patterns, OpenACCSupport &accSupport, bool enableLoopConversion=true)
 Populates all patterns for host fallback path (when if clause evaluates to false).

Enumeration Type Documentation

◆ OpenACCExecMapping

Enumeration used to encode the execution mapping on a loop construct.

They refer directly to the OpenACC 3.3 standard: 2.9.2. gang 2.9.3. worker 2.9.4. vector

Value can be combined bitwise to reflect the mapping applied to the construct. e.g. acc.loop gang vector, the gang and vector could be combined and the final mapping value would be 5 (4 | 1).

Enumerator
NONE 
VECTOR 
WORKER 
GANG 

Definition at line 86 of file OpenACC.h.

Function Documentation

◆ convertACCLoopToSCFFor()

scf::ForOp mlir::acc::convertACCLoopToSCFFor ( LoopOp loopOp,
RewriterBase & rewriter,
bool enableCollapse )

Convert a structured acc.loop to scf.for.

The loop arguments are converted to index type. If enableCollapse is true, nested loops are collapsed into a single loop.

Parameters
loopOpThe acc.loop operation to convert (must not be unstructured)
rewriterRewriterBase for creating operations
enableCollapseWhether to collapse nested loops into one
Returns
The created scf.for operation or nullptr on creation error. An InFlightDiagnostic is emitted on creation error.

Definition at line 178 of file OpenACCUtilsLoop.cpp.

References mlir::coalesceLoops(), mlir::Builder::getIndexType(), mlir::OpBuilder::getInsertionPoint(), mlir::getValueOrCreateCastToIndexLike(), mlir::IRMapping::map(), mlir::OpBuilder::setInsertionPoint(), and mlir::OpBuilder::setInsertionPointToStart().

◆ convertACCLoopToSCFParallel()

scf::ParallelOp mlir::acc::convertACCLoopToSCFParallel ( LoopOp loopOp,
RewriterBase & rewriter )

Convert acc.loop to scf.parallel.

The loop induction variables are converted to index types.

Parameters
loopOpThe acc.loop operation to convert
rewriterRewriterBase for creating and erasing operations
Returns
The created scf.parallel operation or nullptr on creation error. An InFlightDiagnostic is emitted on creation error.

Definition at line 246 of file OpenACCUtilsLoop.cpp.

References mlir::arith::ConstantIndexOp::create(), mlir::RewriterBase::eraseOp(), mlir::OpBuilder::getInsertionBlock(), mlir::OpBuilder::getInsertionPoint(), mlir::Block::getParentOp(), mlir::OpBuilder::setInsertionPointToStart(), and mlir::Value::use_empty().

◆ convertUnstructuredACCLoopToSCFExecuteRegion()

scf::ExecuteRegionOp mlir::acc::convertUnstructuredACCLoopToSCFExecuteRegion ( LoopOp loopOp,
RewriterBase & rewriter )

Convert an unstructured acc.loop to scf.execute_region.

Parameters
loopOpThe acc.loop operation to convert (must be unstructured)
rewriterRewriterBase for creating and erasing operations
Returns
The created scf.execute_region operation or nullptr on creation error. An InFlightDiagnostic is emitted on creation error.

Definition at line 310 of file OpenACCUtilsLoop.cpp.

References mlir::OpBuilder::getInsertionBlock(), and mlir::Block::getParentOp().

◆ emitRemark()

mlir::remark::detail::InFlightRemark mlir::acc::emitRemark ( mlir::Operation * op,
const llvm::Twine & message,
llvm::StringRef category = "openacc" )

Emit an OpenACC remark for the given operation with the given message.

Parameters
opThe operation to emit the remark for.
messageThe remark message.
categoryOptional category for the remark. Defaults to "openacc".
Returns
An in-flight remark object that can be used to append additional information to the remark.

Definition at line 334 of file OpenACCUtils.cpp.

References mlir::Attribute::getContext(), mlir::Operation::getLoc(), mlir::Operation::getParentOfType(), mlir::MLIRContext::getRemarkEngine(), and mlir::remark::RemarkOpts::name().

Referenced by mlir::acc::detail::OpenACCSupportTraits::Model< ImplT >::emitRemark(), and mlir::acc::OpenACCSupport::emitRemark().

◆ getAccPtr()

mlir::TypedValue< mlir::acc::PointerLikeType > mlir::acc::getAccPtr ( mlir::Operation * accDataClauseOp)

Used to obtain the accVar from a data clause operation if it implements PointerLikeType.

Definition at line 4915 of file OpenACC.cpp.

◆ getAccVar()

mlir::Value mlir::acc::getAccVar ( mlir::Operation * accDataClauseOp)

Used to obtain the accVar from a data clause operation.

When a data entry operation, it obtains its result accVar value. If a data exit operation, it obtains its operand accVar value. Returns empty value if not a data clause operation.

Definition at line 4927 of file OpenACC.cpp.

References ACC_DATA_ENTRY_OPS, and ACC_DATA_EXIT_OPS.

◆ getAsyncOnly()

mlir::ArrayAttr mlir::acc::getAsyncOnly ( mlir::Operation * accDataClauseOp)

Returns an array of acc:DeviceTypeAttr attributes attached to an acc data clause operation, that correspond to the device types associated with the async clauses without an async-value.

Definition at line 4982 of file OpenACC.cpp.

References ACC_DATA_ENTRY_OPS, and ACC_DATA_EXIT_OPS.

◆ getAsyncOperands()

mlir::SmallVector< mlir::Value > mlir::acc::getAsyncOperands ( mlir::Operation * accDataClauseOp)

Used to obtain async operands from an acc data clause operation.

Returns an empty vector if there are no such operands.

Definition at line 4960 of file OpenACC.cpp.

◆ getAsyncOperandsDeviceType()

mlir::ArrayAttr mlir::acc::getAsyncOperandsDeviceType ( mlir::Operation * accDataClauseOp)

Returns an array of acc:DeviceTypeAttr attributes attached to an acc data clause operation, that correspond to the device types associated with the async clauses with an async-value.

Definition at line 4974 of file OpenACC.cpp.

References ACC_DATA_ENTRY_OPS, and ACC_DATA_EXIT_OPS.

◆ getBaseEntity()

mlir::Value mlir::acc::getBaseEntity ( mlir::Value val)

Definition at line 155 of file OpenACCUtils.cpp.

References mlir::Value::getDefiningOp().

◆ getBounds()

mlir::SmallVector< mlir::Value > mlir::acc::getBounds ( mlir::Operation * accDataClauseOp)

Used to obtain bounds from an acc data clause operation.

Returns an empty vector if there are no bounds.

Definition at line 4945 of file OpenACC.cpp.

◆ getCombinedConstructsAttrName()

constexpr StringLiteral mlir::acc::getCombinedConstructsAttrName ( )
staticconstexpr

Definition at line 208 of file OpenACC.h.

◆ getDataClause()

std::optional< mlir::acc::DataClause > mlir::acc::getDataClause ( mlir::Operation * accDataEntryOp)

Used to obtain the dataClause from a data entry operation.

Returns empty optional if not a data entry operation.

Definition at line 5000 of file OpenACC.cpp.

Referenced by checkDeclareOperands().

◆ getDataOperands()

mlir::ValueRange mlir::acc::getDataOperands ( mlir::Operation * accOp)

Used to get an immutable range iterating over the data operands.

Definition at line 5018 of file OpenACC.cpp.

References ACC_COMPUTE_AND_DATA_CONSTRUCT_OPS.

◆ getDeclareActionAttrName()

constexpr StringLiteral mlir::acc::getDeclareActionAttrName ( )
staticconstexpr

Definition at line 176 of file OpenACC.h.

◆ getDeclareAttrName()

constexpr StringLiteral mlir::acc::getDeclareAttrName ( )
staticconstexpr

Used to obtain the attribute name for declare.

Definition at line 172 of file OpenACC.h.

Referenced by isValidSymbolUse().

◆ getDefaultAttr()

std::optional< mlir::acc::ClauseDefaultValue > mlir::acc::getDefaultAttr ( mlir::Operation * op)

Looks for an OpenACC default attribute on the current operation op or in a parent operation which encloses op.

This is useful because OpenACC specification notes that a visible default clause is the nearest default clause appearing on the compute construct or a lexically containing data construct.

Definition at line 56 of file OpenACCUtils.cpp.

References mlir::Operation::getParentOp().

◆ getDominatingDataClauses()

llvm::SmallVector< mlir::Value > mlir::acc::getDominatingDataClauses ( mlir::Operation * computeConstructOp,
mlir::DominanceInfo & domInfo,
mlir::PostDominanceInfo & postDomInfo )

Collects all data clauses that dominate the compute construct.

This includes data clauses from:

  • The compute construct itself
  • Enclosing data constructs
  • Applicable declare directives (those that dominate and post-dominate) This is used to determine if a variable is already covered by an existing data clause.
    Parameters
    computeConstructOpThe compute construct operation
    domInfoDominance information
    postDomInfoPost-dominance information
    Returns
    Vector of data clause values that dominate the compute construct

Definition at line 275 of file OpenACCUtils.cpp.

References mlir::DominanceInfo::dominates(), mlir::Operation::getParentOfType(), and mlir::Operation::getParentOp().

◆ getEnclosingComputeOp()

mlir::Operation * mlir::acc::getEnclosingComputeOp ( mlir::Region & region)

Used to obtain the enclosing compute construct operation that contains the provided region.

Returns nullptr if no compute construct operation is found. The returned operation is one of types defined by ACC_COMPUTE_CONSTRUCT_OPS.

Definition at line 22 of file OpenACCUtils.cpp.

References mlir::Operation::getParentOp(), and mlir::Region::getParentOp().

◆ getFromDefaultClauseAttrName()

constexpr StringLiteral mlir::acc::getFromDefaultClauseAttrName ( )
staticconstexpr

Definition at line 200 of file OpenACC.h.

◆ getImplicitFlag()

bool mlir::acc::getImplicitFlag ( mlir::Operation * accDataEntryOp)

Used to find out whether data operation is implicit.

Returns false if not a data operation or if it is a data operation without implicit flag.

Definition at line 5010 of file OpenACC.cpp.

References ACC_DATA_ENTRY_OPS.

◆ getMutableDataOperands()

mlir::MutableOperandRange mlir::acc::getMutableDataOperands ( mlir::Operation * accOp)

Used to get a mutable range iterating over the data operands.

Definition at line 5028 of file OpenACC.cpp.

References ACC_COMPUTE_AND_DATA_CONSTRUCT_OPS.

◆ getRecipe()

mlir::SymbolRefAttr mlir::acc::getRecipe ( mlir::Operation * accOp)

Used to get the recipe attribute from a data clause operation.

Definition at line 5037 of file OpenACC.cpp.

References ACC_DATA_ENTRY_OPS.

◆ getRecipeName()

std::string mlir::acc::getRecipeName ( mlir::acc::RecipeKind kind,
mlir::Type type )

Get the recipe name for a given recipe kind and type.

Returns an empty string if not possible to generate a recipe name.

Definition at line 117 of file OpenACCUtils.cpp.

References mlir::Type::print().

Referenced by mlir::acc::OpenACCSupport::getRecipeName().

◆ getRoutineInfoAttrName()

constexpr StringLiteral mlir::acc::getRoutineInfoAttrName ( )
staticconstexpr

Definition at line 180 of file OpenACC.h.

Referenced by isAccRoutine(), and isValidSymbolUse().

◆ getSpecializedRoutineAttrName()

constexpr StringLiteral mlir::acc::getSpecializedRoutineAttrName ( )
staticconstexpr

Definition at line 184 of file OpenACC.h.

Referenced by isSpecializedAccRoutine().

◆ getTypeCategory()

mlir::acc::VariableTypeCategory mlir::acc::getTypeCategory ( mlir::Value var)

Get the type category of an OpenACC variable.

Definition at line 77 of file OpenACCUtils.cpp.

References mlir::Value::getType().

◆ getVar()

mlir::Value mlir::acc::getVar ( mlir::Operation * accDataClauseOp)

Used to obtain the var from a data clause operation.

Returns empty value if not a data clause operation or is a data exit operation with no var.

Definition at line 4896 of file OpenACC.cpp.

References ACC_DATA_ENTRY_OPS.

Referenced by checkDeclareOperands().

◆ getVariableName()

std::string mlir::acc::getVariableName ( mlir::Value v)

Attempts to extract the variable name from a value by walking through view-like operations until an acc.var_name attribute is found.

Returns empty string if no name is found.

Definition at line 90 of file OpenACCUtils.cpp.

References mlir::Value::getDefiningOp(), getVarName(), and getVarNameAttrName().

Referenced by mlir::acc::OpenACCSupport::getVariableName().

◆ getVarName()

std::optional< llvm::StringRef > mlir::acc::getVarName ( mlir::Operation * accOp)

Used to obtain the name from an acc operation.

Definition at line 4989 of file OpenACC.cpp.

Referenced by getVariableName().

◆ getVarNameAttrName()

constexpr StringLiteral mlir::acc::getVarNameAttrName ( )
staticconstexpr

Definition at line 204 of file OpenACC.h.

Referenced by getVariableName().

◆ getVarPtr()

mlir::TypedValue< mlir::acc::PointerLikeType > mlir::acc::getVarPtr ( mlir::Operation * accDataClauseOp)

Used to obtain the var from a data clause operation if it implements PointerLikeType.

Definition at line 4882 of file OpenACC.cpp.

◆ getVarPtrPtr()

mlir::Value mlir::acc::getVarPtrPtr ( mlir::Operation * accDataClauseOp)

Used to obtain the varPtrPtr from a data clause operation.

Returns empty value if not a data clause operation.

Definition at line 4935 of file OpenACC.cpp.

References ACC_DATA_ENTRY_OPS.

◆ getVarType()

mlir::Type mlir::acc::getVarType ( mlir::Operation * accDataClauseOp)

Used to obtains the varType from a data clause operation which records the type of variable.

When var is PointerLikeType, this returns the type of the pointer target.

Definition at line 4904 of file OpenACC.cpp.

References ACC_DATA_ENTRY_OPS.

◆ isAccRoutine()

bool mlir::acc::isAccRoutine ( mlir::Operation * op)
inline

Used to check whether the current operation is marked with acc routine.

The operation passed in should be a function.

Definition at line 190 of file OpenACC.h.

References getRoutineInfoAttrName(), and mlir::Operation::hasAttr().

◆ isDeviceValue()

bool mlir::acc::isDeviceValue ( mlir::Value val)

Check if a value represents device data.

This checks if the value represents device data via the MappableType, PointerLikeType, and GlobalVariableOpInterface interfaces.

Parameters
valThe value to check
Returns
true if the value is device data, false otherwise

Definition at line 219 of file OpenACCUtils.cpp.

References mlir::Value::getDefiningOp(), mlir::Value::getType(), isDeviceValue(), and mlir::SymbolTable::lookupNearestSymbolFrom().

Referenced by isDeviceValue(), and isValidValueUse().

◆ isMappableType()

bool mlir::acc::isMappableType ( mlir::Type type)
inline

Used to check whether the provided type implements the MappableType interface.

Definition at line 167 of file OpenACC.h.

Referenced by checkRecipe().

◆ isOnlyUsedByPrivateClauses()

bool mlir::acc::isOnlyUsedByPrivateClauses ( mlir::Value val,
mlir::Region & region )

Returns true if this value is only used by acc.private operations in the region.

Definition at line 45 of file OpenACCUtils.cpp.

References isOnlyUsedByOpClauses().

Referenced by isValidValueUse().

◆ isOnlyUsedByReductionClauses()

bool mlir::acc::isOnlyUsedByReductionClauses ( mlir::Value val,
mlir::Region & region )

Returns true if this value is only used by acc.reduction operations in the region.

Definition at line 50 of file OpenACCUtils.cpp.

References isOnlyUsedByOpClauses().

◆ isPointerLikeType()

bool mlir::acc::isPointerLikeType ( mlir::Type type)
inline

Used to check whether the provided type implements the PointerLikeType interface.

Definition at line 161 of file OpenACC.h.

◆ isSpecializedAccRoutine()

bool mlir::acc::isSpecializedAccRoutine ( mlir::Operation * op)
inline

Used to check whether this is a specialized accelerator version of acc routine function.

Definition at line 196 of file OpenACC.h.

References getSpecializedRoutineAttrName(), and mlir::Operation::hasAttr().

◆ isValidSymbolUse()

bool mlir::acc::isValidSymbolUse ( mlir::Operation * user,
mlir::SymbolRefAttr symbol,
mlir::Operation ** definingOpPtr = nullptr )

Check if a symbol use is valid for use in an OpenACC region.

This includes looking for various attributes such as acc.routine_info and acc.declare attributes.

Parameters
userThe operation using the symbol
symbolThe symbol reference being used
definingOpPtrOptional output parameter to receive the defining op
Returns
true if the symbol use is valid, false otherwise

Definition at line 165 of file OpenACCUtils.cpp.

References getDeclareAttrName(), getRoutineInfoAttrName(), mlir::Operation::hasAttr(), mlir::SymbolTable::lookupNearestSymbolFrom(), and mlir::SymbolTable::Private.

Referenced by mlir::acc::detail::OpenACCSupportTraits::Model< ImplT >::isValidSymbolUse(), and mlir::acc::OpenACCSupport::isValidSymbolUse().

◆ isValidValueUse()

bool mlir::acc::isValidValueUse ( mlir::Value val,
mlir::Region & region )

Check if a value use is valid in an OpenACC region.

This is true if:

  • The value is produced by an ACC data entry operation
  • The value is device data
  • The value is only used by private clauses in the region
    Parameters
    valThe value to check
    regionThe OpenACC region
    Returns
    true if the value use is valid, false otherwise

Definition at line 252 of file OpenACCUtils.cpp.

References mlir::Value::getDefiningOp(), mlir::Value::getType(), isDeviceValue(), mlir::Type::isIntOrIndexOrFloat(), and isOnlyUsedByPrivateClauses().

Referenced by mlir::acc::detail::OpenACCSupportTraits::Model< ImplT >::isValidValueUse(), and mlir::acc::OpenACCSupport::isValidValueUse().

◆ populateACCHostFallbackPatterns()

void mlir::acc::populateACCHostFallbackPatterns ( RewritePatternSet & patterns,
OpenACCSupport & accSupport,
bool enableLoopConversion = true )

Populates all patterns for host fallback path (when if clause evaluates to false).

In this mode, ALL ACC operations should be converted or removed.

Parameters
enableLoopConversionWhether to convert orphan acc.loop operations.

Definition at line 397 of file ACCSpecializeForHost.cpp.

References mlir::patterns.

◆ populateACCOrphanToHostPatterns()

void mlir::acc::populateACCOrphanToHostPatterns ( RewritePatternSet & patterns,
OpenACCSupport & accSupport,
bool enableLoopConversion = true )

Populates patterns for converting orphan ACC operations to host.

All patterns check that the operation is NOT inside or associated with a compute region before converting.

Parameters
enableLoopConversionWhether to convert orphan acc.loop operations.

Definition at line 360 of file ACCSpecializeForHost.cpp.

References mlir::patterns.

◆ populateACCSpecializeForDevicePatterns()

void mlir::acc::populateACCSpecializeForDevicePatterns ( RewritePatternSet & patterns)

Populates all patterns for device specialization.

In specialized device code (such as specialized acc routine), many ACC operations do not make sense because they are host-side constructs. This function adds patterns to remove or transform them.

Definition at line 124 of file ACCSpecializeForDevice.cpp.

References mlir::patterns.

◆ tileACCLoops()

mlir::acc::LoopOp mlir::acc::tileACCLoops ( llvm::SmallVector< mlir::acc::LoopOp > & tileLoops,
const llvm::SmallVector< mlir::Value > & tileSizes,
int32_t defaultTileSize,
mlir::RewriterBase & rewriter )

Tile ACC loops according to the given tile sizes.

Tiling a 2-level nested loop will create two 'tile' loops containing two 'element' loops. The transformation looks like:

Before Tiling:

#pragma acc loop tile(tile_size1, tile_size2)
for (i = lb1; i < ub1; i += step1) { // original loop
for (j = lb2; j < ub2; j += step2) {
a[i,j] = i + j;
}
}
Eliminates variable at the specified position using Fourier-Motzkin variable elimination.

After Tiling:

for (i = lb1; i < ub1; i += (step1 * tile_size1)) { // tile loop 1
for (j = lb2; j < ub2; j += (step2 * tile_size2)) { // tile loop 2
for (ii = i; ii < min(ub1, (step1 * tile_size1) + i); ii += step1) {
// element loop 1
for (jj = j; jj < min(ub2, (step2 * tile_size2) + j); jj += step2)
{ // element loop 2
a[ii,jj] = i + j;
}
}
}
}
static Value min(ImplicitLocOpBuilder &builder, Value value, Value bound)

Unknown tile sizes (represented as -1 in acc dialect for tile(*)) are resolved to the provided default tile size.

Parameters
tileLoopsThe loops to tile (outermost first).
tileSizesThe tile sizes for each dimension. Values of -1 are treated as unknown and resolved to defaultTileSize.
defaultTileSizeThe default tile size to use for unknown (*) tiles.
rewriterThe rewriter to use for modifications.
Returns
The outermost loop after tiling.

Definition at line 136 of file OpenACCUtilsTiling.cpp.

References createInnerLoop(), mlir::RewriterBase::finalizeOpModification(), mlir::Builder::getDenseBoolArrayAttr(), mlir::Builder::getIntegerAttr(), mlir::getType(), moveOpsAndReplaceIVs(), removeWorkerVectorFromLoop(), resolveAndCastTileSize(), mlir::OpBuilder::setInsertionPoint(), and mlir::RewriterBase::startOpModification().

◆ uncollapseLoops()

llvm::SmallVector< mlir::acc::LoopOp > mlir::acc::uncollapseLoops ( mlir::acc::LoopOp origLoop,
unsigned tileCount,
unsigned collapseCount,
mlir::RewriterBase & rewriter )

Uncollapse tile loops with multiple IVs and collapseCount < tileCount.

This is used to prepare loops for tiling when the collapse count is less than the tile count.

Parameters
origLoopThe original loop operation to uncollapse.
tileCountThe number of tile dimensions.
collapseCountThe collapse count from the original loop.
rewriterThe rewriter to use for modifications.
Returns
A vector of uncollapsed loop operations.

Definition at line 253 of file OpenACCUtilsTiling.cpp.

References createACCLoopFromOriginal(), mlir::OpBuilder::createBlock(), createInnerLoop(), mlir::Builder::getDenseBoolArrayAttr(), moveOpsAndReplaceIVs(), mlir::OpBuilder::setInsertionPoint(), and mlir::OpBuilder::setInsertionPointToEnd().