diff --git a/flang/test/Fir/convert-to-llvm.fir b/flang/test/Fir/convert-to-llvm.fir --- a/flang/test/Fir/convert-to-llvm.fir +++ b/flang/test/Fir/convert-to-llvm.fir @@ -202,6 +202,43 @@ // CHECK: llvm.call @free([[B2]]) // CHECK: llvm.return + +func @test_with_shape(%ncols: index, %nrows: index) { + %1 = fir.allocmem !fir.array, %ncols, %nrows + fir.freemem %1 : !fir.heap> + return +} + +// CHECK-LABEL: llvm.func @test_with_shape +// CHECK-SAME: %[[NCOLS:.*]]: i64, %[[NROWS:.*]]: i64 +// CHECK: %[[FOUR:.*]] = llvm.mlir.constant(4 : i64) : i64 +// CHECK: %[[DIM1_SIZE:.*]] = llvm.mul %[[FOUR]], %[[NCOLS]] : i64 +// CHECK: %[[TOTAL_SIZE:.*]] = llvm.mul %[[DIM1_SIZE]], %[[NROWS]] : i64 +// CHECK: %[[MEM:.*]] = llvm.call @malloc(%[[TOTAL_SIZE]]) +// CHECK: %[[B1:.*]] = llvm.bitcast %[[MEM]] : !llvm.ptr to !llvm.ptr +// CHECK: %[[B2:.*]] = llvm.bitcast %[[B1]] : !llvm.ptr to !llvm.ptr +// CHECK: llvm.call @free(%[[B2]]) : (!llvm.ptr) -> () +// CHECK: llvm.return +// CHECK: } + +func @test_string_with_shape(%len: index, %nelems: index) { + %1 = fir.allocmem !fir.array>(%len : index), %nelems + fir.freemem %1 : !fir.heap>> + return +} + +// CHECK-LABEL: llvm.func @test_string_with_shape +// CHECK-SAME: %[[LEN:.*]]: i64, %[[NELEMS:.*]]: i64) +// CHECK: %[[ONE:.*]] = llvm.mlir.constant(1 : i64) : i64 +// CHECK: %[[LEN_SIZE:.*]] = llvm.mul %[[ONE]], %[[LEN]] : i64 +// CHECK: %[[TOTAL_SIZE:.*]] = llvm.mul %[[LEN_SIZE]], %[[NELEMS]] : i64 +// CHECK: %[[MEM:.*]] = llvm.call @malloc(%[[TOTAL_SIZE]]) +// CHECK: %[[B1:.*]] = llvm.bitcast %[[MEM]] : !llvm.ptr to !llvm.ptr +// CHECK: %[[B2:.*]] = llvm.bitcast %[[B1]] : !llvm.ptr to !llvm.ptr +// CHECK: llvm.call @free(%[[B2]]) : (!llvm.ptr) -> () +// CHECK: llvm.return +// CHECK: } + // ----- // Verify that fir.unreachable is transformed to llvm.unreachable