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