1// Test hlfir.count operation parse, verify (no errors), and unparse 2 3// RUN: fir-opt %s | fir-opt | FileCheck %s 4 5// mask is an expression of known shape 6func.func @count0(%arg0: !hlfir.expr<2x!fir.logical<4>>) { 7 %count = hlfir.count %arg0 : (!hlfir.expr<2x!fir.logical<4>>) -> i32 8 return 9} 10// CHECK: func.func @count0(%[[ARRAY:.*]]: !hlfir.expr<2x!fir.logical<4>>) { 11// CHECK-NEXT: %[[COUNT:.*]] = hlfir.count %[[ARRAY]] : (!hlfir.expr<2x!fir.logical<4>>) -> i32 12// CHECK-NEXT: return 13// CHECK-NEXT: } 14 15// mask is an expression of assumed shape 16func.func @count1(%arg0: !hlfir.expr<?x!fir.logical<4>>) { 17 %count = hlfir.count %arg0 : (!hlfir.expr<?x!fir.logical<4>>) -> i32 18 return 19} 20// CHECK: func.func @count1(%[[ARRAY:.*]]: !hlfir.expr<?x!fir.logical<4>>) { 21// CHECK-NEXT: %[[COUNT:.*]] = hlfir.count %[[ARRAY]] : (!hlfir.expr<?x!fir.logical<4>>) -> i32 22// CHECK-NEXT: return 23// CHECK-NEXT: } 24 25// mask is a boxed array 26func.func @count2(%arg0: !fir.box<!fir.array<2x!fir.logical<4>>>) { 27 %count = hlfir.count %arg0 : (!fir.box<!fir.array<2x!fir.logical<4>>>) -> i32 28 return 29} 30// CHECK: func.func @count2(%[[ARRAY:.*]]: !fir.box<!fir.array<2x!fir.logical<4>>>) { 31// CHECK-NEXT: %[[COUNT:.*]] = hlfir.count %[[ARRAY]] : (!fir.box<!fir.array<2x!fir.logical<4>>>) -> i32 32// CHECK-NEXT: return 33// CHECK-NEXT: } 34 35// mask is an assumed shape boxed array 36func.func @count3(%arg0: !fir.box<!fir.array<?x!fir.logical<4>>>) { 37 %count = hlfir.count %arg0 : (!fir.box<!fir.array<?x!fir.logical<4>>>) -> i32 38 return 39} 40// CHECK: func.func @count3(%[[ARRAY:.*]]: !fir.box<!fir.array<?x!fir.logical<4>>>) { 41// CHECK-NEXT: %[[COUNT:.*]] = hlfir.count %[[ARRAY]] : (!fir.box<!fir.array<?x!fir.logical<4>>>) -> i32 42// CHECK-NEXT: return 43// CHECK-NEXT: } 44 45// mask is a 2-dimensional array 46func.func @count4(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>>){ 47 %count = hlfir.count %arg0 : (!fir.box<!fir.array<?x?x!fir.logical<4>>>) -> i32 48 return 49} 50// CHECK: func.func @count4(%[[ARRAY:.*]]: !fir.box<!fir.array<?x?x!fir.logical<4>>>) { 51// CHECK-NEXT: %[[COUNT:.*]] = hlfir.count %[[ARRAY]] : (!fir.box<!fir.array<?x?x!fir.logical<4>>>) -> i32 52// CHECK-NEXT: return 53// CHECK-NEXT: } 54 55// mask and dim argument 56func.func @count5(%arg0: !fir.box<!fir.array<?x!fir.logical<4>>>, %arg1: i32) { 57 %count = hlfir.count %arg0 dim %arg1 : (!fir.box<!fir.array<?x!fir.logical<4>>>, i32) -> i32 58 return 59} 60// CHECK: func.func @count5(%[[ARRAY:.*]]: !fir.box<!fir.array<?x!fir.logical<4>>>, %[[DIM:.*]]: i32) { 61// CHECK-NEXT: %[[COUNT:.*]] = hlfir.count %[[ARRAY]] dim %[[DIM]] : (!fir.box<!fir.array<?x!fir.logical<4>>>, i32) -> i32 62// CHECK-NEXT: return 63// CHECK-NEXT: } 64 65// mask is a 2 dimensional array with dim 66func.func @count6(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>>, %arg1: i32) { 67 %count = hlfir.count %arg0 dim %arg1 : (!fir.box<!fir.array<?x?x!fir.logical<4>>>, i32) -> i32 68 return 69} 70// CHECK: func.func @count6(%[[ARRAY:.*]]: !fir.box<!fir.array<?x?x!fir.logical<4>>>, %[[DIM:.*]]: i32) { 71// CHECK-NEXT: %[[ANY:.*]] = hlfir.count %[[ARRAY]] dim %[[DIM]] : (!fir.box<!fir.array<?x?x!fir.logical<4>>>, i32) -> i32 72// CHECK-NEXT: return 73// CHECK-NEXT: } 74 75// mask is of a different logical type 76func.func @count7(%arg0: !fir.box<!fir.array<?x?x!fir.logical<8>>>, %arg1: i32) { 77 %count = hlfir.count %arg0 dim %arg1 : (!fir.box<!fir.array<?x?x!fir.logical<8>>>, i32) -> i32 78 return 79} 80// CHECK: func.func @count7(%[[ARRAY:.*]]: !fir.box<!fir.array<?x?x!fir.logical<8>>>, %[[DIM:.*]]: i32) { 81// CHECK-NEXT: %[[ANY:.*]] = hlfir.count %[[ARRAY]] dim %[[DIM]] : (!fir.box<!fir.array<?x?x!fir.logical<8>>>, i32) -> i32 82// CHECK-NEXT: return 83// CHECK-NEXT: }