[LLVM] Fix Maintainers.md formatting (NFC)
[llvm-project.git] / flang / test / HLFIR / forall.fir
blob2ae91deafcacde24d1048b7c87437ba8a789fe8b
1 // Test hlfir.forall operation parse, verify (no errors), and unparse.
2 // RUN: fir-opt %s | fir-opt | FileCheck %s
4 func.func @forall_test(%x: !fir.box<!fir.array<?xf32>>, %x2: !fir.box<!fir.array<?x?xf32>>) {
5   %c1 = arith.constant 1 : index
6   %c10 = arith.constant 10 : index
7   hlfir.forall lb {
8     hlfir.yield %c1 : index
9   } ub {
10     hlfir.yield %c10 : index
11   } (%i : index) {
12     hlfir.region_assign {
13       %res = fir.call @foo(%i) : (index) -> f32
14       hlfir.yield %res : f32
15     } to {
16       %xi = hlfir.designate %x(%i) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32>
17       hlfir.yield %xi : !fir.ref<f32>
18     }
19     hlfir.forall lb {
20       hlfir.yield %c1 : index
21     } ub {
22       hlfir.yield %c10 : index
23     } (%j : index) {
24       hlfir.region_assign {
25         %jf = fir.convert %j : (index) -> f32
26         hlfir.yield %jf : f32
27       } to {
28         %xij = hlfir.designate %x2(%i, %j) : (!fir.box<!fir.array<?x?xf32>>, index, index) -> !fir.ref<f32>
29         hlfir.yield %xij : !fir.ref<f32>
30       }
31     }
32   }
33   return
35 // CHECK-LABEL:   func.func @forall_test(
36 // CHECK-SAME:                           %[[VAL_0:.*]]: !fir.box<!fir.array<?xf32>>,
37 // CHECK-SAME:                           %[[VAL_1:.*]]: !fir.box<!fir.array<?x?xf32>>) {
38 // CHECK:           %[[VAL_2:.*]] = arith.constant 1 : index
39 // CHECK:           %[[VAL_3:.*]] = arith.constant 10 : index
40 // CHECK:           hlfir.forall lb {
41 // CHECK:             hlfir.yield %[[VAL_2]] : index
42 // CHECK:           } ub {
43 // CHECK:             hlfir.yield %[[VAL_3]] : index
44 // CHECK:           }  (%[[VAL_4:.*]]: index) {
45 // CHECK:             hlfir.region_assign {
46 // CHECK:               %[[VAL_5:.*]] = fir.call @foo(%[[VAL_4]]) : (index) -> f32
47 // CHECK:               hlfir.yield %[[VAL_5]] : f32
48 // CHECK:             } to {
49 // CHECK:               %[[VAL_6:.*]] = hlfir.designate %[[VAL_0]] (%[[VAL_4]])  : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32>
50 // CHECK:               hlfir.yield %[[VAL_6]] : !fir.ref<f32>
51 // CHECK:             }
52 // CHECK:             hlfir.forall lb {
53 // CHECK:               hlfir.yield %[[VAL_2]] : index
54 // CHECK:             } ub {
55 // CHECK:               hlfir.yield %[[VAL_3]] : index
56 // CHECK:             }  (%[[VAL_7:.*]]: index) {
57 // CHECK:               hlfir.region_assign {
58 // CHECK:                 %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (index) -> f32
59 // CHECK:                 hlfir.yield %[[VAL_8]] : f32
60 // CHECK:               } to {
61 // CHECK:                 %[[VAL_9:.*]] = hlfir.designate %[[VAL_1]] (%[[VAL_4]], %[[VAL_7]])  : (!fir.box<!fir.array<?x?xf32>>, index, index) -> !fir.ref<f32>
62 // CHECK:                 hlfir.yield %[[VAL_9]] : !fir.ref<f32>
63 // CHECK:               }
64 // CHECK:             }
65 // CHECK:           }
67 func.func @forall_test_step(%x : !fir.box<!fir.array<10xf32>>, %y: !fir.box<!fir.array<?xf32>>) {
68   hlfir.forall lb {
69     %c1 = arith.constant 1 : index
70     hlfir.yield %c1 : index
71   } ub {
72     %c10 = arith.constant 10 : index
73     hlfir.yield %c10 : index
74   } step {
75     %c2 = arith.constant 2 : index
76     hlfir.yield %c2 : index
77   } (%i : index) {
78     hlfir.region_assign {
79       %yi = hlfir.designate %y(%i) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32>
80       %val = fir.load %yi : !fir.ref<f32>
81       hlfir.yield %val : f32
82     } to {
83       %xi = hlfir.designate %x(%i) : (!fir.box<!fir.array<10xf32>>, index) -> !fir.ref<f32>
84       hlfir.yield %xi : !fir.ref<f32>
85     }
86   }
87   return
89 // CHECK-LABEL:   func.func @forall_test_step(
90 // CHECK-SAME:                                %[[VAL_0:.*]]: !fir.box<!fir.array<10xf32>>,
91 // CHECK-SAME:                                %[[VAL_1:.*]]: !fir.box<!fir.array<?xf32>>) {
92 // CHECK:           hlfir.forall lb {
93 // CHECK:             %[[VAL_2:.*]] = arith.constant 1 : index
94 // CHECK:             hlfir.yield %[[VAL_2]] : index
95 // CHECK:           } ub {
96 // CHECK:             %[[VAL_3:.*]] = arith.constant 10 : index
97 // CHECK:             hlfir.yield %[[VAL_3]] : index
98 // CHECK:           } step {
99 // CHECK:             %[[VAL_4:.*]] = arith.constant 2 : index
100 // CHECK:             hlfir.yield %[[VAL_4]] : index
101 // CHECK:           }  (%[[VAL_5:.*]]: index) {
102 // CHECK:             hlfir.region_assign {
103 // CHECK:               %[[VAL_6:.*]] = hlfir.designate %[[VAL_1]] (%[[VAL_5]])  : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32>
104 // CHECK:               %[[VAL_7:.*]] = fir.load %[[VAL_6]] : !fir.ref<f32>
105 // CHECK:               hlfir.yield %[[VAL_7]] : f32
106 // CHECK:             } to {
107 // CHECK:               %[[VAL_8:.*]] = hlfir.designate %[[VAL_0]] (%[[VAL_5]])  : (!fir.box<!fir.array<10xf32>>, index) -> !fir.ref<f32>
108 // CHECK:               hlfir.yield %[[VAL_8]] : !fir.ref<f32>
109 // CHECK:             }
110 // CHECK:           }