return rewriter.create<tensor::ExtractOp>(loc, values, ivs[0]);
}
+/// Generates code to stack-allocate a `memref<?xindex>` where the `?`
+/// is the given `rank`. This array is intended to serve as a reusable
+/// buffer for storing the indices of a single tensor element, to avoid
+/// allocation in the body of loops.
+static Value allocaIndices(ConversionPatternRewriter &rewriter, Location loc,
+ int64_t rank) {
+ auto indexTp = rewriter.getIndexType();
+ auto memTp = MemRefType::get({ShapedType::kDynamicSize}, indexTp);
+ Value arg = rewriter.create<ConstantOp>(loc, rewriter.getIndexAttr(rank));
+ return rewriter.create<memref::AllocaOp>(loc, memTp, ValueRange{arg});
+}
+
//===----------------------------------------------------------------------===//
// Conversion rules.
//===----------------------------------------------------------------------===//
// loop is generated by genAddElt().
Location loc = op->getLoc();
ShapedType shape = resType.cast<ShapedType>();
- auto memTp =
- MemRefType::get({ShapedType::kDynamicSize}, rewriter.getIndexType());
Value perm;
Value ptr = genNewCall(rewriter, op, encDst, 2, perm);
- Value arg = rewriter.create<ConstantOp>(
- loc, rewriter.getIndexAttr(shape.getRank()));
- Value ind = rewriter.create<memref::AllocaOp>(loc, memTp, ValueRange{arg});
+ Value ind = allocaIndices(rewriter, loc, shape.getRank());
SmallVector<Value> lo;
SmallVector<Value> hi;
SmallVector<Value> st;