28 Value val,
FuncDefOp computeFunc, OpBuilder &builder, DenseMap<Value, Value> &memo
30 if (
auto it = memo.find(val); it != memo.end()) {
34 if (
auto barg = val.dyn_cast<BlockArgument>()) {
35 unsigned index = barg.getArgNumber();
36 Value mapped = computeFunc.getArgument(index - 1);
37 return memo[val] = mapped;
40 if (
auto readOp = val.getDefiningOp<
FieldReadOp>()) {
43 readOp.getLoc(), readOp.getType(), self, readOp.getFieldNameAttr().getAttr()
45 return memo[val] = rebuilt;
51 return memo[val] = builder.create<
AddFeltOp>(
add.getLoc(),
add.getType(), lhs, rhs);
57 return memo[val] = builder.create<
SubFeltOp>(
sub.getLoc(),
sub.getType(), lhs, rhs);
63 return memo[val] = builder.create<
MulFeltOp>(
mul.getLoc(),
mul.getType(), lhs, rhs);
68 return memo[val] = builder.create<
NegFeltOp>(
neg.getLoc(),
neg.getType(), operand);
74 return memo[val] = builder.create<
DivFeltOp>(
div.getLoc(),
div.getType(), lhs, rhs);
78 return memo[val] = builder.create<
FeltConstantOp>(c.getLoc(), c.getValue());
81 llvm::errs() <<
"Unhandled op in rebuildExprInCompute: " << val <<
'\n';
82 llvm_unreachable(
"Unsupported op kind");
101 assert(afterOp &&
"afterOp must be a valid Operation*");
103 for (
auto &
use : llvm::make_early_inc_range(oldVal.getUses())) {
104 Operation *user =
use.getOwner();
109 if ((user->getBlock() == afterOp->getBlock()) &&
110 (user == afterOp || user->isBeforeInBlock(afterOp))) {