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,58 @@ // CHECK: llvm.call @free([[B2]]) // CHECK: llvm.return + +func @test_with_shape(%arg0: !fir.ref, %arg1: !fir.ref) { + %0 = fir.load %arg0 : !fir.ref + %1 = fir.convert %0 : (i32) -> index + %2 = fir.load %arg1 : !fir.ref + %3 = fir.convert %2 : (i32) -> index + %4 = fir.allocmem !fir.array, %1, %3 {bindc_name = "aa", uniq_name = "_QFss2Eaa"} + fir.freemem %4 : !fir.heap> + return +} + +// CHECK-LABEL: llvm.func @test_with_shape +// CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr, %[[ARG1:.*]]: !llvm.ptr +// CHECK: %[[M:.*]] = llvm.load %[[ARG0]] : !llvm.ptr +// CHECK: %[[M_EXT:.*]] = llvm.sext %[[M]] : i32 to i64 +// CHECK: %[[N:.*]] = llvm.load %[[ARG1]] : !llvm.ptr +// CHECK: %[[N_EXT:.*]] = llvm.sext %[[N]] : i32 to i64 +// CHECK: %[[FOUR:.*]] = llvm.mlir.constant(4 : i64) : i64 +// CHECK: %[[DIM1_SIZE:.*]] = llvm.mul %[[FOUR]], %[[M_EXT]] : i64 +// CHECK: %[[TOTAL_SIZE:.*]] = llvm.mul %[[DIM1_SIZE]], %[[N_EXT]] : i64 +// CHECK: %[[MEM:.*]] = llvm.call @malloc(%[[TOTAL_SIZE]]) {{.*}}bindc_name = "aa" +// 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(%arg0: !fir.ref, %arg1: !fir.ref) { + %0 = fir.load %arg0 : !fir.ref + %3 = fir.load %arg1 : !fir.ref + %4 = fir.convert %3 : (i32) -> index + %6 = fir.allocmem !fir.array>(%0 : i32), %4 {bindc_name = "s", uniq_name = "_QFsbEs"} + fir.freemem %6 : !fir.heap>> + return +} + +// CHECK-LABEL: llvm.func @test_string_with_shape +// CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr, %[[ARG1:.*]]: !llvm.ptr) +// CHECK: %[[LEN:.*]] = llvm.load %[[ARG0]] : !llvm.ptr +// CHECK: %[[N:.*]] = llvm.load %[[ARG1]] : !llvm.ptr +// CHECK: %[[N_EXT:.*]] = llvm.sext %[[N]] : i32 to i64 +// CHECK: %[[ONE:.*]] = llvm.mlir.constant(1 : i64) : i64 +// CHECK: %[[LEN_EXT:.*]] = llvm.sext %[[LEN]] : i32 to i64 +// CHECK: %[[LEN_SIZE:.*]] = llvm.mul %[[ONE]], %[[LEN_EXT]] : i64 +// CHECK: %[[TOTAL_SIZE:.*]] = llvm.mul %[[LEN_SIZE]], %[[N_EXT]] : i64 +// CHECK: %[[MEM:.*]] = llvm.call @malloc(%6) {{.*}}bindc_name = "s" +// 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