diff --git a/lib/Conversion/MooreToCore/MooreToCore.cpp b/lib/Conversion/MooreToCore/MooreToCore.cpp index 124f82a77730..fa428d8c29d5 100644 --- a/lib/Conversion/MooreToCore/MooreToCore.cpp +++ b/lib/Conversion/MooreToCore/MooreToCore.cpp @@ -1214,13 +1214,15 @@ struct DynExtractOpConversion : public OpConversionPattern { Value idx = adjustIntegerWidth(rewriter, adaptor.getLowBit(), idxWidth, op->getLoc()); - if (isa(resultType)) { + bool isSingleElementExtract = arrType.getElementType() == resultType; + + if (isSingleElementExtract) + rewriter.replaceOpWithNewOp(op, adaptor.getInput(), + idx); + else rewriter.replaceOpWithNewOp(op, resultType, adaptor.getInput(), idx); - return success(); - } - rewriter.replaceOpWithNewOp(op, adaptor.getInput(), idx); return success(); } @@ -1257,14 +1259,17 @@ struct DynExtractRefOpConversion : public OpConversionPattern { rewriter, adaptor.getLowBit(), llvm::Log2_64_Ceil(arrType.getNumElements()), op->getLoc()); - if (isa(cast(resultType).getNestedType())) { + auto resultNestedType = cast(resultType).getNestedType(); + bool isSingleElementExtract = + arrType.getElementType() == resultNestedType; + + if (isSingleElementExtract) + rewriter.replaceOpWithNewOp(op, adaptor.getInput(), + idx); + else rewriter.replaceOpWithNewOp( op, resultType, adaptor.getInput(), idx); - return success(); - } - rewriter.replaceOpWithNewOp(op, adaptor.getInput(), - idx); return success(); } diff --git a/test/Conversion/MooreToCore/basic.mlir b/test/Conversion/MooreToCore/basic.mlir index 30220fdfe849..ece0c50fbb7d 100644 --- a/test/Conversion/MooreToCore/basic.mlir +++ b/test/Conversion/MooreToCore/basic.mlir @@ -345,6 +345,20 @@ func.func @ExtractRefArrayElement(%j: !moore.ref>>) -> ( return %0 : !moore.ref> } +// CHECK-LABEL: DynExtractArrayElement +func.func @DynExtractArrayElement(%j: !moore.array<2 x array<1 x l3>>, %idx: !moore.l1) -> (!moore.array<1 x l3>) { + // CHECK: hw.array_get + %0 = moore.dyn_extract %j from %idx : !moore.array<2 x array<1 x l3>>, !moore.l1 -> !moore.array<1 x l3> + return %0 : !moore.array<1 x l3> +} + +// CHECK-LABEL: DynExtractRefArrayElement +func.func @DynExtractRefArrayElement(%j: !moore.ref>>, %idx: !moore.l1) -> (!moore.ref>) { + // CHECK: llhd.sig.array_get + %0 = moore.dyn_extract_ref %j from %idx : >>, !moore.l1 -> > + return %0 : !moore.ref> +} + // CHECK-LABEL: func @AdvancedConversion func.func @AdvancedConversion(%arg0: !moore.array<5 x struct<{exp_bits: i32, man_bits: i32}>>) -> (!moore.array<5 x struct<{exp_bits: i32, man_bits: i32}>>, !moore.i320) { // CHECK: [[V0:%.+]] = hw.constant 3978585893941511189997889893581765703992223160870725712510875979948892565035285336817671 : i320