Skip to content

Commit 22bd99d

Browse files
committed
Add ArrayToPointerOp and its conversion pattern
Signed-off-by: Roberto Raggi <[email protected]>
1 parent 9176612 commit 22bd99d

File tree

3 files changed

+61
-5
lines changed

3 files changed

+61
-5
lines changed

src/mlir/cxx/mlir/CxxOps.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,12 @@ def Cxx_IntegralCastOp : Cxx_Op<"integral_cast"> {
202202
let results = (outs Cxx_IntegerType:$result);
203203
}
204204

205+
def Cxx_ArrayToPointerOp : Cxx_Op<"array_to_pointer"> {
206+
let arguments = (ins Cxx_PointerType:$value);
207+
208+
let results = (outs Cxx_PointerType:$result);
209+
}
210+
205211
def Cxx_NotOp : Cxx_Op<"not"> {
206212
let arguments = (ins AnyType:$value);
207213

src/mlir/cxx/mlir/codegen_expressions.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,17 @@ auto Codegen::ExpressionVisitor::operator()(ImplicitCastExpressionAST* ast)
10131013
break;
10141014
}
10151015

1016+
case ImplicitCastKind::kArrayToPointerConversion: {
1017+
// generate an array to pointer conversion
1018+
auto expressionResult = gen.expression(ast->expression);
1019+
auto resultType = gen.convertType(ast->type);
1020+
1021+
auto op = gen.builder_.create<mlir::cxx::ArrayToPointerOp>(
1022+
loc, resultType, expressionResult.value);
1023+
1024+
return {op};
1025+
}
1026+
10161027
default:
10171028
break;
10181029

src/mlir/cxx/mlir/cxx_dialect_conversions.cc

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -256,14 +256,14 @@ class SubscriptOpLowering : public OpConversionPattern<cxx::SubscriptOp> {
256256
auto typeConverter = getTypeConverter();
257257
auto context = getContext();
258258

259-
auto ptrType = dyn_cast_or_null<cxx::PointerType>(op.getBase().getType());
259+
auto ptrType = dyn_cast<cxx::PointerType>(op.getBase().getType());
260260

261261
if (!ptrType) {
262262
return rewriter.notifyMatchFailure(
263263
op, "failed to convert subscript operation type");
264264
}
265265

266-
auto arrayType = dyn_cast_or_null<cxx::ArrayType>(ptrType.getElementType());
266+
auto arrayType = dyn_cast<cxx::ArrayType>(ptrType.getElementType());
267267
if (!arrayType) {
268268
return rewriter.notifyMatchFailure(
269269
op, "expected base type of subscript to be an array type");
@@ -435,6 +435,45 @@ class IntToBoolOpLowering : public OpConversionPattern<cxx::IntToBoolOp> {
435435
}
436436
};
437437

438+
class ArrayToPointerOpLowering
439+
: public OpConversionPattern<cxx::ArrayToPointerOp> {
440+
public:
441+
using OpConversionPattern::OpConversionPattern;
442+
443+
auto matchAndRewrite(cxx::ArrayToPointerOp op, OpAdaptor adaptor,
444+
ConversionPatternRewriter &rewriter) const
445+
-> LogicalResult override {
446+
auto typeConverter = getTypeConverter();
447+
auto context = getContext();
448+
449+
auto ptrType = dyn_cast<cxx::PointerType>(op.getValue().getType());
450+
451+
if (!ptrType) {
452+
return rewriter.notifyMatchFailure(
453+
op, "failed to convert subscript operation type");
454+
}
455+
456+
auto arrayType = dyn_cast<cxx::ArrayType>(ptrType.getElementType());
457+
if (!arrayType) {
458+
return rewriter.notifyMatchFailure(
459+
op, "expected base type of subscript to be an array type");
460+
}
461+
462+
SmallVector<LLVM::GEPArg> indices;
463+
464+
indices.push_back(0);
465+
indices.push_back(0);
466+
467+
auto resultType = LLVM::LLVMPointerType::get(context);
468+
auto elementType = typeConverter->convertType(ptrType.getElementType());
469+
470+
rewriter.replaceOpWithNewOp<LLVM::GEPOp>(op, resultType, elementType,
471+
adaptor.getValue(), indices);
472+
473+
return success();
474+
}
475+
};
476+
438477
class BoolToIntOpLowering : public OpConversionPattern<cxx::BoolToIntOp> {
439478
public:
440479
using OpConversionPattern::OpConversionPattern;
@@ -1225,9 +1264,9 @@ void CxxToLLVMLoweringPass::runOnOperation() {
12251264
SubscriptOpLowering>(typeConverter, dataLayout, context);
12261265

12271266
// cast operations
1228-
patterns
1229-
.insert<IntToBoolOpLowering, BoolToIntOpLowering, IntegralCastOpLowering>(
1230-
typeConverter, context);
1267+
patterns.insert<IntToBoolOpLowering, BoolToIntOpLowering,
1268+
IntegralCastOpLowering, ArrayToPointerOpLowering>(
1269+
typeConverter, context);
12311270

12321271
// constant operations
12331272
patterns.insert<BoolConstantOpLowering, IntConstantOpLowering,

0 commit comments

Comments
 (0)