18#define GEN_PASS_DEF_CONVERTOPENACCTOSCFPASS
19#include "mlir/Conversion/Passes.h.inc"
31template <
typename OpTy>
33 using OpRewritePattern<OpTy>::OpRewritePattern;
35 LogicalResult matchAndRewrite(OpTy op,
36 PatternRewriter &rewriter)
const override {
41 IntegerAttr constAttr;
43 auto ifOp = scf::IfOp::create(rewriter, op.getLoc(),
TypeRange(),
44 op.getIfCond(),
false);
45 rewriter.
modifyOpInPlace(op, [&]() { op.getIfCondMutable().erase(0); });
46 auto thenBodyBuilder = ifOp.getThenBodyBuilder(rewriter.
getListener());
47 thenBodyBuilder.clone(*op.getOperation());
50 if (constAttr.getInt())
51 rewriter.
modifyOpInPlace(op, [&]() { op.getIfCondMutable().erase(0); });
61 patterns.
add<ExpandIfCondition<acc::EnterDataOp>>(patterns.
getContext());
62 patterns.
add<ExpandIfCondition<acc::ExitDataOp>>(patterns.
getContext());
63 patterns.
add<ExpandIfCondition<acc::UpdateOp>>(patterns.
getContext());
67struct ConvertOpenACCToSCFPass
70 Base::getDependentDialects(registry);
74 void runOnOperation()
override;
78void ConvertOpenACCToSCFPass::runOnOperation() {
79 auto op = getOperation();
80 auto *context = op.getContext();
82 RewritePatternSet patterns(context);
83 ConversionTarget
target(*context);
86 target.addLegalDialect<scf::SCFDialect>();
87 target.addLegalDialect<acc::OpenACCDialect>();
89 target.addDynamicallyLegalOp<acc::EnterDataOp>(
90 [](acc::EnterDataOp op) {
return !op.getIfCond(); });
92 target.addDynamicallyLegalOp<acc::ExitDataOp>(
93 [](acc::ExitDataOp op) {
return !op.getIfCond(); });
95 target.addDynamicallyLegalOp<acc::UpdateOp>(
96 [](acc::UpdateOp op) {
return !op.getIfCond(); });
98 if (
failed(applyPartialConversion(op,
target, std::move(patterns))))
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
Listener * getListener() const
Returns the current listener of this builder, or nullptr if this builder doesn't have a listener.
MLIRContext * getContext() const
RewritePatternSet & add(ConstructorArg &&arg, ConstructorArgs &&...args)
Add an instance of each of the pattern types 'Ts' to the pattern list with the given arguments.
virtual void eraseOp(Operation *op)
This method erases an operation that is known to have no uses.
void modifyOpInPlace(Operation *root, CallableT &&callable)
This method is a utility wrapper around an in-place modification of an operation.
void registerAllExtensions(DialectRegistry ®istry)
Register the standard OpenACC models for GPU, LLVM and MemRef IR.
Include the generated interface declarations.
bool matchPattern(Value value, const Pattern &pattern)
Entry point for matching a pattern over a Value.
void populateOpenACCToSCFConversionPatterns(RewritePatternSet &patterns)
Collect the patterns to convert from the OpenACC dialect to OpenACC with SCF dialect.
detail::constant_op_matcher m_Constant()
Matches a constant foldable operation.
OpRewritePattern is a wrapper around RewritePattern that allows for matching and rewriting against an...