58 Value val,
FuncDefOp computeFunc, OpBuilder &builder, DenseMap<Value, Value> &memo
60 if (
auto it = memo.find(val); it != memo.end()) {
64 if (
auto barg = llvm::dyn_cast<BlockArgument>(val)) {
65 return memo[val] = mapBlockArgumentInCompute(barg, computeFunc);
70 for (Value operand : readOp->getOperands()) {
71 Value rebuiltOperand = mapValueIntoCompute(operand, computeFunc, builder, memo);
72 if (!rebuiltOperand) {
75 mapper.map(operand, rebuiltOperand);
78 Operation *rebuiltOp = builder.clone(*readOp.getOperation(), mapper);
79 assert(rebuiltOp->getNumResults() == 1 &&
"member reads have exactly one result");
80 return memo[val] = rebuiltOp->getResult(0);
83 if (
auto callOp = val.getDefiningOp<
CallOp>()) {
84 if (!callOp.getMapOperands().empty()) {
87 "cannot rebuild affine-instantiated function.call in compute-side auxiliary "
94 SymbolTableCollection tables;
95 FailureOr<SymbolLookupResult<FuncDefOp>> target = callOp.getCalleeTarget(tables);
108 "cannot rebuild function.call in compute-side auxiliary expression: callee "
109 "requires attributes not present on the compute function"
115 SmallVector<Value> rebuiltArgs;
116 rebuiltArgs.reserve(callOp.getArgOperands().size());
117 for (Value arg : callOp.getArgOperands()) {
122 rebuiltArgs.push_back(rebuiltArg);
125 ArrayRef<Attribute> templateParams;
126 if (ArrayAttr params = callOp.getTemplateParamsAttr()) {
127 templateParams = params.getValue();
131 callOp.getLoc(), callOp.getResultTypes(), callOp.getCalleeAttr(), rebuiltArgs,
134 for (
auto [oldResult, newResult] : llvm::zip(callOp.getResults(), rebuilt.getResults())) {
135 memo[oldResult] = newResult;
140 if (val.getType().isIndex()) {
143 Operation *defOp = val.getDefiningOp();
144 assert(defOp &&
"index block arguments should already be mapped");
147 for (Value operand : defOp->getOperands()) {
148 Value rebuiltOperand = mapValueIntoCompute(operand, computeFunc, builder, memo);
149 if (!rebuiltOperand) {
152 mapper.map(operand, rebuiltOperand);
155 Operation *rebuiltOp = builder.clone(*defOp, mapper);
157 rebuiltOp->getNumResults() == defOp->getNumResults() &&
158 "cloned index op should preserve result count"
160 unsigned resultNumber = llvm::cast<OpResult>(val).getResultNumber();
161 return memo[val] = rebuiltOp->getResult(resultNumber);
170 return memo[val] = builder.create<
AddFeltOp>(
add.getLoc(),
add.getType(), lhs, rhs);
179 return memo[val] = builder.create<
SubFeltOp>(
sub.getLoc(),
sub.getType(), lhs, rhs);
188 return memo[val] = builder.create<
MulFeltOp>(
mul.getLoc(),
mul.getType(), lhs, rhs);
196 return memo[val] = builder.create<
NegFeltOp>(
neg.getLoc(),
neg.getType(), operand);
205 return memo[val] = builder.create<
DivFeltOp>(
div.getLoc(),
div.getType(), lhs, rhs);
209 return memo[val] = builder.create<
FeltConstantOp>(c.getLoc(), c.getValueAttr());
212 if (Operation *op = val.getDefiningOp()) {
213 op->emitError(
"cannot rebuild unsupported operation in compute-side auxiliary expression")