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 builder.create<NullSourceOp>(
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 builder.create<NullSourceOp>(
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()))
80OpFoldResult UnwrapWindow::fold(FoldAdaptor) {
81 if (
auto wrap = dyn_cast_or_null<WrapWindow>(getWindow().getDefiningOp()))
82 return wrap.getFrame();
86LogicalResult PackBundleOp::canonicalize(PackBundleOp pack,
87 PatternRewriter &rewriter) {
88 Value bundle = pack.getBundle();
92 if (!bundle.hasOneUse())
93 return rewriter.notifyMatchFailure(pack,
94 "bundle has zero or more than one user");
97 auto unpack = dyn_cast<UnpackBundleOp>(*bundle.getUsers().begin());
100 llvm::zip_equal(pack.getToChannels(), unpack.getToChannels()))
101 rewriter.replaceAllUsesWith(b, a);
103 llvm::zip_equal(unpack.getFromChannels(), pack.getFromChannels()))
104 rewriter.replaceAllUsesWith(b, a);
105 rewriter.eraseOp(unpack);
106 rewriter.eraseOp(pack);
109 return rewriter.notifyMatchFailure(pack,
110 "could not find corresponding unpack");
113LogicalResult UnpackBundleOp::canonicalize(UnpackBundleOp unpack,
114 PatternRewriter &rewriter) {
115 Value bundle = unpack.getBundle();
119 if (!bundle.hasOneUse())
120 return rewriter.notifyMatchFailure(unpack,
121 "bundle has zero or more than one user");
124 auto pack = dyn_cast_or_null<PackBundleOp>(bundle.getDefiningOp());
126 return PackBundleOp::canonicalize(pack, rewriter);
127 return rewriter.notifyMatchFailure(unpack,
128 "could not find corresponding pack");
AIGLongestPathObject wrap(llvm::PointerUnion< Object *, DataflowPath::OutputPort * > object)
static Location getLoc(DefSlot slot)
static EvaluatorValuePtr unwrap(OMEvaluatorValue c)
static InstancePath empty
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.