12#include "mlir/IR/BuiltinAttributes.h"
13#include "mlir/IR/PatternMatch.h"
18LogicalResult WrapValidReadyOp::canonicalize(WrapValidReadyOp op,
19 PatternRewriter &rewriter) {
22 if (op.getChanOutput().use_empty() && !op.getReady().use_empty()) {
25 rewriter.replaceAllUsesWith(op.getReady(), trueConst);
31 if (op->use_empty()) {
38LogicalResult UnwrapFIFOOp::mergeAndErase(UnwrapFIFOOp
unwrap, WrapFIFOOp
wrap,
39 PatternRewriter &rewriter) {
42 rewriter.replaceOp(
wrap, {{},
unwrap.getRden()});
47LogicalResult UnwrapFIFOOp::canonicalize(UnwrapFIFOOp op,
48 PatternRewriter &rewriter) {
49 auto wrap = dyn_cast_or_null<WrapFIFOOp>(op.getChanInput().getDefiningOp());
50 if (succeeded(UnwrapFIFOOp::mergeAndErase(op,
wrap, rewriter)))
55LogicalResult WrapFIFOOp::canonicalize(WrapFIFOOp op,
56 PatternRewriter &rewriter) {
59 if (op.getChanOutput().use_empty() && !op.getRden().use_empty()) {
62 rewriter.replaceAllUsesWith(op.getRden(), falseConst);
68 if (op->use_empty()) {
74 if (!op.getChanOutput().hasOneUse())
75 return rewriter.notifyMatchFailure(
76 op,
"channel output doesn't have exactly one use");
77 auto unwrap = dyn_cast_or_null<UnwrapFIFOOp>(
78 op.getChanOutput().getUses().begin()->getOwner());
79 if (succeeded(UnwrapFIFOOp::mergeAndErase(
unwrap, op, rewriter)))
81 return rewriter.notifyMatchFailure(
82 op,
"could not find corresponding unwrap for wrap");
85OpFoldResult WrapWindow::fold(FoldAdaptor) {
86 if (
auto unwrap = dyn_cast_or_null<UnwrapWindow>(getFrame().getDefiningOp()))
90LogicalResult WrapWindow::canonicalize(WrapWindow op,
91 PatternRewriter &rewriter) {
95 bool allUsersAreUnwraps =
true;
96 for (
auto &use :
llvm::make_early_inc_range(op.getWindow().getUses())) {
97 if (
auto unwrap = dyn_cast<UnwrapWindow>(use.getOwner())) {
98 rewriter.replaceOp(
unwrap, op.getFrame());
101 allUsersAreUnwraps =
false;
104 if (allUsersAreUnwraps || op.getWindow().getUses().empty()) {
105 rewriter.eraseOp(op);
108 return success(edited);
110OpFoldResult UnwrapWindow::fold(FoldAdaptor) {
111 if (
auto wrap = dyn_cast_or_null<WrapWindow>(getWindow().getDefiningOp()))
112 return wrap.getFrame();
116LogicalResult PackBundleOp::canonicalize(PackBundleOp pack,
117 PatternRewriter &rewriter) {
118 Value bundle = pack.getBundle();
122 if (!bundle.hasOneUse())
123 return rewriter.notifyMatchFailure(pack,
124 "bundle has zero or more than one user");
127 auto unpack = dyn_cast<UnpackBundleOp>(*bundle.getUsers().begin());
130 llvm::zip_equal(pack.getToChannels(), unpack.getToChannels()))
131 rewriter.replaceAllUsesWith(b, a);
133 llvm::zip_equal(unpack.getFromChannels(), pack.getFromChannels()))
134 rewriter.replaceAllUsesWith(b, a);
135 rewriter.eraseOp(unpack);
136 rewriter.eraseOp(pack);
139 return rewriter.notifyMatchFailure(pack,
140 "could not find corresponding unpack");
143LogicalResult UnpackBundleOp::canonicalize(UnpackBundleOp unpack,
144 PatternRewriter &rewriter) {
145 Value bundle = unpack.getBundle();
149 if (!bundle.hasOneUse())
150 return rewriter.notifyMatchFailure(unpack,
151 "bundle has zero or more than one user");
154 auto pack = dyn_cast_or_null<PackBundleOp>(bundle.getDefiningOp());
156 return PackBundleOp::canonicalize(pack, rewriter);
157 return rewriter.notifyMatchFailure(unpack,
158 "could not find corresponding pack");
return wrap(CMemoryType::get(unwrap(ctx), baseType, numElements))
static EvaluatorValuePtr unwrap(OMEvaluatorValue c)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.