12#include "mlir/IR/BuiltinAttributes.h"
13#include "mlir/IR/PatternMatch.h"
18LogicalResult WrapValidReadyOp::fold(FoldAdaptor,
19 SmallVectorImpl<OpFoldResult> &results) {
20 if (!getChanOutput().getUsers().
empty())
22 OpBuilder builder(getContext());
24 NullSourceOp::create(builder,
getLoc(), getChanOutput().getType())
26 results.push_back(IntegerAttr::get(IntegerType::get(getContext(), 1), 1));
30LogicalResult UnwrapFIFOOp::mergeAndErase(UnwrapFIFOOp
unwrap, WrapFIFOOp
wrap,
31 PatternRewriter &rewriter) {
34 rewriter.replaceOp(
wrap, {{},
unwrap.getRden()});
39LogicalResult UnwrapFIFOOp::canonicalize(UnwrapFIFOOp op,
40 PatternRewriter &rewriter) {
41 auto wrap = dyn_cast_or_null<WrapFIFOOp>(op.getChanInput().getDefiningOp());
42 if (succeeded(UnwrapFIFOOp::mergeAndErase(op,
wrap, rewriter)))
47LogicalResult WrapFIFOOp::fold(FoldAdaptor,
48 SmallVectorImpl<OpFoldResult> &results) {
49 if (!getChanOutput().getUsers().
empty())
52 OpBuilder builder(getContext());
54 NullSourceOp::create(builder,
getLoc(), getChanOutput().getType())
56 results.push_back(IntegerAttr::get(
57 IntegerType::get(getContext(), 1, IntegerType::Signless), 0));
61LogicalResult WrapFIFOOp::canonicalize(WrapFIFOOp op,
62 PatternRewriter &rewriter) {
64 if (!op.getChanOutput().hasOneUse())
65 return rewriter.notifyMatchFailure(
66 op,
"channel output doesn't have exactly one use");
67 auto unwrap = dyn_cast_or_null<UnwrapFIFOOp>(
68 op.getChanOutput().getUses().begin()->getOwner());
69 if (succeeded(UnwrapFIFOOp::mergeAndErase(
unwrap, op, rewriter)))
71 return rewriter.notifyMatchFailure(
72 op,
"could not find corresponding unwrap for wrap");
75OpFoldResult WrapWindow::fold(FoldAdaptor) {
76 if (
auto unwrap = dyn_cast_or_null<UnwrapWindow>(getFrame().getDefiningOp()))
80LogicalResult WrapWindow::canonicalize(WrapWindow op,
81 PatternRewriter &rewriter) {
85 bool allUsersAreUnwraps =
true;
86 for (
auto &use :
llvm::make_early_inc_range(op.getWindow().getUses())) {
87 if (
auto unwrap = dyn_cast<UnwrapWindow>(use.getOwner())) {
88 rewriter.replaceOp(
unwrap, op.getFrame());
91 allUsersAreUnwraps =
false;
94 if (allUsersAreUnwraps || op.getWindow().getUses().empty()) {
98 return success(edited);
100OpFoldResult UnwrapWindow::fold(FoldAdaptor) {
101 if (
auto wrap = dyn_cast_or_null<WrapWindow>(getWindow().getDefiningOp()))
102 return wrap.getFrame();
106LogicalResult PackBundleOp::canonicalize(PackBundleOp pack,
107 PatternRewriter &rewriter) {
108 Value bundle = pack.getBundle();
112 if (!bundle.hasOneUse())
113 return rewriter.notifyMatchFailure(pack,
114 "bundle has zero or more than one user");
117 auto unpack = dyn_cast<UnpackBundleOp>(*bundle.getUsers().begin());
120 llvm::zip_equal(pack.getToChannels(), unpack.getToChannels()))
121 rewriter.replaceAllUsesWith(b, a);
123 llvm::zip_equal(unpack.getFromChannels(), pack.getFromChannels()))
124 rewriter.replaceAllUsesWith(b, a);
125 rewriter.eraseOp(unpack);
126 rewriter.eraseOp(pack);
129 return rewriter.notifyMatchFailure(pack,
130 "could not find corresponding unpack");
133LogicalResult UnpackBundleOp::canonicalize(UnpackBundleOp unpack,
134 PatternRewriter &rewriter) {
135 Value bundle = unpack.getBundle();
139 if (!bundle.hasOneUse())
140 return rewriter.notifyMatchFailure(unpack,
141 "bundle has zero or more than one user");
144 auto pack = dyn_cast_or_null<PackBundleOp>(bundle.getDefiningOp());
146 return PackBundleOp::canonicalize(pack, rewriter);
147 return rewriter.notifyMatchFailure(unpack,
148 "could not find corresponding pack");
return wrap(CMemoryType::get(unwrap(ctx), baseType, numElements))
static Location getLoc(DefSlot slot)
static EvaluatorValuePtr unwrap(OMEvaluatorValue c)
static InstancePath empty
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.