@@ -123,6 +123,25 @@ static Value calculateMemrefTotalSizeBytes(Location loc, MemRefType memrefType,
123123 return totalSizeBytes.getResult ();
124124}
125125
126+ static emitc::ApplyOp
127+ createPointerFromEmitcArray (Location loc, OpBuilder &builder,
128+ TypedValue<emitc::ArrayType> arrayValue) {
129+
130+ emitc::ConstantOp zeroIndex = builder.create <emitc::ConstantOp>(
131+ loc, builder.getIndexType (), builder.getIndexAttr (0 ));
132+
133+ int64_t rank = arrayValue.getType ().getRank ();
134+ llvm::SmallVector<mlir::Value> indices (rank, zeroIndex);
135+
136+ emitc::SubscriptOp subPtr =
137+ builder.create <emitc::SubscriptOp>(loc, arrayValue, ValueRange (indices));
138+ emitc::ApplyOp ptr = builder.create <emitc::ApplyOp>(
139+ loc, emitc::PointerType::get (arrayValue.getType ().getElementType ()),
140+ builder.getStringAttr (" &" ), subPtr);
141+
142+ return ptr;
143+ }
144+
126145struct ConvertAlloc final : public OpConversionPattern<memref::AllocOp> {
127146 using OpConversionPattern::OpConversionPattern;
128147 LogicalResult
@@ -204,31 +223,15 @@ struct ConvertCopy final : public OpConversionPattern<memref::CopyOp> {
204223 return rewriter.notifyMatchFailure (
205224 loc, " incompatible target memref type for EmitC conversion" );
206225
207- emitc::ConstantOp zeroIndex = rewriter.create <emitc::ConstantOp>(
208- loc, rewriter.getIndexType (), rewriter.getIndexAttr (0 ));
209-
210- auto createPointerFromEmitcArray =
211- [loc, &rewriter, &zeroIndex](
212- mlir::TypedValue<emitc::ArrayType> arrayValue) -> emitc::ApplyOp {
213- int64_t rank = arrayValue.getType ().getRank ();
214- llvm::SmallVector<mlir::Value> indices (rank, zeroIndex);
215-
216- emitc::SubscriptOp subPtr = rewriter.create <emitc::SubscriptOp>(
217- loc, arrayValue, mlir::ValueRange (indices));
218- emitc::ApplyOp ptr = rewriter.create <emitc::ApplyOp>(
219- loc, emitc::PointerType::get (arrayValue.getType ().getElementType ()),
220- rewriter.getStringAttr (" &" ), subPtr);
221-
222- return ptr;
223- };
224-
225226 auto srcArrayValue =
226227 cast<TypedValue<emitc::ArrayType>>(operands.getSource ());
227- emitc::ApplyOp srcPtr = createPointerFromEmitcArray (srcArrayValue);
228+ emitc::ApplyOp srcPtr =
229+ createPointerFromEmitcArray (loc, rewriter, srcArrayValue);
228230
229231 auto targetArrayValue =
230232 cast<TypedValue<emitc::ArrayType>>(operands.getTarget ());
231- emitc::ApplyOp targetPtr = createPointerFromEmitcArray (targetArrayValue);
233+ emitc::ApplyOp targetPtr =
234+ createPointerFromEmitcArray (loc, rewriter, targetArrayValue);
232235
233236 emitc::CallOpaqueOp memCpyCall = rewriter.create <emitc::CallOpaqueOp>(
234237 loc, TypeRange{}, " memcpy" ,
0 commit comments