17#define GEN_PASS_DEF_CONVERTOPENACCTOSCFPASS
18#include "mlir/Conversion/Passes.h.inc"
30template <
typename OpTy>
32 using OpRewritePattern<OpTy>::OpRewritePattern;
34 LogicalResult matchAndRewrite(OpTy op,
35 PatternRewriter &rewriter)
const override {
40 IntegerAttr constAttr;
42 auto ifOp = scf::IfOp::create(rewriter, op.getLoc(),
TypeRange(),
43 op.getIfCond(),
false);
44 rewriter.
modifyOpInPlace(op, [&]() { op.getIfCondMutable().erase(0); });
45 auto thenBodyBuilder = ifOp.getThenBodyBuilder(rewriter.
getListener());
46 thenBodyBuilder.clone(*op.getOperation());
49 if (constAttr.getInt())
50 rewriter.
modifyOpInPlace(op, [&]() { op.getIfCondMutable().erase(0); });
66struct ConvertOpenACCToSCFPass
68 void runOnOperation()
override;
72void ConvertOpenACCToSCFPass::runOnOperation() {
73 auto op = getOperation();
74 auto *context = op.getContext();
77 ConversionTarget
target(*context);
80 target.addLegalDialect<scf::SCFDialect>();
81 target.addLegalDialect<acc::OpenACCDialect>();
83 target.addDynamicallyLegalOp<acc::EnterDataOp>(
84 [](acc::EnterDataOp op) {
return !op.getIfCond(); });
86 target.addDynamicallyLegalOp<acc::ExitDataOp>(
87 [](acc::ExitDataOp op) {
return !op.getIfCond(); });
89 target.addDynamicallyLegalOp<acc::UpdateOp>(
90 [](acc::UpdateOp op) {
return !op.getIfCond(); });
Listener * getListener() const
Returns the current listener of this builder, or nullptr if this builder doesn't have a listener.
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.
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.
const FrozenRewritePatternSet & patterns
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...