brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.0 KiB · 2addb6b Raw
162 lines · plain
1// Test memory allocation pass for fir.alloca outside of function entry block2// RUN: fir-opt --memory-allocation-opt="dynamic-array-on-heap=true" %s | FileCheck %s3 4func.func @test_loop() {5  %c1 = arith.constant 1 : index6  %c100 = arith.constant 100 : index7  fir.do_loop %arg0 = %c1 to %c100 step %c1 {8    %1 = fir.alloca !fir.array<?xf32>, %arg09    fir.call @bar(%1) : (!fir.ref<!fir.array<?xf32>>) -> ()10    fir.result11  }12  return13}14// CHECK-LABEL:   func.func @test_loop() {15// CHECK:           %[[VAL_0:.*]] = arith.constant 1 : index16// CHECK:           %[[VAL_1:.*]] = arith.constant 100 : index17// CHECK:           fir.do_loop %[[VAL_2:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_0]] {18// CHECK:             %[[VAL_3:.*]] = fir.allocmem !fir.array<?xf32>, %[[VAL_2]] {bindc_name = "", uniq_name = ""}19// CHECK:             %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (!fir.heap<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>20// CHECK:             fir.call @bar(%[[VAL_4]]) : (!fir.ref<!fir.array<?xf32>>) -> ()21// CHECK:             fir.freemem %[[VAL_3]] : !fir.heap<!fir.array<?xf32>>22// CHECK:           }23// CHECK:           return24// CHECK:         }25 26func.func @test_unstructured(%n : index) {27  %c0 = arith.constant 0 : index28  %c1 = arith.constant 1 : index29  %c100 = arith.constant 100 : index30  %0 = fir.alloca index31  fir.store %c100 to %0 : !fir.ref<index>32  cf.br ^bb133^bb1:  // 2 preds: ^bb0, ^bb434  %5 = fir.load %0 : !fir.ref<index>35  %6 = arith.cmpi sgt, %5, %c0 : index36  cf.cond_br %6, ^bb2, ^bb537^bb2:  // pred: ^bb138  %1 = fir.alloca !fir.array<?xf32>, %539  fir.call @bar(%1) : (!fir.ref<!fir.array<?xf32>>) -> ()40  %25 = arith.cmpi slt, %5, %n : index41  cf.cond_br %25, ^bb3, ^bb442^bb3:  // pred: ^bb243  fir.call @abort() : () -> ()44  fir.unreachable45^bb4:  // pred: ^bb246  %28 = arith.subi %5, %c1 : index47  fir.store %28 to %0 : !fir.ref<index>48  cf.br ^bb149^bb5:  // pred: ^bb150  return51}52// CHECK-LABEL:   func.func @test_unstructured(53// CHECK-SAME:                                 %[[VAL_0:.*]]: index) {54// CHECK:           %[[VAL_1:.*]] = fir.alloca !fir.heap<!fir.array<?xf32>>55// CHECK:           %[[VAL_2:.*]] = fir.zero_bits !fir.heap<!fir.array<?xf32>>56// CHECK:           fir.store %[[VAL_2]] to %[[VAL_1]] : !fir.ref<!fir.heap<!fir.array<?xf32>>>57// CHECK:           %[[VAL_3:.*]] = arith.constant 0 : i6458// CHECK:           %[[VAL_4:.*]] = arith.constant 0 : index59// CHECK:           %[[VAL_5:.*]] = arith.constant 1 : index60// CHECK:           %[[VAL_6:.*]] = arith.constant 100 : index61// CHECK:           %[[VAL_7:.*]] = fir.alloca index62// CHECK:           fir.store %[[VAL_6]] to %[[VAL_7]] : !fir.ref<index>63// CHECK:           cf.br ^bb164// CHECK:         ^bb1:65// CHECK:           %[[VAL_8:.*]] = fir.load %[[VAL_7]] : !fir.ref<index>66// CHECK:           %[[VAL_9:.*]] = arith.cmpi sgt, %[[VAL_8]], %[[VAL_4]] : index67// CHECK:           cf.cond_br %[[VAL_9]], ^bb2, ^bb568// CHECK:         ^bb2:69// CHECK:           %[[VAL_10:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.heap<!fir.array<?xf32>>>70// CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (!fir.heap<!fir.array<?xf32>>) -> i6471// CHECK:           %[[VAL_12:.*]] = arith.cmpi ne, %[[VAL_11]], %[[VAL_3]] : i6472// CHECK:           fir.if %[[VAL_12]] {73// CHECK:             fir.freemem %[[VAL_10]] : !fir.heap<!fir.array<?xf32>>74// CHECK:           }75// CHECK:           %[[VAL_13:.*]] = fir.allocmem !fir.array<?xf32>, %[[VAL_8]] {bindc_name = "", uniq_name = ""}76// CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (!fir.heap<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>77// CHECK:           fir.store %[[VAL_13]] to %[[VAL_1]] : !fir.ref<!fir.heap<!fir.array<?xf32>>>78// CHECK:           fir.call @bar(%[[VAL_14]]) : (!fir.ref<!fir.array<?xf32>>) -> ()79// CHECK:           %[[VAL_15:.*]] = arith.cmpi slt, %[[VAL_8]], %[[VAL_0]] : index80// CHECK:           cf.cond_br %[[VAL_15]], ^bb3, ^bb481// CHECK:         ^bb3:82// CHECK:           fir.call @abort() : () -> ()83// CHECK:           %[[VAL_16:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.heap<!fir.array<?xf32>>>84// CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (!fir.heap<!fir.array<?xf32>>) -> i6485// CHECK:           %[[VAL_18:.*]] = arith.cmpi ne, %[[VAL_17]], %[[VAL_3]] : i6486// CHECK:           fir.if %[[VAL_18]] {87// CHECK:             fir.freemem %[[VAL_16]] : !fir.heap<!fir.array<?xf32>>88// CHECK:           }89// CHECK:           fir.unreachable90// CHECK:         ^bb4:91// CHECK:           %[[VAL_19:.*]] = arith.subi %[[VAL_8]], %[[VAL_5]] : index92// CHECK:           fir.store %[[VAL_19]] to %[[VAL_7]] : !fir.ref<index>93// CHECK:           cf.br ^bb194// CHECK:         ^bb5:95// CHECK:           %[[VAL_20:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.heap<!fir.array<?xf32>>>96// CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.heap<!fir.array<?xf32>>) -> i6497// CHECK:           %[[VAL_22:.*]] = arith.cmpi ne, %[[VAL_21]], %[[VAL_3]] : i6498// CHECK:           fir.if %[[VAL_22]] {99// CHECK:             fir.freemem %[[VAL_20]] : !fir.heap<!fir.array<?xf32>>100// CHECK:           }101// CHECK:           return102// CHECK:         }103 104func.func @alloca_dominate_return_in_cycle(%arg0: index) {105  %0 = fir.alloca index106  %c1 = arith.constant 1 : index107  fir.store %c1 to %0 : !fir.ref<index>108  cf.br ^bb1109^bb1:  // 2 preds: ^bb0, ^bb2110  %1 = fir.load %0 : !fir.ref<index>111  %2 = fir.alloca !fir.array<?xf32>, %1112  fir.call @bar(%2) : (!fir.ref<!fir.array<?xf32>>) -> ()113  %3 = arith.addi %1, %c1 : index114  fir.store %3 to %0 : !fir.ref<index>115  %4 = arith.cmpi slt, %3, %arg0 : index116  cf.cond_br %4, ^bb2, ^bb3117^bb2:  // pred: ^bb1118  cf.br ^bb1119^bb3:  // pred: ^bb1120  return121}122// CHECK-LABEL:   func.func @alloca_dominate_return_in_cycle(123// CHECK-SAME:                                               %[[VAL_0:.*]]: index) {124// CHECK:           %[[VAL_1:.*]] = fir.alloca !fir.heap<!fir.array<?xf32>>125// CHECK:           %[[VAL_2:.*]] = fir.zero_bits !fir.heap<!fir.array<?xf32>>126// CHECK:           fir.store %[[VAL_2]] to %[[VAL_1]] : !fir.ref<!fir.heap<!fir.array<?xf32>>>127// CHECK:           %[[VAL_3:.*]] = arith.constant 0 : i64128// CHECK:           %[[VAL_4:.*]] = fir.alloca index129// CHECK:           %[[VAL_5:.*]] = arith.constant 1 : index130// CHECK:           fir.store %[[VAL_5]] to %[[VAL_4]] : !fir.ref<index>131// CHECK:           cf.br ^bb1132// CHECK:         ^bb1:133// CHECK:           %[[VAL_6:.*]] = fir.load %[[VAL_4]] : !fir.ref<index>134// CHECK:           %[[VAL_7:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.heap<!fir.array<?xf32>>>135// CHECK:           %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (!fir.heap<!fir.array<?xf32>>) -> i64136// CHECK:           %[[VAL_9:.*]] = arith.cmpi ne, %[[VAL_8]], %[[VAL_3]] : i64137// CHECK:           fir.if %[[VAL_9]] {138// CHECK:             fir.freemem %[[VAL_7]] : !fir.heap<!fir.array<?xf32>>139// CHECK:           }140// CHECK:           %[[VAL_10:.*]] = fir.allocmem !fir.array<?xf32>, %[[VAL_6]] {bindc_name = "", uniq_name = ""}141// CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (!fir.heap<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>142// CHECK:           fir.store %[[VAL_10]] to %[[VAL_1]] : !fir.ref<!fir.heap<!fir.array<?xf32>>>143// CHECK:           fir.call @bar(%[[VAL_11]]) : (!fir.ref<!fir.array<?xf32>>) -> ()144// CHECK:           %[[VAL_12:.*]] = arith.addi %[[VAL_6]], %[[VAL_5]] : index145// CHECK:           fir.store %[[VAL_12]] to %[[VAL_4]] : !fir.ref<index>146// CHECK:           %[[VAL_13:.*]] = arith.cmpi slt, %[[VAL_12]], %[[VAL_0]] : index147// CHECK:           cf.cond_br %[[VAL_13]], ^bb2, ^bb3148// CHECK:         ^bb2:149// CHECK:           cf.br ^bb1150// CHECK:         ^bb3:151// CHECK:           %[[VAL_14:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.heap<!fir.array<?xf32>>>152// CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (!fir.heap<!fir.array<?xf32>>) -> i64153// CHECK:           %[[VAL_16:.*]] = arith.cmpi ne, %[[VAL_15]], %[[VAL_3]] : i64154// CHECK:           fir.if %[[VAL_16]] {155// CHECK:             fir.freemem %[[VAL_14]] : !fir.heap<!fir.array<?xf32>>156// CHECK:           }157// CHECK:           return158// CHECK:         }159 160func.func private @bar(!fir.ref<!fir.array<?xf32>>)161func.func private @abort()162