Skip to content

Commit 3b5aa62

Browse files
committed
Add PtrToBoolOp and its conversion pattern for pointer to bool casting
Signed-off-by: Roberto Raggi <roberto.raggi@gmail.com>
1 parent d629c45 commit 3b5aa62

File tree

3 files changed

+47
-1
lines changed

3 files changed

+47
-1
lines changed

src/mlir/cxx/mlir/CxxOps.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,12 @@ def Cxx_IntToBoolOp : Cxx_Op<"int_to_bool"> {
228228
let results = (outs Cxx_BoolType:$result);
229229
}
230230

231+
def Cxx_PtrToBoolOp : Cxx_Op<"ptr_to_bool"> {
232+
let arguments = (ins Cxx_PointerType:$value);
233+
234+
let results = (outs Cxx_BoolType:$result);
235+
}
236+
231237
def Cxx_BoolToIntOp : Cxx_Op<"bool_to_int"> {
232238
let arguments = (ins Cxx_BoolType:$value);
233239

src/mlir/cxx/mlir/codegen_expressions.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,6 +1337,20 @@ auto Codegen::ExpressionVisitor::operator()(ImplicitCastExpressionAST* ast)
13371337
return expressionResult;
13381338
}
13391339

1340+
case ImplicitCastKind::kBooleanConversion: {
1341+
if (control()->is_pointer(ast->expression->type)) {
1342+
// generate a pointer to bool cast
1343+
auto expressionResult = gen.expression(ast->expression);
1344+
auto resultType = gen.convertType(ast->type);
1345+
1346+
auto op = mlir::cxx::PtrToBoolOp::create(gen.builder_, loc, resultType,
1347+
expressionResult.value);
1348+
1349+
return {op};
1350+
}
1351+
break;
1352+
}
1353+
13401354
default:
13411355
break;
13421356

src/mlir/cxx/mlir/cxx_dialect_conversions.cc

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,32 @@ class IntToBoolOpLowering : public OpConversionPattern<cxx::IntToBoolOp> {
549549
}
550550
};
551551

552+
class PtrToBoolOpLowering : public OpConversionPattern<cxx::PtrToBoolOp> {
553+
public:
554+
using OpConversionPattern::OpConversionPattern;
555+
556+
auto matchAndRewrite(cxx::PtrToBoolOp op, OpAdaptor adaptor,
557+
ConversionPatternRewriter& rewriter) const
558+
-> LogicalResult override {
559+
auto typeConverter = getTypeConverter();
560+
auto context = getContext();
561+
562+
auto resultType = typeConverter->convertType(op.getType());
563+
if (!resultType) {
564+
return rewriter.notifyMatchFailure(
565+
op, "failed to convert pointer to bool type");
566+
}
567+
568+
auto zero = LLVM::ZeroOp::create(rewriter, op.getLoc(),
569+
adaptor.getValue().getType());
570+
571+
rewriter.replaceOpWithNewOp<LLVM::ICmpOp>(
572+
op, resultType, LLVM::ICmpPredicate::ne, adaptor.getValue(), zero);
573+
574+
return success();
575+
}
576+
};
577+
552578
class ArrayToPointerOpLowering
553579
: public OpConversionPattern<cxx::ArrayToPointerOp> {
554580
public:
@@ -1419,7 +1445,7 @@ void CxxToLLVMLoweringPass::runOnOperation() {
14191445
dataLayout, context);
14201446

14211447
// cast operations
1422-
patterns.insert<IntToBoolOpLowering, BoolToIntOpLowering,
1448+
patterns.insert<IntToBoolOpLowering, PtrToBoolOpLowering, BoolToIntOpLowering,
14231449
IntegralCastOpLowering, ArrayToPointerOpLowering>(
14241450
typeConverter, context);
14251451

0 commit comments

Comments
 (0)