brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.5 KiB · 8862a4c Raw
282 lines · plain
1// RUN: fir-opt %s --fir-to-scf --split-input-file | FileCheck %s --check-prefixes=CHECK,NO-PARALLEL2// RUN: fir-opt %s --fir-to-scf='parallel-unordered' --split-input-file | FileCheck %s --check-prefixes=CHECK,PARALLEL3 4// CHECK-LABEL:   func.func @simple_loop(5// CHECK-SAME:      %[[ARG0:.*]]: !fir.ref<!fir.array<100xi32>>) {6// CHECK:           %[[VAL_0:.*]] = arith.constant 1 : index7// CHECK:           %[[VAL_1:.*]] = arith.constant 100 : index8// CHECK:           %[[VAL_2:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1>9// CHECK:           %[[VAL_3:.*]] = arith.constant 1 : i3210// CHECK:           %[[VAL_4:.*]] = arith.subi %[[VAL_1]], %[[VAL_0]] : index11// CHECK:           %[[VAL_5:.*]] = arith.addi %[[VAL_4]], %[[VAL_0]] : index12// CHECK:           %[[VAL_6:.*]] = arith.divsi %[[VAL_5]], %[[VAL_0]] : index13// CHECK:           %[[VAL_7:.*]] = arith.constant 0 : index14// CHECK:           %[[VAL_8:.*]] = arith.constant 1 : index15// CHECK:           scf.for %[[VAL_9:.*]] = %[[VAL_7]] to %[[VAL_6]] step %[[VAL_8]] {16// CHECK:             %[[VAL_10:.*]] = arith.muli %[[VAL_9]], %[[VAL_0]] : index17// CHECK:             %[[VAL_11:.*]] = arith.addi %[[VAL_0]], %[[VAL_10]] : index18// CHECK:             %[[VAL_12:.*]] = fir.array_coor %[[ARG0]](%[[VAL_2]]) %[[VAL_11]] : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>19// CHECK:             fir.store %[[VAL_3]] to %[[VAL_12]] : !fir.ref<i32>20// CHECK:           }21// CHECK:           return22// CHECK:         }23func.func @simple_loop(%arg0: !fir.ref<!fir.array<100xi32>>) {24  %c1 = arith.constant 1 : index25  %c100 = arith.constant 100 : index26  %0 = fir.shape %c100 : (index) -> !fir.shape<1>27  %c1_i32 = arith.constant 1 : i3228  fir.do_loop %arg1 = %c1 to %c100 step %c1 {29    %1 = fir.array_coor %arg0(%0) %arg1 : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>30    fir.store %c1_i32 to %1 : !fir.ref<i32>31  }32  return33}34 35// -----36 37// CHECK-LABEL:   func.func @loop_with_negtive_step(38// CHECK-SAME:      %[[ARG0:.*]]: !fir.ref<!fir.array<100xi32>>) {39// CHECK:           %[[VAL_0:.*]] = arith.constant 100 : index40// CHECK:           %[[VAL_1:.*]] = arith.constant 1 : index41// CHECK:           %[[VAL_2:.*]] = arith.constant -1 : index42// CHECK:           %[[VAL_3:.*]] = fir.shape %[[VAL_0]] : (index) -> !fir.shape<1>43// CHECK:           %[[VAL_4:.*]] = arith.constant 1 : i3244// CHECK:           %[[VAL_5:.*]] = arith.subi %[[VAL_1]], %[[VAL_0]] : index45// CHECK:           %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %[[VAL_2]] : index46// CHECK:           %[[VAL_7:.*]] = arith.divsi %[[VAL_6]], %[[VAL_2]] : index47// CHECK:           %[[VAL_8:.*]] = arith.constant 0 : index48// CHECK:           %[[VAL_9:.*]] = arith.constant 1 : index49// CHECK:           scf.for %[[VAL_10:.*]] = %[[VAL_8]] to %[[VAL_7]] step %[[VAL_9]] {50// CHECK:             %[[VAL_11:.*]] = arith.muli %[[VAL_10]], %[[VAL_2]] : index51// CHECK:             %[[VAL_12:.*]] = arith.addi %[[VAL_0]], %[[VAL_11]] : index52// CHECK:             %[[VAL_13:.*]] = fir.array_coor %[[ARG0]](%[[VAL_3]]) %[[VAL_12]] : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>53// CHECK:             fir.store %[[VAL_4]] to %[[VAL_13]] : !fir.ref<i32>54// CHECK:           }55// CHECK:           return56// CHECK:         }57func.func @loop_with_negtive_step(%arg0: !fir.ref<!fir.array<100xi32>>) {58  %c100 = arith.constant 100 : index59  %c1 = arith.constant 1 : index60  %c-1 = arith.constant -1 : index61  %0 = fir.shape %c100 : (index) -> !fir.shape<1>62  %c1_i32 = arith.constant 1 : i3263  fir.do_loop %arg1 = %c100 to %c1 step %c-1 {64    %1 = fir.array_coor %arg0(%0) %arg1 : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>65    fir.store %c1_i32 to %1 : !fir.ref<i32>66  }67  return68}69 70// -----71 72// CHECK-LABEL:   func.func @loop_with_results(73// CHECK-SAME:      %[[ARG0:.*]]: !fir.ref<!fir.array<100xi32>>,74// CHECK-SAME:      %[[ARG1:.*]]: !fir.ref<i32>) {75// CHECK:           %[[VAL_0:.*]] = arith.constant 1 : index76// CHECK:           %[[VAL_1:.*]] = arith.constant 0 : i3277// CHECK:           %[[VAL_2:.*]] = arith.constant 100 : index78// CHECK:           %[[VAL_3:.*]] = fir.shape %[[VAL_2]] : (index) -> !fir.shape<1>79// CHECK:           %[[VAL_4:.*]] = arith.subi %[[VAL_2]], %[[VAL_0]] : index80// CHECK:           %[[VAL_5:.*]] = arith.addi %[[VAL_4]], %[[VAL_0]] : index81// CHECK:           %[[VAL_6:.*]] = arith.divsi %[[VAL_5]], %[[VAL_0]] : index82// CHECK:           %[[VAL_7:.*]] = arith.constant 0 : index83// CHECK:           %[[VAL_8:.*]] = arith.constant 1 : index84// CHECK:           %[[VAL_9:.*]] = scf.for %[[VAL_10:.*]] = %[[VAL_7]] to %[[VAL_6]] step %[[VAL_8]] iter_args(%[[VAL_11:.*]] = %[[VAL_1]]) -> (i32) {85// CHECK:             %[[VAL_12:.*]] = arith.muli %[[VAL_10]], %[[VAL_0]] : index86// CHECK:             %[[VAL_13:.*]] = arith.addi %[[VAL_0]], %[[VAL_12]] : index87// CHECK:             %[[VAL_14:.*]] = fir.array_coor %[[ARG0]](%[[VAL_3]]) %[[VAL_13]] : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>88// CHECK:             %[[VAL_15:.*]] = fir.load %[[VAL_14]] : !fir.ref<i32>89// CHECK:             %[[VAL_16:.*]] = arith.addi %[[VAL_11]], %[[VAL_15]] : i3290// CHECK:             scf.yield %[[VAL_16]] : i3291// CHECK:           }92// CHECK:           fir.store %[[VAL_9]] to %[[ARG1]] : !fir.ref<i32>93// CHECK:           return94// CHECK:         }95func.func @loop_with_results(%arg0: !fir.ref<!fir.array<100xi32>>, %arg1: !fir.ref<i32>) {96  %c1 = arith.constant 1 : index97  %c0_i32 = arith.constant 0 : i3298  %c100 = arith.constant 100 : index99  %0 = fir.shape %c100 : (index) -> !fir.shape<1>100  %1 = fir.do_loop %arg2 = %c1 to %c100 step %c1 iter_args(%arg3 = %c0_i32) -> (i32) {101    %2 = fir.array_coor %arg0(%0) %arg2 : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>102    %3 = fir.load %2 : !fir.ref<i32>103    %4 = arith.addi %arg3, %3 : i32104    fir.result %4 : i32105  }106  fir.store %1 to %arg1 : !fir.ref<i32>107  return108}109 110// -----111 112// CHECK-LABEL:   func.func @loop_with_final_value(113// CHECK-SAME:      %[[ARG0:.*]]: !fir.ref<!fir.array<100xi32>>,114// CHECK-SAME:      %[[ARG1:.*]]: !fir.ref<i32>) {115// CHECK:           %[[VAL_0:.*]] = arith.constant 1 : index116// CHECK:           %[[VAL_1:.*]] = arith.constant 0 : i32117// CHECK:           %[[VAL_2:.*]] = arith.constant 100 : index118// CHECK:           %[[VAL_3:.*]] = fir.alloca index119// CHECK:           %[[VAL_4:.*]] = fir.shape %[[VAL_2]] : (index) -> !fir.shape<1>120// CHECK:           %[[VAL_5:.*]] = arith.subi %[[VAL_2]], %[[VAL_0]] : index121// CHECK:           %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %[[VAL_0]] : index122// CHECK:           %[[VAL_7:.*]] = arith.divsi %[[VAL_6]], %[[VAL_0]] : index123// CHECK:           %[[VAL_8:.*]] = arith.constant 0 : index124// CHECK:           %[[VAL_9:.*]] = arith.constant 1 : index125// CHECK:           %[[VAL_10:.*]]:2 = scf.for %[[VAL_11:.*]] = %[[VAL_8]] to %[[VAL_7]] step %[[VAL_9]] iter_args(%[[VAL_12:.*]] = %[[VAL_0]], %[[VAL_13:.*]] = %[[VAL_1]]) -> (index, i32) {126// CHECK:             %[[VAL_14:.*]] = arith.muli %[[VAL_11]], %[[VAL_0]] : index127// CHECK:             %[[VAL_15:.*]] = arith.addi %[[VAL_0]], %[[VAL_14]] : index128// CHECK:             %[[VAL_16:.*]] = fir.array_coor %[[ARG0]](%[[VAL_4]]) %[[VAL_15]] : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>129// CHECK:             %[[VAL_17:.*]] = fir.load %[[VAL_16]] : !fir.ref<i32>130// CHECK:             %[[VAL_18:.*]] = arith.addi %[[VAL_15]], %[[VAL_0]] overflow<nsw> : index131// CHECK:             %[[VAL_19:.*]] = arith.addi %[[VAL_13]], %[[VAL_17]] overflow<nsw> : i32132// CHECK:             scf.yield %[[VAL_18]], %[[VAL_19]] : index, i32133// CHECK:           }134// CHECK:           fir.store %[[VAL_20:.*]]#0 to %[[VAL_3]] : !fir.ref<index>135// CHECK:           fir.store %[[VAL_20]]#1 to %[[ARG1]] : !fir.ref<i32>136// CHECK:           return137// CHECK:         }138func.func @loop_with_final_value(%arg0: !fir.ref<!fir.array<100xi32>>, %arg1: !fir.ref<i32>) {139  %c1 = arith.constant 1 : index140  %c0_i32 = arith.constant 0 : i32141  %c100 = arith.constant 100 : index142  %0 = fir.alloca index143  %1 = fir.shape %c100 : (index) -> !fir.shape<1>144  %2:2 = fir.do_loop %arg2 = %c1 to %c100 step %c1 iter_args(%arg3 = %c0_i32) -> (index, i32) {145    %3 = fir.array_coor %arg0(%1) %arg2 : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>146    %4 = fir.load %3 : !fir.ref<i32>147    %5 = arith.addi %arg2, %c1 overflow<nsw> : index148    %6 = arith.addi %arg3, %4 overflow<nsw> : i32149    fir.result %5, %6 : index, i32150  }151  fir.store %2#0 to %0 : !fir.ref<index>152  fir.store %2#1 to %arg1 : !fir.ref<i32>153  return154}155 156// -----157 158// CHECK-LABEL:   func.func @loop_with_unordered_attr(159// CHECK-SAME:      %[[ARG0:.*]]: !fir.ref<!fir.array<100xi32>>) {160// CHECK:           %[[CONSTANT_0:.*]] = arith.constant 1 : index161// CHECK:           %[[CONSTANT_1:.*]] = arith.constant 100 : index162// CHECK:           %[[SHAPE_0:.*]] = fir.shape %[[CONSTANT_1]] : (index) -> !fir.shape<1>163// CHECK:           %[[CONSTANT_2:.*]] = arith.constant 1 : i32164// CHECK:           %[[SUBI_0:.*]] = arith.subi %[[CONSTANT_1]], %[[CONSTANT_0]] : index165// CHECK:           %[[ADDI_0:.*]] = arith.addi %[[SUBI_0]], %[[CONSTANT_0]] : index166// CHECK:           %[[DIVSI_0:.*]] = arith.divsi %[[ADDI_0]], %[[CONSTANT_0]] : index167// CHECK:           %[[CONSTANT_3:.*]] = arith.constant 0 : index168// CHECK:           %[[CONSTANT_4:.*]] = arith.constant 1 : index169// PARALLEL:        scf.parallel (%[[VAL_0:.*]]) = (%[[CONSTANT_3]]) to (%[[DIVSI_0]]) step (%[[CONSTANT_4]]) {170// NO-PARALLEL:     scf.for %[[VAL_0:.*]] = %[[CONSTANT_3]] to %[[DIVSI_0]] step %[[CONSTANT_4]] {171// CHECK:             %[[MULI_0:.*]] = arith.muli %[[VAL_0]], %[[CONSTANT_0]] : index172// CHECK:             %[[ADDI_1:.*]] = arith.addi %[[CONSTANT_0]], %[[MULI_0]] : index173// CHECK:             %[[ARRAY_COOR_0:.*]] = fir.array_coor %[[ARG0]](%[[SHAPE_0]]) %[[ADDI_1]] : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>174// CHECK:             fir.store %[[CONSTANT_2]] to %[[ARRAY_COOR_0]] : !fir.ref<i32>175// PARALLEL:          scf.reduce176// CHECK:           }177// CHECK:           return178// CHECK:         }179func.func @loop_with_unordered_attr(%arg0: !fir.ref<!fir.array<100xi32>>) {180  %c1 = arith.constant 1 : index181  %c100 = arith.constant 100 : index182  %0 = fir.shape %c100 : (index) -> !fir.shape<1>183  %c1_i32 = arith.constant 1 : i32184  fir.do_loop %arg1 = %c1 to %c100 step %c1 unordered {185    %1 = fir.array_coor %arg0(%0) %arg1 : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>186    fir.store %c1_i32 to %1 : !fir.ref<i32>187  }188  return189}190 191// -----192 193// CHECK: #[[$ATTR_0:.+]] = #llvm.loop_vectorize<disable = false>194// CHECK: #[[$ATTR_1:.+]] = #llvm.loop_annotation<vectorize = #[[$ATTR_0]]>195// CHECK-LABEL:   func.func @loop_with_attribute(196// CHECK-SAME:      %[[ARG0:.*]]: !fir.ref<!fir.array<100xi32>>,197// CHECK-SAME:      %[[ARG1:.*]]: !fir.ref<i32>) {198// CHECK:           %[[VAL_0:.*]] = arith.constant 1 : index199// CHECK:           %[[VAL_1:.*]] = arith.constant 0 : i32200// CHECK:           %[[VAL_2:.*]] = arith.constant 100 : index201// CHECK:           %[[VAL_3:.*]] = fir.alloca i32202// CHECK:           %[[VAL_4:.*]] = fir.shape %[[VAL_2]] : (index) -> !fir.shape<1>203// CHECK:           %[[VAL_5:.*]] = arith.subi %[[VAL_2]], %[[VAL_0]] : index204// CHECK:           %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %[[VAL_0]] : index205// CHECK:           %[[VAL_7:.*]] = arith.divsi %[[VAL_6]], %[[VAL_0]] : index206// CHECK:           %[[VAL_8:.*]] = arith.constant 0 : index207// CHECK:           %[[VAL_9:.*]] = arith.constant 1 : index208// CHECK:           scf.for %[[VAL_10:.*]] = %[[VAL_8]] to %[[VAL_7]] step %[[VAL_9]] {209// CHECK:             %[[VAL_11:.*]] = arith.muli %[[VAL_10]], %[[VAL_0]] : index210// CHECK:             %[[VAL_12:.*]] = arith.addi %[[VAL_0]], %[[VAL_11]] : index211// CHECK:             %[[VAL_13:.*]] = fir.array_coor %[[ARG0]](%[[VAL_4]]) %[[VAL_12]] : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>212// CHECK:             %[[VAL_14:.*]] = fir.load %[[VAL_13]] : !fir.ref<i32>213// CHECK:             %[[VAL_15:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>214// CHECK:             %[[VAL_16:.*]] = arith.addi %[[VAL_15]], %[[VAL_14]] : i32215// CHECK:             fir.store %[[VAL_16]] to %[[VAL_3]] : !fir.ref<i32>216// CHECK:           } {loop_annotation = #[[$ATTR_1]]}217// CHECK:           return218// CHECK:         }219 220#loop_vectorize = #llvm.loop_vectorize<disable = false>221#loop_annotation = #llvm.loop_annotation<vectorize = #loop_vectorize>222func.func @loop_with_attribute(%arg0: !fir.ref<!fir.array<100xi32>>, %arg1: !fir.ref<i32>) {223  %c1 = arith.constant 1 : index224  %c0_i32 = arith.constant 0 : i32225  %c100 = arith.constant 100 : index226  %0 = fir.alloca i32227  %1 = fir.shape %c100 : (index) -> !fir.shape<1>228  fir.do_loop %arg2 = %c1 to %c100 step %c1 attributes {loopAnnotation = #loop_annotation} {229    %2 = fir.array_coor %arg0(%1) %arg2 : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, index) -> !fir.ref<i32>230    %3 = fir.load %2 : !fir.ref<i32>231    %4 = fir.load %0 : !fir.ref<i32>232    %5 = arith.addi %4, %3 : i32233    fir.store %5 to %0 : !fir.ref<i32>234    fir.result235  }236  return237}238 239// -----240 241// CHECK-LABEL:   func.func @nested_loop(242// CHECK-SAME:      %[[ARG0:.*]]: !fir.ref<!fir.array<100x100xi32>>) {243// CHECK:           %[[VAL_0:.*]] = arith.constant 1 : index244// CHECK:           %[[VAL_1:.*]] = arith.constant 1 : i32245// CHECK:           %[[VAL_2:.*]] = arith.constant 100 : index246// CHECK:           %[[VAL_3:.*]] = fir.shape %[[VAL_2]], %[[VAL_2]] : (index, index) -> !fir.shape<2>247// CHECK:           %[[VAL_4:.*]] = arith.subi %[[VAL_2]], %[[VAL_0]] : index248// CHECK:           %[[VAL_5:.*]] = arith.addi %[[VAL_4]], %[[VAL_0]] : index249// CHECK:           %[[VAL_6:.*]] = arith.divsi %[[VAL_5]], %[[VAL_0]] : index250// CHECK:           %[[VAL_7:.*]] = arith.constant 0 : index251// CHECK:           %[[VAL_8:.*]] = arith.constant 1 : index252// CHECK:           scf.for %[[VAL_9:.*]] = %[[VAL_7]] to %[[VAL_6]] step %[[VAL_8]] {253// CHECK:             %[[VAL_10:.*]] = arith.muli %[[VAL_9]], %[[VAL_0]] : index254// CHECK:             %[[VAL_11:.*]] = arith.addi %[[VAL_0]], %[[VAL_10]] : index255// CHECK:             %[[VAL_12:.*]] = arith.subi %[[VAL_2]], %[[VAL_0]] : index256// CHECK:             %[[VAL_13:.*]] = arith.addi %[[VAL_12]], %[[VAL_0]] : index257// CHECK:             %[[VAL_14:.*]] = arith.divsi %[[VAL_13]], %[[VAL_0]] : index258// CHECK:             %[[VAL_15:.*]] = arith.constant 0 : index259// CHECK:             %[[VAL_16:.*]] = arith.constant 1 : index260// CHECK:             scf.for %[[VAL_17:.*]] = %[[VAL_15]] to %[[VAL_14]] step %[[VAL_16]] {261// CHECK:               %[[VAL_18:.*]] = arith.muli %[[VAL_17]], %[[VAL_0]] : index262// CHECK:               %[[VAL_19:.*]] = arith.addi %[[VAL_0]], %[[VAL_18]] : index263// CHECK:               %[[VAL_20:.*]] = fir.array_coor %[[ARG0]](%[[VAL_3]]) %[[VAL_19]], %[[VAL_11]] : (!fir.ref<!fir.array<100x100xi32>>, !fir.shape<2>, index, index) -> !fir.ref<i32>264// CHECK:               fir.store %[[VAL_1]] to %[[VAL_20]] : !fir.ref<i32>265// CHECK:             }266// CHECK:           }267// CHECK:           return268// CHECK:         }269func.func @nested_loop(%arg0: !fir.ref<!fir.array<100x100xi32>>) {270  %c1 = arith.constant 1 : index271  %c1_i32 = arith.constant 1 : i32272  %c100 = arith.constant 100 : index273  %0 = fir.shape %c100, %c100 : (index, index) -> !fir.shape<2>274  fir.do_loop %arg1 = %c1 to %c100 step %c1 {275    fir.do_loop %arg2 = %c1 to %c100 step %c1 {276      %1 = fir.array_coor %arg0(%0) %arg2, %arg1 : (!fir.ref<!fir.array<100x100xi32>>, !fir.shape<2>, index, index) -> !fir.ref<i32>277      fir.store %c1_i32 to %1 : !fir.ref<i32>278    }279  }280  return281}282