Skip to content

Commit 6d340e4

Browse files
authored
[flang] fixing alloca hoisting for blocks having single op. (#96009)
This change fixes the issue #95977 due to commit c0cba51 inserting allocas after the terminator op in the insertion block in the case where the block had only a single operation, its terminator, in it. With this change, the hoisted constant-sized allocas are placed at the front of the insertion block, rather than right after the first operation in it.
1 parent 89e8e63 commit 6d340e4

File tree

3 files changed

+10
-7
lines changed

3 files changed

+10
-7
lines changed

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ struct AllocaOpConversion : public fir::FIROpConversion<fir::AllocaOp> {
255255
mlir::Region *parentRegion = rewriter.getInsertionBlock()->getParent();
256256
mlir::Block *insertBlock =
257257
getBlockForAllocaInsert(parentOp, parentRegion);
258-
size.getDefiningOp()->moveAfter(insertBlock, insertBlock->begin());
258+
size.getDefiningOp()->moveBefore(&insertBlock->front());
259259
rewriter.setInsertionPointAfter(size.getDefiningOp());
260260
}
261261

flang/test/Fir/convert-to-llvm-openmp-and-fir.fir

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ func.func @_QPsb1(%arg0: !fir.ref<i32> {fir.bindc_name = "n"}, %arg1: !fir.ref<!
2626

2727
// CHECK-LABEL: _QPsb1
2828
// CHECK-SAME: %[[N_REF:.*]]: !llvm.ptr {fir.bindc_name = "n"}, %[[ARR_REF:.*]]: !llvm.ptr {fir.bindc_name = "arr"}) {
29+
// CHECK: %[[ONE_0:.*]] = llvm.mlir.constant(1 : i64) : i64
2930
// CHECK: %[[ONE_1:.*]] = llvm.mlir.constant(1 : i64) : i64
3031
// CHECK: %[[ONE_2:.*]] = llvm.mlir.constant(1 : i32) : i32
3132
// CHECK: omp.parallel {
@@ -207,6 +208,7 @@ func.func @_QPsimd1(%arg0: !fir.ref<i32> {fir.bindc_name = "n"}, %arg1: !fir.ref
207208

208209
// CHECK-LABEL: _QPsimd1
209210
// CHECK-SAME: %[[N_REF:.*]]: !llvm.ptr {fir.bindc_name = "n"}, %[[ARR_REF:.*]]: !llvm.ptr {fir.bindc_name = "arr"}) {
211+
// CHECK: %[[ONE_0:.*]] = llvm.mlir.constant(1 : i64) : i64
210212
// CHECK: %[[ONE_1:.*]] = llvm.mlir.constant(1 : i64) : i64
211213
// CHECK: %[[ONE_2:.*]] = llvm.mlir.constant(1 : i32) : i32
212214
// CHECK: omp.parallel {
@@ -281,7 +283,6 @@ func.func @_QPomp_target_data() {
281283
}
282284

283285
// CHECK-LABEL: llvm.func @_QPomp_target_data() {
284-
// CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(1024 : index) : i64
285286
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(1 : i64) : i64
286287
// CHECK: %[[VAL_2:.*]] = llvm.alloca %[[VAL_1]] x !llvm.array<1024 x i32> {bindc_name = "d"} : (i64) -> !llvm.ptr
287288
// CHECK: %[[VAL_3:.*]] = llvm.mlir.constant(1 : i64) : i64
@@ -290,6 +291,7 @@ func.func @_QPomp_target_data() {
290291
// CHECK: %[[VAL_6:.*]] = llvm.alloca %[[VAL_5]] x !llvm.array<1024 x i32> {bindc_name = "b"} : (i64) -> !llvm.ptr
291292
// CHECK: %[[VAL_7:.*]] = llvm.mlir.constant(1 : i64) : i64
292293
// CHECK: %[[VAL_8:.*]] = llvm.alloca %[[VAL_7]] x !llvm.array<1024 x i32> {bindc_name = "a"} : (i64) -> !llvm.ptr
294+
// CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(1024 : index) : i64
293295
// CHECK: %[[VAL_9:.*]] = llvm.mlir.constant(1024 : index) : i64
294296
// CHECK: %[[VAL_10:.*]] = llvm.mlir.constant(1024 : index) : i64
295297
// CHECK: %[[VAL_11:.*]] = llvm.mlir.constant(1024 : index) : i64
@@ -373,9 +375,9 @@ func.func @_QPopenmp_target_data_region() {
373375
}
374376

375377
// CHECK-LABEL: llvm.func @_QPopenmp_target_data_region() {
376-
// CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(1 : i64) : i64
377378
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i64) : i64
378379
// CHECK: %[[VAL_3:.*]] = llvm.alloca %[[VAL_2]] x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr
380+
// CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(1 : i64) : i64
379381
// CHECK: %[[VAL_1:.*]] = llvm.alloca %[[VAL_0]] x !llvm.array<1024 x i32> {bindc_name = "a"} : (i64) -> !llvm.ptr
380382
// CHECK: %[[VAL_MAX:.*]] = llvm.mlir.constant(1024 : index) : i64
381383
// CHECK: %[[VAL_ONE:.*]] = llvm.mlir.constant(1 : index) : i64
@@ -459,15 +461,15 @@ func.func @_QPomp_target() {
459461
}
460462

461463
// CHECK-LABEL: llvm.func @_QPomp_target() {
462-
// CHECK: %[[EXTENT:.*]] = llvm.mlir.constant(512 : index) : i64
463464
// CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(1 : i64) : i64
464465
// CHECK: %[[VAL_1:.*]] = llvm.alloca %[[VAL_0]] x !llvm.array<512 x i32> {bindc_name = "a"} : (i64) -> !llvm.ptr
466+
// CHECK: %[[EXTENT:.*]] = llvm.mlir.constant(512 : index) : i64
465467
// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(64 : i32) : i32
466468
// CHECK: %[[STRIDE:.*]] = llvm.mlir.constant(1 : index) : i64
467469
// CHECK: %[[LOWER:.*]] = llvm.mlir.constant(0 : index) : i64
468470
// CHECK: %[[UPPER:.*]] = llvm.mlir.constant(511 : index) : i64
469471
// CHECK: %[[BOUNDS:.*]] = omp.map.bounds lower_bound(%[[LOWER]] : i64) upper_bound(%[[UPPER]] : i64) extent(%[[EXTENT]] : i64) stride(%[[STRIDE]] : i64) start_idx(%[[STRIDE]] : i64)
470-
// CHECK: %[[MAP:.*]] = omp.map.info var_ptr(%2 : !llvm.ptr, !llvm.array<512 x i32>) map_clauses(tofrom) capture(ByRef) bounds(%[[BOUNDS]]) -> !llvm.ptr {name = "a"}
472+
// CHECK: %[[MAP:.*]] = omp.map.info var_ptr(%[[VAL_1]] : !llvm.ptr, !llvm.array<512 x i32>) map_clauses(tofrom) capture(ByRef) bounds(%[[BOUNDS]]) -> !llvm.ptr {name = "a"}
471473
// CHECK: omp.target thread_limit(%[[VAL_2]] : i32) map_entries(%[[MAP]] -> %[[ARG_0:.*]] : !llvm.ptr) {
472474
// CHECK: ^bb0(%[[ARG_0]]: !llvm.ptr):
473475
// CHECK: %[[VAL_3:.*]] = llvm.mlir.constant(10 : i32) : i32
@@ -715,7 +717,8 @@ func.func @_QPsb() {
715717
// CHECK: }
716718
// CHECK-LABEL: @_QPsimple_reduction
717719
// CHECK-SAME: %[[ARRAY_REF:.*]]: !llvm.ptr
718-
// CHECK: %[[RED_ACCUMULATOR:.*]] = llvm.alloca %1 x i32 {bindc_name = "x"} : (i64) -> !llvm.ptr
720+
// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(1 : i64) : i64
721+
// CHECK: %[[RED_ACCUMULATOR:.*]] = llvm.alloca %[[VAL_1]] x i32 {bindc_name = "x"} : (i64) -> !llvm.ptr
719722
// CHECK: omp.parallel {
720723
// CHECK: omp.wsloop reduction(@[[EQV_REDUCTION]] %[[RED_ACCUMULATOR]] -> %[[PRV:.+]] : !llvm.ptr) {
721724
// CHECK-NEXT: omp.loop_nest

flang/test/Fir/convert-to-llvm.fir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2047,7 +2047,6 @@ func.func private @_QPtest_dt_callee(%arg0: !fir.box<!fir.array<?xi32>>)
20472047
// GENERIC: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_SIZE]] x !llvm.struct<(ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)> {alignment = 8 : i64} : (i32) -> !llvm.ptr
20482048
// AMDGPU: %[[AA:.*]] = llvm.alloca %[[ALLOCA_SIZE]] x !llvm.struct<(ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)> {alignment = 8 : i64} : (i32) -> !llvm.ptr<5>
20492049
// AMDGPU: %[[ALLOCA:.*]] = llvm.addrspacecast %[[AA]] : !llvm.ptr<5> to !llvm.ptr
2050-
// CHECK: %[[C20:.*]] = llvm.mlir.constant(20 : index) : i64
20512050
// CHECK: %[[ALLOCA_SIZE_X:.*]] = llvm.mlir.constant(1 : i64) : i64
20522051
// GENERIC: %[[X:.*]] = llvm.alloca %[[ALLOCA_SIZE_X]] x !llvm.array<20 x struct<"_QFtest_dt_sliceTt", (i32, i32)>> {bindc_name = "x"} : (i64) -> !llvm.ptr
20532052
// AMDGPU: %[[AC:.*]] = llvm.alloca %[[ALLOCA_SIZE_X]] x !llvm.array<20 x struct<"_QFtest_dt_sliceTt", (i32, i32)>> {bindc_name = "x"} : (i64) -> !llvm.ptr<5>
@@ -2056,6 +2055,7 @@ func.func private @_QPtest_dt_callee(%arg0: !fir.box<!fir.array<?xi32>>)
20562055
// GENERIC: %[[V:.*]] = llvm.alloca %[[ALLOCA_SIZE_V]] x i32 {bindc_name = "v"} : (i64) -> !llvm.ptr
20572056
// AMDGPU: %[[AB:.*]] = llvm.alloca %[[ALLOCA_SIZE_V]] x i32 {bindc_name = "v"} : (i64) -> !llvm.ptr<5>
20582057
// AMDGPU: %[[V:.*]] = llvm.addrspacecast %[[AB]] : !llvm.ptr<5> to !llvm.ptr
2058+
// CHECK: %[[C20:.*]] = llvm.mlir.constant(20 : index) : i64
20592059
// CHECK: %[[C1:.*]] = llvm.mlir.constant(1 : i64) : i64
20602060
// CHECK: %[[C10:.*]] = llvm.mlir.constant(10 : i64) : i64
20612061
// CHECK: %[[C2:.*]] = llvm.mlir.constant(2 : i64) : i64

0 commit comments

Comments
 (0)