CIRCT 20.0.0git
Loading...
Searching...
No Matches
BackedgeBuilder.cpp
Go to the documentation of this file.
1//===- BackedgeBuilder.cpp - Support for building backedges ---------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file provide support for building backedges.
10//
11//===----------------------------------------------------------------------===//
12
14#include "circt/Support/LLVM.h"
15
16#include "mlir/IR/BuiltinOps.h"
17#include "mlir/IR/PatternMatch.h"
18
19using namespace circt;
20
21Backedge::Backedge(mlir::Operation *op) : value(op->getResult(0)) {}
22
23void Backedge::setValue(mlir::Value newValue) {
24 assert(value.getType() == newValue.getType());
25 assert(!set && "backedge already set to a value!");
26 value.replaceAllUsesWith(newValue);
27 value = newValue; // In case the backedge is still referred to after setting.
28 set = true;
29
30 // If the backedge is referenced again, it should now point to the updated
31 // value.
32 value = newValue;
33}
34
36
38 unsigned numInUse = 0;
39 for (Operation *op : edges) {
40 if (!op->use_empty()) {
41 auto diag = op->emitError("backedge of type ")
42 << op->getResult(0).getType() << " still in use";
43 for (auto user : op->getUsers())
44 diag.attachNote(user->getLoc()) << "used by " << *user;
45 ++numInUse;
46 continue;
47 }
48 if (rewriter)
49 rewriter->eraseOp(op);
50 else
51 op->erase();
52 }
53 edges.clear();
54 if (numInUse > 0)
55 mlir::emitRemark(loc, "abandoned ") << numInUse << " backedges";
56 return success(numInUse == 0);
57}
58
60
61BackedgeBuilder::BackedgeBuilder(OpBuilder &builder, Location loc)
62 : builder(builder), rewriter(nullptr), loc(loc) {}
63BackedgeBuilder::BackedgeBuilder(PatternRewriter &rewriter, Location loc)
64 : builder(rewriter), rewriter(&rewriter), loc(loc) {}
65Backedge BackedgeBuilder::get(Type t, mlir::LocationAttr optionalLoc) {
66 if (!optionalLoc)
67 optionalLoc = loc;
68 Operation *op = builder.create<mlir::UnrealizedConversionCastOp>(
69 optionalLoc, t, ValueRange{});
70 edges.push_back(op);
71 return Backedge(op);
72}
assert(baseType &&"element must be base type")
void abandon()
Abandon the backedges, suppressing any diagnostics if they are still active upon destruction of the b...
llvm::SmallVector< mlir::Operation *, 16 > edges
Backedge get(mlir::Type resultType, mlir::LocationAttr optionalLoc={})
Create a typed backedge.
mlir::OpBuilder & builder
mlir::PatternRewriter * rewriter
mlir::LogicalResult clearOrEmitError()
Clear the backedges, erasing any remaining cursor ops.
BackedgeBuilder(mlir::OpBuilder &builder, mlir::Location loc)
To build a backedge op and manipulate it, we need a PatternRewriter and a Location.
Backedge is a wrapper class around a Value.
mlir::Value value
void setValue(mlir::Value)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.