brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.3 KiB · 709e233 Raw
188 lines · plain
1! Test lowering of Forall to HLFIR.2! RUN: bbc --hlfir -o - %s | FileCheck %s3 4module forall_defs5  integer :: x(10, 10), y(10)6  interface7    pure integer(8) function ifoo2(i, j)8      integer(8), value :: i, j9    end function10    pure integer(8) function jfoo()11    end function12    pure integer(8) function jbar()13    end function14    pure logical function predicate(i)15      integer(8), intent(in) :: i16    end function17  end interface18end module19 20subroutine test_simple_forall()21  use forall_defs22  forall (integer(8)::i=1:10) x(i, i) = y(i)23end subroutine24! CHECK-LABEL:   func.func @_QPtest_simple_forall() {25! CHECK:  %[[VAL_0:.*]] = arith.constant 10 : i3226! CHECK:  %[[VAL_1:.*]] = arith.constant 1 : i3227! CHECK:  %[[VAL_5:.*]]:2 = hlfir.declare {{.*}}Ex28! CHECK:  %[[VAL_8:.*]]:2 = hlfir.declare {{.*}}Ey29! CHECK:  hlfir.forall lb {30! CHECK:    hlfir.yield %[[VAL_1]] : i3231! CHECK:  } ub {32! CHECK:    hlfir.yield %[[VAL_0]] : i3233! CHECK:  }  (%[[VAL_9:.*]]: i64) {34! CHECK:    hlfir.region_assign {35! CHECK:      %[[VAL_10:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_9]])  : (!fir.ref<!fir.array<10xi32>>, i64) -> !fir.ref<i32>36! CHECK:      %[[VAL_11:.*]] = fir.load %[[VAL_10]] : !fir.ref<i32>37! CHECK:      hlfir.yield %[[VAL_11]] : i3238! CHECK:    } to {39! CHECK:      %[[VAL_12:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_9]], %[[VAL_9]])  : (!fir.ref<!fir.array<10x10xi32>>, i64, i64) -> !fir.ref<i32>40! CHECK:      hlfir.yield %[[VAL_12]] : !fir.ref<i32>41! CHECK:    }42! CHECK:  }43 44subroutine test_forall_step(step)45  use forall_defs46  integer :: step47  forall (integer(8)::i=1:10:step) x(i, i) = y(i)48end subroutine49! CHECK-LABEL:   func.func @_QPtest_forall_step(50! CHECK:  %[[VAL_1:.*]] = arith.constant 10 : i3251! CHECK:  %[[VAL_2:.*]] = arith.constant 1 : i3252! CHECK:  %[[VAL_4:.*]]:2 = hlfir.declare {{.*}}Estep53! CHECK:  %[[VAL_7:.*]]:2 = hlfir.declare {{.*}}Ex54! CHECK:  %[[VAL_10:.*]]:2 = hlfir.declare {{.*}}Ey55! CHECK:  %[[VAL_11:.*]] = fir.load %[[VAL_4]]#0 : !fir.ref<i32>56! CHECK:  hlfir.forall lb {57! CHECK:    hlfir.yield %[[VAL_2]] : i3258! CHECK:  } ub {59! CHECK:    hlfir.yield %[[VAL_1]] : i3260! CHECK:  } step {61! CHECK:    hlfir.yield %[[VAL_11]] : i3262! CHECK:  }  (%[[VAL_12:.*]]: i64) {63! CHECK:    hlfir.region_assign {64! CHECK:      %[[VAL_13:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_12]])  : (!fir.ref<!fir.array<10xi32>>, i64) -> !fir.ref<i32>65! CHECK:      %[[VAL_14:.*]] = fir.load %[[VAL_13]] : !fir.ref<i32>66! CHECK:      hlfir.yield %[[VAL_14]] : i3267! CHECK:    } to {68! CHECK:      %[[VAL_15:.*]] = hlfir.designate %[[VAL_7]]#0 (%[[VAL_12]], %[[VAL_12]])  : (!fir.ref<!fir.array<10x10xi32>>, i64, i64) -> !fir.ref<i32>69! CHECK:      hlfir.yield %[[VAL_15]] : !fir.ref<i32>70! CHECK:    }71! CHECK:  }72 73subroutine test_forall_mask()74  use forall_defs75  forall (integer(8)::i=1:10, predicate(i)) x(i, i) = y(i)76end subroutine77! CHECK-LABEL:   func.func @_QPtest_forall_mask() {78! CHECK:  %[[VAL_0:.*]] = arith.constant 10 : i3279! CHECK:  %[[VAL_1:.*]] = arith.constant 1 : i3280! CHECK:  %[[VAL_5:.*]]:2 = hlfir.declare {{.*}}Ex81! CHECK:  %[[VAL_8:.*]]:2 = hlfir.declare {{.*}}Ey82! CHECK:  hlfir.forall lb {83! CHECK:    hlfir.yield %[[VAL_1]] : i3284! CHECK:  } ub {85! CHECK:    hlfir.yield %[[VAL_0]] : i3286! CHECK:  }  (%[[VAL_9:.*]]: i64) {87! CHECK:    %[[VAL_10:.*]] = hlfir.forall_index "i" %[[VAL_9]] : (i64) -> !fir.ref<i64>88! CHECK:    hlfir.forall_mask {89! CHECK:      %[[VAL_11:.*]] = fir.call @_QPpredicate(%[[VAL_10]]) proc_attrs<pure> fastmath<contract> : (!fir.ref<i64>) -> !fir.logical<4>90! CHECK:      %[[VAL_12:.*]] = fir.convert %[[VAL_11]] : (!fir.logical<4>) -> i191! CHECK:      hlfir.yield %[[VAL_12]] : i192! CHECK:    } do {93! CHECK:      hlfir.region_assign {94! CHECK:        %[[I_LOAD:.*]] = fir.load %[[VAL_10]] : !fir.ref<i64>95! CHECK:        %[[VAL_13:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[I_LOAD]])  : (!fir.ref<!fir.array<10xi32>>, i64) -> !fir.ref<i32>96! CHECK:        %[[VAL_14:.*]] = fir.load %[[VAL_13]] : !fir.ref<i32>97! CHECK:        hlfir.yield %[[VAL_14]] : i3298! CHECK:      } to {99! CHECK:        %[[I_LOAD:.*]] = fir.load %[[VAL_10]] : !fir.ref<i64>100! CHECK:        %[[VAL_15:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[I_LOAD]], %[[I_LOAD]])  : (!fir.ref<!fir.array<10x10xi32>>, i64, i64) -> !fir.ref<i32>101! CHECK:        hlfir.yield %[[VAL_15]] : !fir.ref<i32>102! CHECK:      }103! CHECK:    }104! CHECK:  }105 106subroutine test_forall_several_indices()107  use forall_defs108  ! Test outer forall controls are lowered outside.109  forall (integer(8)::i=ibar():ifoo(), j=jfoo():jbar()) x(i, j) = y(ifoo2(i, j))110end subroutine111! CHECK-LABEL:   func.func @_QPtest_forall_several_indices() {112! CHECK:  %[[VAL_3:.*]]:2 = hlfir.declare {{.*}}Ex113! CHECK:  %[[VAL_6:.*]]:2 = hlfir.declare {{.*}}Ey114! CHECK:  %[[VAL_7:.*]] = fir.call @_QPibar() fastmath<contract> : () -> i32115! CHECK:  %[[VAL_8:.*]] = fir.call @_QPifoo() fastmath<contract> : () -> i32116! CHECK:  %[[VAL_9:.*]] = fir.call @_QPjfoo() proc_attrs<pure> fastmath<contract> : () -> i64117! CHECK:  %[[VAL_10:.*]] = fir.call @_QPjbar() proc_attrs<pure> fastmath<contract> : () -> i64118! CHECK:  hlfir.forall lb {119! CHECK:    hlfir.yield %[[VAL_7]] : i32120! CHECK:  } ub {121! CHECK:    hlfir.yield %[[VAL_8]] : i32122! CHECK:  }  (%[[VAL_11:.*]]: i64) {123! CHECK:    hlfir.forall lb {124! CHECK:      hlfir.yield %[[VAL_9]] : i64125! CHECK:    } ub {126! CHECK:      hlfir.yield %[[VAL_10]] : i64127! CHECK:    }  (%[[VAL_12:.*]]: i64) {128! CHECK:      hlfir.region_assign {129! CHECK:        %[[VAL_13:.*]] = fir.call @_QPifoo2(%[[VAL_11]], %[[VAL_12]]) proc_attrs<pure> fastmath<contract> : (i64, i64) -> i64130! CHECK:        %[[VAL_14:.*]] = hlfir.designate %[[VAL_6]]#0 (%[[VAL_13]])  : (!fir.ref<!fir.array<10xi32>>, i64) -> !fir.ref<i32>131! CHECK:        %[[VAL_15:.*]] = fir.load %[[VAL_14]] : !fir.ref<i32>132! CHECK:        hlfir.yield %[[VAL_15]] : i32133! CHECK:      } to {134! CHECK:        %[[VAL_16:.*]] = hlfir.designate %[[VAL_3]]#0 (%[[VAL_11]], %[[VAL_12]])  : (!fir.ref<!fir.array<10x10xi32>>, i64, i64) -> !fir.ref<i32>135! CHECK:        hlfir.yield %[[VAL_16]] : !fir.ref<i32>136! CHECK:      }137! CHECK:    }138! CHECK:  }139 140subroutine test_nested_foralls()141  use forall_defs142  forall (integer(8)::i=1:10)143    x(i, i) = y(i)144    ! ifoo and ibar could depend on x since it is a module145    ! variable use associated. The calls in the control value146    ! computation cannot be hoisted from the outer forall147    ! even when they do not depend on outer forall indices.148    forall (integer(8)::j=jfoo():jbar())149      x(i, j) = x(j, i)150    end forall151  end forall152end subroutine153! CHECK-LABEL:   func.func @_QPtest_nested_foralls() {154! CHECK:  %[[VAL_0:.*]] = arith.constant 10 : i32155! CHECK:  %[[VAL_1:.*]] = arith.constant 1 : i32156! CHECK:  %[[VAL_5:.*]]:2 = hlfir.declare {{.*}}Ex157! CHECK:  %[[VAL_8:.*]]:2 = hlfir.declare {{.*}}Ey158! CHECK:  hlfir.forall lb {159! CHECK:    hlfir.yield %[[VAL_1]] : i32160! CHECK:  } ub {161! CHECK:    hlfir.yield %[[VAL_0]] : i32162! CHECK:  }  (%[[VAL_9:.*]]: i64) {163! CHECK:    hlfir.region_assign {164! CHECK:      %[[VAL_10:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_9]])  : (!fir.ref<!fir.array<10xi32>>, i64) -> !fir.ref<i32>165! CHECK:      %[[VAL_11:.*]] = fir.load %[[VAL_10]] : !fir.ref<i32>166! CHECK:      hlfir.yield %[[VAL_11]] : i32167! CHECK:    } to {168! CHECK:      %[[VAL_12:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_9]], %[[VAL_9]])  : (!fir.ref<!fir.array<10x10xi32>>, i64, i64) -> !fir.ref<i32>169! CHECK:      hlfir.yield %[[VAL_12]] : !fir.ref<i32>170! CHECK:    }171! CHECK:    hlfir.forall lb {172! CHECK:      %[[VAL_13:.*]] = fir.call @_QPjfoo() proc_attrs<pure> fastmath<contract> : () -> i64173! CHECK:      hlfir.yield %[[VAL_13]] : i64174! CHECK:    } ub {175! CHECK:      %[[VAL_14:.*]] = fir.call @_QPjbar() proc_attrs<pure> fastmath<contract> : () -> i64176! CHECK:      hlfir.yield %[[VAL_14]] : i64177! CHECK:    }  (%[[VAL_15:.*]]: i64) {178! CHECK:      hlfir.region_assign {179! CHECK:        %[[VAL_16:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_15]], %[[VAL_9]])  : (!fir.ref<!fir.array<10x10xi32>>, i64, i64) -> !fir.ref<i32>180! CHECK:        %[[VAL_17:.*]] = fir.load %[[VAL_16]] : !fir.ref<i32>181! CHECK:        hlfir.yield %[[VAL_17]] : i32182! CHECK:      } to {183! CHECK:        %[[VAL_18:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_9]], %[[VAL_15]])  : (!fir.ref<!fir.array<10x10xi32>>, i64, i64) -> !fir.ref<i32>184! CHECK:        hlfir.yield %[[VAL_18]] : !fir.ref<i32>185! CHECK:      }186! CHECK:    }187! CHECK:  }188