xref: /llvm-project/flang/test/HLFIR/elsewhere.fir (revision 9f867a3c46d0067c2fd65650de23ecb75a9c817b)
1// Test hlfir.elsewhere operation parse, verify (no errors), and unparse.
2// RUN: fir-opt %s | fir-opt | FileCheck %s
3
4func.func @test_elsewhere(%mask: !fir.ref<!fir.array<10x!fir.logical<4>>>, %x: !fir.ref<!fir.array<10xf32>>, %y: !fir.box<!fir.array<?xf32>>) {
5  hlfir.where {
6    hlfir.yield %mask : !fir.ref<!fir.array<10x!fir.logical<4>>>
7  } do {
8    hlfir.elsewhere do {
9      hlfir.region_assign {
10        hlfir.yield %y : !fir.box<!fir.array<?xf32>>
11      } to {
12        hlfir.yield %x : !fir.ref<!fir.array<10xf32>>
13      }
14    }
15  }
16  return
17}
18// CHECK-LABEL:   func.func @test_elsewhere(
19// CHECK-SAME:                              %[[VAL_0:.*]]: !fir.ref<!fir.array<10x!fir.logical<4>>>,
20// CHECK-SAME:                              %[[VAL_1:.*]]: !fir.ref<!fir.array<10xf32>>,
21// CHECK-SAME:                              %[[VAL_2:.*]]: !fir.box<!fir.array<?xf32>>) {
22// CHECK:           hlfir.where {
23// CHECK:             hlfir.yield %[[VAL_0]] : !fir.ref<!fir.array<10x!fir.logical<4>>>
24// CHECK:           } do {
25// CHECK:             hlfir.elsewhere do {
26// CHECK:               hlfir.region_assign {
27// CHECK:                 hlfir.yield %[[VAL_2]] : !fir.box<!fir.array<?xf32>>
28// CHECK:               } to {
29// CHECK:                 hlfir.yield %[[VAL_1]] : !fir.ref<!fir.array<10xf32>>
30// CHECK:               }
31// CHECK:             }
32// CHECK:           }
33
34func.func @test_masked_elsewhere(%mask: !fir.ref<!fir.array<10x!fir.logical<4>>>, %x: !fir.ref<!fir.array<10xf32>>, %y: !fir.box<!fir.array<?xf32>>) {
35  hlfir.where {
36    hlfir.yield %mask : !fir.ref<!fir.array<10x!fir.logical<4>>>
37  } do {
38    hlfir.elsewhere mask {
39      %other_mask = fir.call @get_mask() : () -> !fir.ptr<!fir.array<10x!fir.logical<4>>>
40      hlfir.yield %other_mask : !fir.ptr<!fir.array<10x!fir.logical<4>>>
41    } do {
42      hlfir.region_assign {
43        hlfir.yield %y : !fir.box<!fir.array<?xf32>>
44      } to {
45        hlfir.yield %x : !fir.ref<!fir.array<10xf32>>
46      }
47      hlfir.elsewhere do {
48        hlfir.region_assign {
49          hlfir.yield %x : !fir.ref<!fir.array<10xf32>>
50        } to {
51          hlfir.yield %y : !fir.box<!fir.array<?xf32>>
52        }
53      }
54    }
55  }
56  return
57}
58// CHECK-LABEL:   func.func @test_masked_elsewhere(
59// CHECK-SAME:                                     %[[VAL_0:.*]]: !fir.ref<!fir.array<10x!fir.logical<4>>>,
60// CHECK-SAME:                                     %[[VAL_1:.*]]: !fir.ref<!fir.array<10xf32>>,
61// CHECK-SAME:                                     %[[VAL_2:.*]]: !fir.box<!fir.array<?xf32>>) {
62// CHECK:           hlfir.where {
63// CHECK:             hlfir.yield %[[VAL_0]] : !fir.ref<!fir.array<10x!fir.logical<4>>>
64// CHECK:           } do {
65// CHECK:             hlfir.elsewhere mask {
66// CHECK:               %[[VAL_3:.*]] = fir.call @get_mask() : () -> !fir.ptr<!fir.array<10x!fir.logical<4>>>
67// CHECK:               hlfir.yield %[[VAL_3]] : !fir.ptr<!fir.array<10x!fir.logical<4>>>
68// CHECK:             } do {
69// CHECK:               hlfir.region_assign {
70// CHECK:                 hlfir.yield %[[VAL_2]] : !fir.box<!fir.array<?xf32>>
71// CHECK:               } to {
72// CHECK:                 hlfir.yield %[[VAL_1]] : !fir.ref<!fir.array<10xf32>>
73// CHECK:               }
74// CHECK:               hlfir.elsewhere do {
75// CHECK:                 hlfir.region_assign {
76// CHECK:                   hlfir.yield %[[VAL_1]] : !fir.ref<!fir.array<10xf32>>
77// CHECK:                 } to {
78// CHECK:                   hlfir.yield %[[VAL_2]] : !fir.box<!fir.array<?xf32>>
79// CHECK:                 }
80// CHECK:               }
81// CHECK:             }
82// CHECK:           }
83