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