brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.8 KiB · 7be5831 Raw
203 lines · plain
1! Test lowering of non elemental calls and there inputs inside WHERE2! constructs. These must be lowered inside hlfir.exactly_once so that3! they are properly hoisted once the loops are materialized and4! expression evaluations are scheduled.5! RUN: bbc -emit-hlfir -o - %s | FileCheck %s6 7subroutine test_where(a, b, c)8 real, dimension(:) :: a, b, c9 interface10  function logical_func1()11    logical :: logical_func1(100)12  end function13  function logical_func2()14    logical :: logical_func2(100)15  end function16  real elemental function elem_func(x)17    real, intent(in) :: x18  end function19 end interface20 where (logical_func1())21  a = b + real_func(a+b+real_func2()) + elem_func(a)22 elsewhere(logical_func2())23  a(1:ifoo()) = c24 end where25end subroutine26! CHECK-LABEL:   func.func @_QPtest_where(27! CHECK:           hlfir.where {28! CHECK-NOT: hlfir.exactly_once29! CHECK:               %[[VAL_19:.*]] = hlfir.eval_in_mem {{.*}} {30! CHECK:                 fir.call @_QPlogical_func1() fastmath<contract> : () -> !fir.array<100x!fir.logical<4>>31! CHECK:               }32! CHECK:               hlfir.yield %[[VAL_19]] : !hlfir.expr<100x!fir.logical<4>> cleanup {33! CHECK:                 hlfir.destroy %[[VAL_19]]34! CHECK:               }35! CHECK:           } do {36! CHECK:             hlfir.region_assign {37! CHECK:               %[[VAL_24:.*]] = hlfir.exactly_once : f32 {38! CHECK:                 %[[VAL_28:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {39! CHECK:                 }40! CHECK-NOT: hlfir.exactly_once41! CHECK:                 %[[VAL_35:.*]] = fir.call @_QPreal_func2() fastmath<contract> : () -> f3242! CHECK:                 %[[VAL_36:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {43! CHECK:                 ^bb0(%[[VAL_37:.*]]: index):44! CHECK:                   %[[VAL_38:.*]] = hlfir.apply %[[VAL_28]], %[[VAL_37]] : (!hlfir.expr<?xf32>, index) -> f3245! CHECK:                   %[[VAL_39:.*]] = arith.addf %[[VAL_38]], %[[VAL_35]] fastmath<contract> : f3246! CHECK:                   hlfir.yield_element %[[VAL_39]] : f3247! CHECK:                 }48! CHECK:                 %[[VAL_41:.*]] = fir.call @_QPreal_func49! CHECK:                 hlfir.yield %[[VAL_41]] : f32 cleanup {50! CHECK:                   hlfir.destroy %[[VAL_36]] : !hlfir.expr<?xf32>51! CHECK:                   hlfir.destroy %[[VAL_28]] : !hlfir.expr<?xf32>52! CHECK:                 }53! CHECK:               }54! CHECK:               %[[VAL_45:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {55! CHECK:                 arith.addf56! CHECK-NOT: hlfir.exactly_once57! CHECK:               }58! CHECK:               %[[VAL_53:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {59! CHECK:                 fir.call @_QPelem_func60! CHECK:               }61! CHECK:               %[[VAL_57:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {62! CHECK:                 arith.addf63! CHECK:               }64! CHECK:               hlfir.yield %[[VAL_57]] : !hlfir.expr<?xf32> cleanup {65! CHECK:                 hlfir.destroy %[[VAL_57]] : !hlfir.expr<?xf32>66! CHECK:                 hlfir.destroy %[[VAL_53]] : !hlfir.expr<?xf32>67! CHECK:                 hlfir.destroy %[[VAL_45]] : !hlfir.expr<?xf32>68! CHECK:               }69! CHECK:             } to {70! CHECK:               hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>71! CHECK:             }72! CHECK:             hlfir.elsewhere mask {73! CHECK:               %[[VAL_62:.*]] = hlfir.exactly_once : !hlfir.expr<100x!fir.logical<4>> {74! CHECK:                 %[[VAL_72:.*]] = hlfir.eval_in_mem {{.*}} {75! CHECK:                  fir.call @_QPlogical_func2() fastmath<contract> : () -> !fir.array<100x!fir.logical<4>>76! CHECK:                 }77! CHECK:                 hlfir.yield %[[VAL_72]] : !hlfir.expr<100x!fir.logical<4>> cleanup {78! CHECK:                   hlfir.destroy %[[VAL_72]]79! CHECK:                 }80! CHECK:               }81! CHECK:               hlfir.yield %[[VAL_62]] : !hlfir.expr<100x!fir.logical<4>>82! CHECK:             } do {83! CHECK:               hlfir.region_assign {84! CHECK:                 hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>85! CHECK:               } to {86! CHECK:                 %[[VAL_80:.*]] = hlfir.exactly_once : i32 {87! CHECK:                   %[[VAL_81:.*]] = fir.call @_QPifoo() fastmath<contract> : () -> i3288! CHECK:                   hlfir.yield %[[VAL_81]] : i3289! CHECK:                 }90! CHECK:                 hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>91! CHECK:               }92! CHECK:             }93! CHECK:           }94! CHECK:           return95! CHECK:         }96 97subroutine test_where_in_forall(a, b, c)98 real, dimension(:, :) :: a, b, c99 interface100  pure function pure_logical_func1()101    logical :: pure_logical_func1(100)102  end function103  pure function pure_logical_func2()104    logical :: pure_logical_func2(100)105  end function106  real pure elemental function pure_elem_func(x)107    real, intent(in) :: x108  end function109  integer pure function pure_ifoo()110  end function111 end interface112 forall(i=1:10)113   where (pure_logical_func1())114    a(2*i, :) = b(i, :) + pure_real_func(a(i,:)+b(i,:)+pure_real_func2()) + pure_elem_func(a(i,:))115   elsewhere(pure_logical_func2())116    a(2*i, 1:pure_ifoo()) = c(i, :)117   end where118 end forall119end subroutine120! CHECK-LABEL:   func.func @_QPtest_where_in_forall(121! CHECK:           hlfir.forall lb {122! CHECK:             hlfir.yield %{{.*}} : i32123! CHECK:           } ub {124! CHECK:             hlfir.yield %{{.*}} : i32125! CHECK:           }  (%[[VAL_10:.*]]: i32) {126! CHECK:             %[[VAL_11:.*]] = hlfir.forall_index "i" %[[VAL_10]] : (i32) -> !fir.ref<i32>127! CHECK:             hlfir.where {128! CHECK-NOT: hlfir.exactly_once129! CHECK:               %[[VAL_23:.*]] = hlfir.eval_in_mem {{.*}} {130! CHECK:                  fir.call @_QPpure_logical_func1() proc_attrs<pure> fastmath<contract> : () -> !fir.array<100x!fir.logical<4>>131! CHECK:               }132! CHECK:               hlfir.yield %[[VAL_23]] : !hlfir.expr<100x!fir.logical<4>> cleanup {133! CHECK:                 hlfir.destroy %[[VAL_23]]134! CHECK:               }135! CHECK:             } do {136! CHECK:               hlfir.region_assign {137! CHECK:                 %[[VAL_41:.*]] = hlfir.designate138! CHECK:                 %[[VAL_42:.*]] = hlfir.exactly_once : f32 {139! CHECK:                                    hlfir.designate140! CHECK:                                    hlfir.designate141! CHECK:                   %[[VAL_71:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {142! CHECK:                     arith.addf143! CHECK:                   }144! CHECK-NOT: hlfir.exactly_once145! CHECK:                   %[[VAL_78:.*]] = fir.call @_QPpure_real_func2() fastmath<contract> : () -> f32146! CHECK:                   %[[VAL_79:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {147! CHECK:                     arith.addf148! CHECK:                   }149! CHECK:                   %[[VAL_84:.*]] = fir.call @_QPpure_real_func(150! CHECK:                   hlfir.yield %[[VAL_84]] : f32 cleanup {151! CHECK:                     hlfir.destroy %[[VAL_79]] : !hlfir.expr<?xf32>152! CHECK:                     hlfir.destroy %[[VAL_71]] : !hlfir.expr<?xf32>153! CHECK:                   }154! CHECK:                 }155! CHECK:                 %[[VAL_85:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {156! CHECK:                     arith.addf157! CHECK:                 }158! CHECK-NOT: hlfir.exactly_once159! CHECK:                 %[[VAL_104:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {160! CHECK:                 ^bb0(%[[VAL_105:.*]]: index):161! CHECK-NOT: hlfir.exactly_once162! CHECK:                   fir.call @_QPpure_elem_func163! CHECK:                 }164! CHECK:                 %[[VAL_108:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {165! CHECK:                   arith.addf166! CHECK:                 }167! CHECK:                 hlfir.yield %[[VAL_108]] : !hlfir.expr<?xf32> cleanup {168! CHECK:                   hlfir.destroy %[[VAL_108]] : !hlfir.expr<?xf32>169! CHECK:                   hlfir.destroy %[[VAL_104]] : !hlfir.expr<?xf32>170! CHECK:                   hlfir.destroy %[[VAL_85]] : !hlfir.expr<?xf32>171! CHECK:                 }172! CHECK:               } to {173! CHECK:                 hlfir.designate174! CHECK:                 hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>175! CHECK:               }176! CHECK:               hlfir.elsewhere mask {177! CHECK:                 %[[VAL_129:.*]] = hlfir.exactly_once : !hlfir.expr<100x!fir.logical<4>> {178! CHECK:                   %[[VAL_139:.*]] = hlfir.eval_in_mem {{.*}} {179! CHECK:                    fir.call @_QPpure_logical_func2() proc_attrs<pure> fastmath<contract> : () -> !fir.array<100x!fir.logical<4>>180! CHECK:                   }181! CHECK:                   hlfir.yield %[[VAL_139]] : !hlfir.expr<100x!fir.logical<4>> cleanup {182! CHECK:                     hlfir.destroy %[[VAL_139]]183! CHECK:                   }184! CHECK:                 }185! CHECK:                 hlfir.yield %[[VAL_129]] : !hlfir.expr<100x!fir.logical<4>>186! CHECK:               } do {187! CHECK:                 hlfir.region_assign {188! CHECK:                   hlfir.designate189! CHECK:                   hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>190! CHECK:                 } to {191! CHECK:                   %[[VAL_165:.*]] = hlfir.exactly_once : i32 {192! CHECK:                     %[[VAL_166:.*]] = fir.call @_QPpure_ifoo() proc_attrs<pure> fastmath<contract> : () -> i32193! CHECK:                     hlfir.yield %[[VAL_166]] : i32194! CHECK:                   }195! CHECK:                   hlfir.designate196! CHECK:                   hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>197! CHECK:                 }198! CHECK:               }199! CHECK:             }200! CHECK:           }201! CHECK:           return202! CHECK:         }203