66 Value val,
FuncDefOp computeFunc, OpBuilder &builder, DenseMap<Value, Value> &memo
68 if (
auto it = memo.find(val); it != memo.end()) {
72 if (
auto barg = llvm::dyn_cast<BlockArgument>(val)) {
73 return memo[val] = mapBlockArgumentInCompute(barg, computeFunc);
78 for (Value operand : readOp->getOperands()) {
79 Value rebuiltOperand = mapValueIntoCompute(operand, computeFunc, builder, memo);
80 if (!rebuiltOperand) {
83 mapper.map(operand, rebuiltOperand);
86 Operation *rebuiltOp = builder.clone(*readOp.getOperation(), mapper);
87 assert(rebuiltOp->getNumResults() == 1 &&
"member reads have exactly one result");
88 return memo[val] = rebuiltOp->getResult(0);
91 if (
auto callOp = val.getDefiningOp<
CallOp>()) {
92 if (!callOp.getMapOperands().empty()) {
95 "cannot rebuild affine-instantiated function.call in compute-side auxiliary "
102 SymbolTableCollection tables;
103 FailureOr<SymbolLookupResult<FuncDefOp>> target = callOp.getCalleeTarget(tables);
104 if (failed(target)) {
116 "cannot rebuild function.call in compute-side auxiliary expression: callee "
117 "requires attributes not present on the compute function"
123 SmallVector<Value> rebuiltArgs;
124 rebuiltArgs.reserve(callOp.getArgOperands().size());
125 for (Value arg : callOp.getArgOperands()) {
130 rebuiltArgs.push_back(rebuiltArg);
133 ArrayRef<Attribute> templateParams;
134 if (ArrayAttr params = callOp.getTemplateParamsAttr()) {
135 templateParams = params.getValue();
139 callOp.getLoc(), callOp.getResultTypes(), callOp.getCalleeAttr(), rebuiltArgs,
142 for (
auto [oldResult, newResult] : llvm::zip(callOp.getResults(), rebuilt.getResults())) {
143 memo[oldResult] = newResult;
148 if (val.getType().isIndex()) {
151 Operation *defOp = val.getDefiningOp();
152 assert(defOp &&
"index block arguments should already be mapped");
155 for (Value operand : defOp->getOperands()) {
156 Value rebuiltOperand = mapValueIntoCompute(operand, computeFunc, builder, memo);
157 if (!rebuiltOperand) {
160 mapper.map(operand, rebuiltOperand);
163 Operation *rebuiltOp = builder.clone(*defOp, mapper);
165 rebuiltOp->getNumResults() == defOp->getNumResults() &&
166 "cloned index op should preserve result count"
168 unsigned resultNumber = llvm::cast<OpResult>(val).getResultNumber();
169 return memo[val] = rebuiltOp->getResult(resultNumber);
178 return memo[val] = builder.create<
AddFeltOp>(
add.getLoc(),
add.getType(), lhs, rhs);
187 return memo[val] = builder.create<
SubFeltOp>(
sub.getLoc(),
sub.getType(), lhs, rhs);
196 return memo[val] = builder.create<
MulFeltOp>(
mul.getLoc(),
mul.getType(), lhs, rhs);
204 return memo[val] = builder.create<
NegFeltOp>(
neg.getLoc(),
neg.getType(), operand);
213 return memo[val] = builder.create<
DivFeltOp>(
div.getLoc(),
div.getType(), lhs, rhs);
217 return memo[val] = builder.create<
FeltConstantOp>(c.getLoc(), c.getValueAttr());
220 if (Operation *op = val.getDefiningOp()) {
221 op->emitError(
"cannot rebuild unsupported operation in compute-side auxiliary expression")