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");
89LogicalResult UnwrapValidOnlyOp::mergeAndErase(UnwrapValidOnlyOp
unwrap,
91 PatternRewriter &rewriter) {
94 rewriter.eraseOp(
wrap);
100LogicalResult UnwrapValidOnlyOp::canonicalize(UnwrapValidOnlyOp op,
101 PatternRewriter &rewriter) {
103 dyn_cast_or_null<WrapValidOnlyOp>(op.getChanInput().getDefiningOp());
104 if (succeeded(UnwrapValidOnlyOp::mergeAndErase(op,
wrap, rewriter)))
109LogicalResult WrapValidOnlyOp::canonicalize(WrapValidOnlyOp op,
110 PatternRewriter &rewriter) {
112 if (op.getChanOutput().use_empty()) {
113 rewriter.eraseOp(op);
118 if (!op.getChanOutput().hasOneUse())
119 return rewriter.notifyMatchFailure(
120 op,
"channel output doesn't have exactly one use");
121 auto unwrap = dyn_cast_or_null<UnwrapValidOnlyOp>(
122 op.getChanOutput().getUses().begin()->getOwner());
123 if (succeeded(UnwrapValidOnlyOp::mergeAndErase(
unwrap, op, rewriter)))
125 return rewriter.notifyMatchFailure(
126 op,
"could not find corresponding unwrap for wrap");
129OpFoldResult WrapWindow::fold(FoldAdaptor) {
130 if (
auto unwrap = dyn_cast_or_null<UnwrapWindow>(getFrame().getDefiningOp()))
131 return unwrap.getWindow();
134LogicalResult WrapWindow::canonicalize(WrapWindow op,
135 PatternRewriter &rewriter) {
139 bool allUsersAreUnwraps =
true;
140 for (
auto &use :
llvm::make_early_inc_range(op.getWindow().getUses())) {
141 if (
auto unwrap = dyn_cast<UnwrapWindow>(use.getOwner())) {
142 rewriter.replaceOp(
unwrap, op.getFrame());
145 allUsersAreUnwraps =
false;
148 if (allUsersAreUnwraps || op.getWindow().getUses().empty()) {
149 rewriter.eraseOp(op);
152 return success(edited);
154OpFoldResult UnwrapWindow::fold(FoldAdaptor) {
155 if (
auto wrap = dyn_cast_or_null<WrapWindow>(getWindow().getDefiningOp()))
156 return wrap.getFrame();
160LogicalResult PackBundleOp::canonicalize(PackBundleOp pack,
161 PatternRewriter &rewriter) {
162 Value bundle = pack.getBundle();
166 if (!bundle.hasOneUse())
167 return rewriter.notifyMatchFailure(pack,
168 "bundle has zero or more than one user");
171 auto unpack = dyn_cast<UnpackBundleOp>(*bundle.getUsers().begin());
174 llvm::zip_equal(pack.getToChannels(), unpack.getToChannels()))
175 rewriter.replaceAllUsesWith(
b,
a);
177 llvm::zip_equal(unpack.getFromChannels(), pack.getFromChannels()))
178 rewriter.replaceAllUsesWith(
b,
a);
179 rewriter.eraseOp(unpack);
180 rewriter.eraseOp(pack);
183 return rewriter.notifyMatchFailure(pack,
184 "could not find corresponding unpack");
187LogicalResult UnpackBundleOp::canonicalize(UnpackBundleOp unpack,
188 PatternRewriter &rewriter) {
189 Value bundle = unpack.getBundle();
193 if (!bundle.hasOneUse())
194 return rewriter.notifyMatchFailure(unpack,
195 "bundle has zero or more than one user");
198 auto pack = dyn_cast_or_null<PackBundleOp>(bundle.getDefiningOp());
200 return PackBundleOp::canonicalize(pack, rewriter);
201 return rewriter.notifyMatchFailure(unpack,
202 "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.