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()) {
37 if (!op.getChanOutput().hasOneUse())
38 return rewriter.notifyMatchFailure(
39 op,
"channel output doesn't have exactly one use");
40 auto unwrap = dyn_cast_or_null<UnwrapValidReadyOp>(
41 op.getChanOutput().getUses().begin()->getOwner());
42 if (succeeded(UnwrapValidReadyOp::mergeAndErase(
unwrap, op, rewriter)))
44 return rewriter.notifyMatchFailure(
45 op,
"could not find corresponding unwrap for wrap");
48LogicalResult UnwrapValidReadyOp::mergeAndErase(UnwrapValidReadyOp
unwrap,
49 WrapValidReadyOp
wrap,
50 PatternRewriter &rewriter) {
56 Value ready =
unwrap.getReady();
58 rewriter.replaceOp(
wrap, {{}, ready});
64LogicalResult UnwrapValidReadyOp::canonicalize(UnwrapValidReadyOp op,
65 PatternRewriter &rewriter) {
67 dyn_cast_or_null<WrapValidReadyOp>(op.getChanInput().getDefiningOp());
68 if (succeeded(UnwrapValidReadyOp::mergeAndErase(op,
wrap, rewriter)))
73LogicalResult UnwrapFIFOOp::mergeAndErase(UnwrapFIFOOp
unwrap, WrapFIFOOp
wrap,
74 PatternRewriter &rewriter) {
78 Value rden =
unwrap.getRden();
80 rewriter.replaceOp(
wrap, {{}, rden});
85LogicalResult UnwrapFIFOOp::canonicalize(UnwrapFIFOOp op,
86 PatternRewriter &rewriter) {
87 auto wrap = dyn_cast_or_null<WrapFIFOOp>(op.getChanInput().getDefiningOp());
88 if (succeeded(UnwrapFIFOOp::mergeAndErase(op,
wrap, rewriter)))
93LogicalResult WrapFIFOOp::canonicalize(WrapFIFOOp op,
94 PatternRewriter &rewriter) {
97 if (op.getChanOutput().use_empty() && !op.getRden().use_empty()) {
100 rewriter.replaceAllUsesWith(op.getRden(), falseConst);
101 rewriter.eraseOp(op);
106 if (op->use_empty()) {
107 rewriter.eraseOp(op);
112 if (!op.getChanOutput().hasOneUse())
113 return rewriter.notifyMatchFailure(
114 op,
"channel output doesn't have exactly one use");
115 auto unwrap = dyn_cast_or_null<UnwrapFIFOOp>(
116 op.getChanOutput().getUses().begin()->getOwner());
117 if (succeeded(UnwrapFIFOOp::mergeAndErase(
unwrap, op, rewriter)))
119 return rewriter.notifyMatchFailure(
120 op,
"could not find corresponding unwrap for wrap");
127LogicalResult UnwrapValidOnlyOp::mergeAndErase(UnwrapValidOnlyOp
unwrap,
128 WrapValidOnlyOp
wrap,
129 PatternRewriter &rewriter) {
132 rewriter.replaceOp(
unwrap, {
wrap.getRawInput(),
wrap.getValid()});
133 rewriter.eraseOp(
wrap);
139LogicalResult UnwrapValidOnlyOp::canonicalize(UnwrapValidOnlyOp op,
140 PatternRewriter &rewriter) {
142 dyn_cast_or_null<WrapValidOnlyOp>(op.getChanInput().getDefiningOp());
143 if (succeeded(UnwrapValidOnlyOp::mergeAndErase(op,
wrap, rewriter)))
148LogicalResult WrapValidOnlyOp::canonicalize(WrapValidOnlyOp op,
149 PatternRewriter &rewriter) {
151 if (op.getChanOutput().use_empty()) {
152 rewriter.eraseOp(op);
157 if (!op.getChanOutput().hasOneUse())
158 return rewriter.notifyMatchFailure(
159 op,
"channel output doesn't have exactly one use");
160 auto unwrap = dyn_cast_or_null<UnwrapValidOnlyOp>(
161 op.getChanOutput().getUses().begin()->getOwner());
162 if (succeeded(UnwrapValidOnlyOp::mergeAndErase(
unwrap, op, rewriter)))
164 return rewriter.notifyMatchFailure(
165 op,
"could not find corresponding unwrap for wrap");
168OpFoldResult WrapWindow::fold(FoldAdaptor) {
169 if (
auto unwrap = dyn_cast_or_null<UnwrapWindow>(getFrame().getDefiningOp()))
170 return unwrap.getWindow();
173LogicalResult WrapWindow::canonicalize(WrapWindow op,
174 PatternRewriter &rewriter) {
178 bool allUsersAreUnwraps =
true;
179 for (
auto &use :
llvm::make_early_inc_range(op.getWindow().getUses())) {
180 if (
auto unwrap = dyn_cast<UnwrapWindow>(use.getOwner())) {
181 rewriter.replaceOp(
unwrap, op.getFrame());
184 allUsersAreUnwraps =
false;
187 if (allUsersAreUnwraps || op.getWindow().getUses().empty()) {
188 rewriter.eraseOp(op);
191 return success(edited);
193OpFoldResult UnwrapWindow::fold(FoldAdaptor) {
194 if (
auto wrap = dyn_cast_or_null<WrapWindow>(getWindow().getDefiningOp()))
195 return wrap.getFrame();
199LogicalResult PackBundleOp::canonicalize(PackBundleOp pack,
200 PatternRewriter &rewriter) {
201 Value bundle = pack.getBundle();
205 if (!bundle.hasOneUse())
206 return rewriter.notifyMatchFailure(pack,
207 "bundle has zero or more than one user");
210 auto unpack = dyn_cast<UnpackBundleOp>(*bundle.getUsers().begin());
213 llvm::zip_equal(pack.getToChannels(), unpack.getToChannels()))
214 rewriter.replaceAllUsesWith(b, a);
216 llvm::zip_equal(unpack.getFromChannels(), pack.getFromChannels()))
217 rewriter.replaceAllUsesWith(b, a);
218 rewriter.eraseOp(unpack);
219 rewriter.eraseOp(pack);
222 return rewriter.notifyMatchFailure(pack,
223 "could not find corresponding unpack");
226LogicalResult UnpackBundleOp::canonicalize(UnpackBundleOp unpack,
227 PatternRewriter &rewriter) {
228 Value bundle = unpack.getBundle();
232 if (!bundle.hasOneUse())
233 return rewriter.notifyMatchFailure(unpack,
234 "bundle has zero or more than one user");
237 auto pack = dyn_cast_or_null<PackBundleOp>(bundle.getDefiningOp());
239 return PackBundleOp::canonicalize(pack, rewriter);
240 return rewriter.notifyMatchFailure(unpack,
241 "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.