Skip to content

Commit 5f24814

Browse files
committed
[MooreToCore] Add support for lowering moore.class.upcast
- Added `ClassUpcastOpConversion` lowering: - Converts `moore.class.upcast` to a direct value forward when both source and destination are LLVM opaque pointers (`!llvm.ptr`). - Emits a diagnostic if applied to non-opaque pointer types. - Registered the new pattern in `populateOpConversion` alongside other class conversion patterns.
1 parent 527e76d commit 5f24814

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

lib/Conversion/MooreToCore/MooreToCore.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,29 @@ static Value createZeroValue(Type type, Location loc,
707707
return rewriter.createOrFold<hw::BitcastOp>(loc, type, constZero);
708708
}
709709

710+
struct ClassUpcastOpConversion : public OpConversionPattern<ClassUpcastOp> {
711+
using OpConversionPattern::OpConversionPattern;
712+
713+
LogicalResult
714+
matchAndRewrite(ClassUpcastOp op, OpAdaptor adaptor,
715+
ConversionPatternRewriter &rewriter) const override {
716+
// Expect lowered types like !llvm.ptr
717+
Type dstTy = getTypeConverter()->convertType(op.getResult().getType());
718+
Type srcTy = adaptor.getInstance().getType();
719+
720+
if (!dstTy)
721+
return rewriter.notifyMatchFailure(op, "failed to convert result type");
722+
723+
// If the types are already identical (opaque pointer mode), just forward.
724+
if (dstTy == srcTy && isa<LLVM::LLVMPointerType>(srcTy)) {
725+
rewriter.replaceOp(op, adaptor.getInstance());
726+
return success();
727+
}
728+
return rewriter.notifyMatchFailure(
729+
op, "Upcast applied to non-opaque pointers!");
730+
}
731+
};
732+
710733
/// moore.class.new lowering: heap-allocate storage for the class object.
711734
struct ClassNewOpConversion : public OpConversionPattern<ClassNewOp> {
712735
ClassNewOpConversion(TypeConverter &tc, MLIRContext *ctx,
@@ -2156,6 +2179,7 @@ static void populateOpConversion(ConversionPatternSet &patterns,
21562179
classCache);
21572180
// clang-format off
21582181
patterns.add<
2182+
ClassUpcastOpConversion,
21592183
// Patterns of declaration operations.
21602184
VariableOpConversion,
21612185
NetOpConversion,

test/Conversion/MooreToCore/classes.mlir

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,23 @@ moore.class.classdecl @E extends @C {
8080
moore.class.propertydecl @b : !moore.l32
8181
moore.class.propertydecl @c : !moore.l32
8282
}
83+
84+
/// Check that upcast lowers to no-op
85+
86+
// CHECK-LABEL: func.func private @test_new5
87+
// CHECK-SAME: (%arg0: !llvm.ptr) {
88+
// CHECK: return
89+
90+
// CHECK-NOT: moore.class.new
91+
// CHECK-NOT: moore.class.upcast
92+
// CHECK-NOT: moore.class.classdecl
93+
94+
func.func private @test_new5(%arg0: !moore.class<@F>) {
95+
%upcast = moore.class.upcast %arg0 : <@F> to <@C>
96+
return
97+
}
98+
moore.class.classdecl @F extends @C {
99+
moore.class.propertydecl @a : !moore.i32
100+
moore.class.propertydecl @b : !moore.l32
101+
moore.class.propertydecl @c : !moore.l32
102+
}

0 commit comments

Comments
 (0)