brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.3 KiB · 5fd21e9 Raw
181 lines · plain
1// RUN: fir-opt --simplify-hlfir-intrinsics %s | FileCheck %s2 3// box with known extents4func.func @transpose0(%arg0: !fir.box<!fir.array<1x2xi32>>) -> !hlfir.expr<2x1xi32> {5  %res = hlfir.transpose %arg0 : (!fir.box<!fir.array<1x2xi32>>) -> !hlfir.expr<2x1xi32>6  return %res : !hlfir.expr<2x1xi32>7}8// CHECK-LABEL:   func.func @transpose0(9// CHECK-SAME:                          %[[ARG0:.*]]: !fir.box<!fir.array<1x2xi32>>) -> !hlfir.expr<2x1xi32> {10// CHECK:           %[[C0:.*]] = arith.constant 0 : index11// CHECK:           %[[C1:.*]] = arith.constant 1 : index12// CHECK:           %[[C2:.*]] = arith.constant 2 : index13// CHECK:           %[[SHAPE:.*]] = fir.shape %[[C2]], %[[C1]] : (index, index) -> !fir.shape<2>14// CHECK:           %[[EXPR:.*]] = hlfir.elemental %[[SHAPE]] unordered : (!fir.shape<2>) -> !hlfir.expr<2x1xi32> {15// CHECK:           ^bb0(%[[I:.*]]: index, %[[J:.*]]: index):16// CHECK:             %[[DIMS0:.*]]:3 = fir.box_dims %[[ARG0]], %[[C0]] : (!fir.box<!fir.array<1x2xi32>>, index) -> (index, index, index)17// CHECK:             %[[DIMS1:.*]]:3 = fir.box_dims %[[ARG0]], %[[C1]] : (!fir.box<!fir.array<1x2xi32>>, index) -> (index, index, index)18// CHECK:             %[[LOWER_BOUND0:.*]] = arith.subi %[[DIMS0]]#0, %[[C1]] : index19// CHECK:             %[[J_OFFSET:.*]] = arith.addi %[[J]], %[[LOWER_BOUND0]] : index20// CHECK:             %[[LOWER_BOUND1:.*]] = arith.subi %[[DIMS1]]#0, %[[C1]] : index21// CHECK:             %[[I_OFFSET:.*]] = arith.addi %[[I]], %[[LOWER_BOUND1]] : index22// CHECK:             %[[ELEMENT_REF:.*]] = hlfir.designate %[[ARG0]] (%[[J_OFFSET]], %[[I_OFFSET]])  : (!fir.box<!fir.array<1x2xi32>>, index, index) -> !fir.ref<i32>23// CHECK:             %[[ELEMENT:.*]] = fir.load %[[ELEMENT_REF]] : !fir.ref<i32>24// CHECK:             hlfir.yield_element %[[ELEMENT]] : i3225// CHECK:           }26// CHECK:           return27// CHECK:         }28 29// expr with known extents30func.func @transpose1(%arg0: !hlfir.expr<1x2xi32>) -> !hlfir.expr<2x1xi32> {31  %res = hlfir.transpose %arg0 : (!hlfir.expr<1x2xi32>) -> !hlfir.expr<2x1xi32>32  return %res : !hlfir.expr<2x1xi32>33}34// CHECK-LABEL:   func.func @transpose1(35// CHECK-SAME:                          %[[ARG0:.*]]: !hlfir.expr<1x2xi32>) -> !hlfir.expr<2x1xi32> {36// CHECK:           %[[C1:.*]] = arith.constant 1 : index37// CHECK:           %[[C2:.*]] = arith.constant 2 : index38// CHECK:           %[[SHAPE:.*]] = fir.shape %[[C2]], %[[C1]] : (index, index) -> !fir.shape<2>39// CHECK:           %[[EXPR:.*]] = hlfir.elemental %[[SHAPE]] unordered : (!fir.shape<2>) -> !hlfir.expr<2x1xi32> {40// CHECK:           ^bb0(%[[I:.*]]: index, %[[J:.*]]: index):41// CHECK:             %[[ELEMENT:.*]] = hlfir.apply %[[ARG0]], %[[J]], %[[I]] : (!hlfir.expr<1x2xi32>, index, index) -> i3242// CHECK:             hlfir.yield_element %[[ELEMENT]] : i3243// CHECK:           }44// CHECK:           return45// CHECK:         }46 47// box with unknown extent48func.func @transpose2(%arg0: !fir.box<!fir.array<?x2xi32>>) -> !hlfir.expr<2x?xi32> {49  %res = hlfir.transpose %arg0 : (!fir.box<!fir.array<?x2xi32>>) -> !hlfir.expr<2x?xi32>50  return %res : !hlfir.expr<2x?xi32>51}52// CHECK-LABEL:   func.func @transpose2(53// CHECK-SAME:                          %[[ARG0:.*]]: !fir.box<!fir.array<?x2xi32>>) -> !hlfir.expr<2x?xi32> {54// CHECK:           %[[C1:.*]] = arith.constant 1 : index55// CHECK:           %[[C2:.*]] = arith.constant 2 : index56// CHECK:           %[[C0:.*]] = arith.constant 0 : index57// CHECK:           %[[DIMS0:.*]]:3 = fir.box_dims %[[ARG0]], %[[C0]] : (!fir.box<!fir.array<?x2xi32>>, index) -> (index, index, index)58// CHECK:           %[[SHAPE:.*]] = fir.shape %[[C2]], %[[DIMS0]]#1 : (index, index) -> !fir.shape<2>59// CHECK:           %[[EXPR:.*]] = hlfir.elemental %[[SHAPE]] unordered : (!fir.shape<2>) -> !hlfir.expr<2x?xi32> {60// CHECK:           ^bb0(%[[I:.*]]: index, %[[J:.*]]: index):61// CHECK:             %[[DIMS0:.*]]:3 = fir.box_dims %[[ARG0]], %[[C0]] : (!fir.box<!fir.array<?x2xi32>>, index) -> (index, index, index)62// CHECK:             %[[DIMS1_1:.*]]:3 = fir.box_dims %[[ARG0]], %[[C1]] : (!fir.box<!fir.array<?x2xi32>>, index) -> (index, index, index)63// CHECK:             %[[LOWER_BOUND0:.*]] = arith.subi %[[DIMS0]]#0, %[[C1]] : index64// CHECK:             %[[J_OFFSET:.*]] = arith.addi %[[J]], %[[LOWER_BOUND0]] : index65// CHECK:             %[[LOWER_BOUND1:.*]] = arith.subi %[[DIMS1_1]]#0, %[[C1]] : index66// CHECK:             %[[I_OFFSET:.*]] = arith.addi %[[I]], %[[LOWER_BOUND1]] : index67// CHECK:             %[[ELE_REF:.*]] = hlfir.designate %[[ARG0]] (%[[J_OFFSET]], %[[I_OFFSET]])  : (!fir.box<!fir.array<?x2xi32>>, index, index) -> !fir.ref<i32>68// CHECK:             %[[ELEMENT:.*]] = fir.load %[[ELE_REF]] : !fir.ref<i32>69// CHECK:             hlfir.yield_element %[[ELEMENT]] : i3270// CHECK:           }71// CHECK:           return72// CHECK:         }73 74// expr with unknown extent75func.func @transpose3(%arg0: !hlfir.expr<?x2xi32>) -> !hlfir.expr<2x?xi32> {76  %res = hlfir.transpose %arg0 : (!hlfir.expr<?x2xi32>) -> !hlfir.expr<2x?xi32>77  return %res : !hlfir.expr<2x?xi32>78}79// CHECK-LABEL:   func.func @transpose3(80// CHECK-SAME:                          %[[ARG0:.*]]: !hlfir.expr<?x2xi32>) -> !hlfir.expr<2x?xi32> {81// CHECK:           %[[C2:.*]] = arith.constant 2 : index82// CHECK:           %[[IN_SHAPE:.*]] = hlfir.shape_of %[[ARG0]] : (!hlfir.expr<?x2xi32>) -> !fir.shape<2>83// CHECK:           %[[EXTENT0:.*]] = hlfir.get_extent %[[IN_SHAPE]] {dim = 0 : index} : (!fir.shape<2>) -> index84// CHECK:           %[[OUT_SHAPE:.*]] = fir.shape %[[C2]], %[[EXTENT0]] : (index, index) -> !fir.shape<2>85// CHECK:           %[[EXPR:.*]] = hlfir.elemental %[[OUT_SHAPE]] unordered : (!fir.shape<2>) -> !hlfir.expr<2x?xi32> {86// CHECK:           ^bb0(%[[I:.*]]: index, %[[J:.*]]: index):87// CHECK:             %[[ELEMENT:.*]] = hlfir.apply %[[ARG0]], %[[J]], %[[I]] : (!hlfir.expr<?x2xi32>, index, index) -> i3288// CHECK:             hlfir.yield_element %[[ELEMENT]] : i3289// CHECK:           }90// CHECK:           return91// CHECK:         }92 93// expr with multiple uses94func.func @transpose4(%arg0: !hlfir.expr<2x2xf32>, %arg1: !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>) {95  %0 = hlfir.transpose %arg0 : (!hlfir.expr<2x2xf32>) -> !hlfir.expr<2x2xf32>96  %1 = hlfir.shape_of %0 : (!hlfir.expr<2x2xf32>) -> !fir.shape<2>97  %2 = hlfir.elemental %1 : (!fir.shape<2>) -> !hlfir.expr<2x2xf32> {98  ^bb0(%arg2: index, %arg3: index):99    %3 = hlfir.apply %0, %arg2, %arg3 : (!hlfir.expr<2x2xf32>, index, index) -> f32100    %4 = math.cos %3 fastmath<contract> : f32101    hlfir.yield_element %4 : f32102  }103  hlfir.assign %2 to %arg1 realloc : !hlfir.expr<2x2xf32>, !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>104  hlfir.destroy %2 : !hlfir.expr<2x2xf32>105  hlfir.destroy %0 : !hlfir.expr<2x2xf32>106  return107}108// CHECK-LABEL: func.func @transpose4(109// CHECK-SAME:      %[[ARG0:.*]]: !hlfir.expr<2x2xf32>110// CHECK-SAME:      %[[ARG1:.*]]:111// CHECK:         %[[SHAPE0:.*]] = fir.shape112// CHECK:         %[[TRANSPOSE:.*]] = hlfir.elemental %[[SHAPE0]] unordered : (!fir.shape<2>) -> !hlfir.expr<2x2xf32> {113// CHECK:         ^bb0(%[[I:.*]]: index, %[[J:.*]]: index):114// CHECK:           %[[ELE:.*]] = hlfir.apply %[[ARG0]], %[[J]], %[[I]] : (!hlfir.expr<2x2xf32>, index, index) -> f32115// CHECK:           hlfir.yield_element %[[ELE]] : f32116// CHECK:         }117// CHECK:         %[[COS:.*]] = hlfir.elemental %[[SHAPE0]] : (!fir.shape<2>) -> !hlfir.expr<2x2xf32> {118// CHECK:         ^bb0(%[[I:.*]]: index, %[[J:.*]]: index):119// CHECK:           %[[ELE:.*]] = hlfir.apply %[[TRANSPOSE]], %[[I]], %[[J]] : (!hlfir.expr<2x2xf32>, index, index) -> f32120// CHECK:           %[[COS_ELE:.*]] = math.cos %[[ELE]] fastmath<contract> : f32121// CHECK:           hlfir.yield_element %[[COS_ELE]] : f32122// CHECK:         }123// CHECK:         hlfir.assign %[[COS]] to %[[ARG1]] realloc124// CHECK:         hlfir.destroy %[[COS]] : !hlfir.expr<2x2xf32>125// CHECK:         hlfir.destroy %[[TRANSPOSE]] : !hlfir.expr<2x2xf32>126// CHECK:         return127// CHECK:       }128 129// regression test130func.func @transpose5(%arg0: !fir.ref<tuple<!fir.box<!fir.array<2x2xf64>>, !fir.box<!fir.array<2x2xf64>>>> {fir.host_assoc}) attributes {fir.internal_proc} {131  %0 = fir.address_of(@_QFEb) : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf64>>>>132  %1:2 = hlfir.declare %0 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFEb"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf64>>>>) -> (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf64>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf64>>>>)133  %c0_i32 = arith.constant 0 : i32134  %2 = fir.coordinate_of %arg0, %c0_i32 : (!fir.ref<tuple<!fir.box<!fir.array<2x2xf64>>, !fir.box<!fir.array<2x2xf64>>>>, i32) -> !fir.ref<!fir.box<!fir.array<2x2xf64>>>135  %3 = fir.load %2 : !fir.ref<!fir.box<!fir.array<2x2xf64>>>136  %4 = fir.box_addr %3 : (!fir.box<!fir.array<2x2xf64>>) -> !fir.ref<!fir.array<2x2xf64>>137  %c0 = arith.constant 0 : index138  %5:3 = fir.box_dims %3, %c0 : (!fir.box<!fir.array<2x2xf64>>, index) -> (index, index, index)139  %c1 = arith.constant 1 : index140  %6:3 = fir.box_dims %3, %c1 : (!fir.box<!fir.array<2x2xf64>>, index) -> (index, index, index)141  %7 = fir.shape %5#1, %6#1 : (index, index) -> !fir.shape<2>142  %8:2 = hlfir.declare %4(%7) {uniq_name = "_QFEa"} : (!fir.ref<!fir.array<2x2xf64>>, !fir.shape<2>) -> (!fir.ref<!fir.array<2x2xf64>>, !fir.ref<!fir.array<2x2xf64>>)143  %c1_i32 = arith.constant 1 : i32144  %9 = fir.coordinate_of %arg0, %c1_i32 : (!fir.ref<tuple<!fir.box<!fir.array<2x2xf64>>, !fir.box<!fir.array<2x2xf64>>>>, i32) -> !fir.ref<!fir.box<!fir.array<2x2xf64>>>145  %10 = fir.load %9 : !fir.ref<!fir.box<!fir.array<2x2xf64>>>146  %11 = fir.box_addr %10 : (!fir.box<!fir.array<2x2xf64>>) -> !fir.ref<!fir.array<2x2xf64>>147  %c0_0 = arith.constant 0 : index148  %12:3 = fir.box_dims %10, %c0_0 : (!fir.box<!fir.array<2x2xf64>>, index) -> (index, index, index)149  %c1_1 = arith.constant 1 : index150  %13:3 = fir.box_dims %10, %c1_1 : (!fir.box<!fir.array<2x2xf64>>, index) -> (index, index, index)151  %14 = fir.shape %12#1, %13#1 : (index, index) -> !fir.shape<2>152  %15:2 = hlfir.declare %11(%14) {uniq_name = "_QFEc"} : (!fir.ref<!fir.array<2x2xf64>>, !fir.shape<2>) -> (!fir.ref<!fir.array<2x2xf64>>, !fir.ref<!fir.array<2x2xf64>>)153  %16 = hlfir.transpose %8#0 : (!fir.ref<!fir.array<2x2xf64>>) -> !hlfir.expr<2x2xf64>154  %17 = hlfir.shape_of %16 : (!hlfir.expr<2x2xf64>) -> !fir.shape<2>155  %18 = hlfir.elemental %17 : (!fir.shape<2>) -> !hlfir.expr<?x?xf64> {156  ^bb0(%arg1: index, %arg2: index):157    %19 = hlfir.apply %16, %arg1, %arg2 : (!hlfir.expr<2x2xf64>, index, index) -> f64158    %20 = math.cos %19 fastmath<contract> : f64159    hlfir.yield_element %20 : f64160  }161  hlfir.assign %18 to %1#0 realloc : !hlfir.expr<?x?xf64>, !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf64>>>>162  hlfir.destroy %18 : !hlfir.expr<?x?xf64>163  hlfir.destroy %16 : !hlfir.expr<2x2xf64>164  return165}166// CHECK-LABEL: func.func @transpose5(167// ...168// CHECK:         %[[TRANSPOSE:.*]] = hlfir.elemental %[[SHAPE0:[A-Za-z._]*]]169// CHECK:         ^bb0(%[[I:.*]]: index, %[[J:.*]]: index):170// CHECK:           %[[ELE:.*]] = hlfir.designate %[[ARRAY:.*]] (%[[J]], %[[I]])171// CHECK:           %[[LOAD:.*]] = fir.load %[[ELE]]172// CHECK:           hlfir.yield_element %[[LOAD]]173// CHECK:         }174// CHECK:         %[[COS:.*]] = hlfir.elemental %[[SHAPE0]]175// ...176// CHECK:         hlfir.assign %[[COS]] to %{{.*}} realloc177// CHECK:         hlfir.destroy %[[COS]]178// CHECK:         hlfir.destroy %[[TRANSPOSE]]179// CHECK:         return180// CHECK:       }181