29 Region &body = computeFunc.
getBody();
30 assert(!body.empty() &&
"compute() function body is empty");
31 Block &block = body.back();
34 Operation *terminator = block.getTerminator();
35 assert(terminator &&
"compute() function has no terminator");
36 auto retOp = dyn_cast<ReturnOp>(terminator);
39 << terminator->getName() <<
"'\n";
40 llvm_unreachable(
"compute() function must end with ReturnOp");
42 return retOp.getOperands().front();
46 Value val,
FuncDefOp computeFunc, OpBuilder &builder, DenseMap<Value, Value> &memo
48 if (
auto it = memo.find(val); it != memo.end()) {
52 if (
auto barg = val.dyn_cast<BlockArgument>()) {
53 unsigned index = barg.getArgNumber();
54 Value mapped = computeFunc.getArgument(index - 1);
55 return memo[val] = mapped;
58 if (
auto readOp = val.getDefiningOp<
FieldReadOp>()) {
61 readOp.getLoc(), readOp.getType(), self, readOp.getFieldNameAttr().getAttr()
63 return memo[val] = rebuilt;
69 return memo[val] = builder.create<
AddFeltOp>(
add.getLoc(),
add.getType(), lhs, rhs);
75 return memo[val] = builder.create<
SubFeltOp>(
sub.getLoc(),
sub.getType(), lhs, rhs);
81 return memo[val] = builder.create<
MulFeltOp>(
mul.getLoc(),
mul.getType(), lhs, rhs);
86 return memo[val] = builder.create<
NegFeltOp>(
neg.getLoc(),
neg.getType(), operand);
92 return memo[val] = builder.create<
DivFeltOp>(
div.getLoc(),
div.getType(), lhs, rhs);
96 return memo[val] = builder.create<
FeltConstantOp>(c.getLoc(), c.getValue());
99 llvm::errs() <<
"Unhandled op in rebuildExprInCompute: " << val <<
'\n';
100 llvm_unreachable(
"Unsupported op kind");
119 assert(afterOp &&
"afterOp must be a valid Operation*");
121 for (
auto &
use : llvm::make_early_inc_range(oldVal.getUses())) {
122 Operation *user =
use.getOwner();
127 if ((user->getBlock() == afterOp->getBlock()) &&
128 (user == afterOp || user->isBeforeInBlock(afterOp))) {