brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.6 KiB · e113c26 Raw
158 lines · plain
1! RUN: bbc -emit-fir %s -o - | FileCheck %s2! RUN: bbc -emit-fir -fwrapv %s -o - | FileCheck %s --check-prefix=NO-NSW3 4! NO-NSW-NOT: overflow<nsw>5 6subroutine subscript(a, i, j, k)7  integer :: a(:,:,:), i, j, k8  a(i+1, j-2, k*3) = 59end subroutine10! CHECK-LABEL:   func.func @_QPsubscript(11! CHECK:           %[[VAL_4:.*]] = arith.constant 3 : i3212! CHECK:           %[[VAL_5:.*]] = arith.constant 2 : i3213! CHECK:           %[[VAL_6:.*]] = arith.constant 1 : i3214! CHECK:           %[[VAL_9:.*]] = fir.declare %{{.*}}a"} : (!fir.box<!fir.array<?x?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?x?xi32>>15! CHECK:           %[[VAL_10:.*]] = fir.rebox %[[VAL_9]] : (!fir.box<!fir.array<?x?x?xi32>>) -> !fir.box<!fir.array<?x?x?xi32>>16! CHECK:           %[[VAL_11:.*]] = fir.declare %{{.*}}i"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>17! CHECK:           %[[VAL_12:.*]] = fir.declare %{{.*}}j"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>18! CHECK:           %[[VAL_13:.*]] = fir.declare %{{.*}}k"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>19! CHECK:           %[[VAL_14:.*]] = fir.load %[[VAL_11]] : !fir.ref<i32>20! CHECK:           %[[VAL_15:.*]] = arith.addi %[[VAL_14]], %[[VAL_6]] overflow<nsw> : i3221! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i6422! CHECK:           %[[VAL_17:.*]] = fir.load %[[VAL_12]] : !fir.ref<i32>23! CHECK:           %[[VAL_18:.*]] = arith.subi %[[VAL_17]], %[[VAL_5]] overflow<nsw> : i3224! CHECK:           %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i32) -> i6425! CHECK:           %[[VAL_20:.*]] = fir.load %[[VAL_13]] : !fir.ref<i32>26! CHECK:           %[[VAL_21:.*]] = arith.muli %[[VAL_20]], %[[VAL_4]] overflow<nsw> : i3227! CHECK:           %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (i32) -> i6428! CHECK:           %[[VAL_23:.*]] = fir.array_coor %[[VAL_10]] %[[VAL_16]], %[[VAL_19]], %[[VAL_22]] :29 30! Test that nsw is never added to arith ops31! on vector subscripts.32subroutine vector_subscript_as_value(x, y, z)33  integer :: x(100)34  integer(8) :: y(20), z(20)35  call bar(x(y+z))36end subroutine37! CHECK-LABEL:   func.func @_QPvector_subscript_as_value(38! CHECK-NOT: overflow<nsw>39! CHECK:           return40 41subroutine vector_subscript_lhs(x, vector1, vector2)42  integer(8) :: vector1(10), vector2(10)43  real :: x(:)44  x(vector1+vector2) = 42.45end subroutine46! CHECK-LABEL:   func.func @_QPvector_subscript_lhs(47! CHECK-NOT: overflow<nsw>48! CHECK:           return49 50! Test that nsw is never added to arith ops51! on arguments of bitwise comparison intrinsics.52subroutine bitwise_comparison(a, b)53  integer :: a, b54  print *, bge(a+b, a-b)55  print *, bgt(a+b, a-b)56  print *, ble(a+b, a-b)57  print *, blt(a+b, a-b)58end subroutine59! CHECK-LABEL:   func.func @_QPbitwise_comparison(60! CHECK-NOT: overflow<nsw>61! CHECK:           return62 63subroutine loop_params(a,lb,ub,st)64  integer :: i, lb, ub, st65  integer :: a(lb:ub)66  do i = lb+1, ub-1, st*267    a(i) = i68  end do69end subroutine70! CHECK-LABEL:   func.func @_QPloop_params(71! CHECK:           %[[VAL_4:.*]] = arith.constant 2 : i3272! CHECK:           %[[VAL_5:.*]] = arith.constant 1 : i3273! CHECK:           %[[VAL_9:.*]] = fir.declare %{{.*}}lb"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>74! CHECK:           %[[VAL_10:.*]] = fir.declare %{{.*}}ub"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>75! CHECK:           %[[VAL_12:.*]] = fir.declare %{{.*}}i"} : (!fir.ref<i32>) -> !fir.ref<i32>76! CHECK:           %[[VAL_13:.*]] = fir.declare %{{.*}}st"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>77! CHECK:           %[[VAL_14:.*]] = fir.load %[[VAL_9]] : !fir.ref<i32>78! CHECK:           %[[VAL_16:.*]] = fir.load %[[VAL_10]] : !fir.ref<i32>79! CHECK:           %[[VAL_25:.*]] = arith.addi %[[VAL_14]], %[[VAL_5]] overflow<nsw> : i3280! CHECK:           %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i32) -> index81! CHECK:           %[[VAL_27:.*]] = arith.subi %[[VAL_16]], %[[VAL_5]] overflow<nsw> : i3282! CHECK:           %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i32) -> index83! CHECK:           %[[VAL_29:.*]] = fir.load %[[VAL_13]] : !fir.ref<i32>84! CHECK:           %[[VAL_30:.*]] = arith.muli %[[VAL_29]], %[[VAL_4]] overflow<nsw> : i3285! CHECK:           %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (i32) -> index86! CHECK:           %[[VAL_32:.*]] = fir.convert %[[VAL_26]] : (index) -> i3287! CHECK:           %[[VAL_33:.*]] = fir.do_loop %[[VAL_34:.*]] = %[[VAL_26]] to %[[VAL_28]] step %[[VAL_31]] iter_args(%[[VAL_35:.*]] = %[[VAL_32]]) -> (i32) {88 89subroutine loop_params2(a,lb,ub,st)90  integer :: i, lb, ub, st91  integer :: a(lb:ub)92  real :: ii93  do ii = lb+1, ub-1, st*294    i = ii95    a(i) = i96  end do97end subroutine98! CHECK-LABEL:   func.func @_QPloop_params2(99! CHECK:           %[[VAL_4:.*]] = arith.constant 2 : i32100! CHECK:           %[[VAL_5:.*]] = arith.constant 1 : i32101! CHECK:           %[[VAL_6:.*]] = arith.constant 0 : index102! CHECK:           %[[VAL_8:.*]] = fir.alloca index103! CHECK:           %[[VAL_9:.*]] = fir.alloca f32104! CHECK:           %[[VAL_11:.*]] = fir.declare %{{.*}}lb"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>105! CHECK:           %[[VAL_12:.*]] = fir.declare %{{.*}}ub"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>106! CHECK:           %[[VAL_14:.*]] = fir.declare %{{.*}}i"} : (!fir.ref<i32>) -> !fir.ref<i32>107! CHECK:           %[[VAL_16:.*]] = fir.declare %{{.*}}ii"} : (!fir.ref<f32>) -> !fir.ref<f32>108! CHECK:           %[[VAL_17:.*]] = fir.declare %{{.*}}st"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>109! CHECK:           %[[VAL_18:.*]] = fir.load %[[VAL_11]] : !fir.ref<i32>110! CHECK:           %[[VAL_20:.*]] = fir.load %[[VAL_12]] : !fir.ref<i32>111! CHECK:           %[[VAL_29:.*]] = arith.addi %[[VAL_18]], %[[VAL_5]] overflow<nsw> : i32112! CHECK:           %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i32) -> f32113! CHECK:           %[[VAL_31:.*]] = arith.subi %[[VAL_20]], %[[VAL_5]] overflow<nsw> : i32114! CHECK:           %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (i32) -> f32115! CHECK:           %[[VAL_33:.*]] = fir.load %[[VAL_17]] : !fir.ref<i32>116! CHECK:           %[[VAL_34:.*]] = arith.muli %[[VAL_33]], %[[VAL_4]] overflow<nsw> : i32117! CHECK:           %[[VAL_35:.*]] = fir.convert %[[VAL_34]] : (i32) -> f32118! CHECK:           fir.store %[[VAL_35]] to %[[VAL_9]] : !fir.ref<f32>119! CHECK:           %[[VAL_36:.*]] = arith.subf %[[VAL_32]], %[[VAL_30]] fastmath<contract> : f32120! CHECK:           %[[VAL_37:.*]] = arith.addf %[[VAL_36]], %[[VAL_35]] fastmath<contract> : f32121! CHECK:           %[[VAL_38:.*]] = arith.divf %[[VAL_37]], %[[VAL_35]] fastmath<contract> : f32122! CHECK:           %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (f32) -> index123! CHECK:           fir.store %[[VAL_39]] to %[[VAL_8]] : !fir.ref<index>124! CHECK:           fir.store %[[VAL_30]] to %[[VAL_16]] : !fir.ref<f32>125! CHECK:           cf.br ^bb1126! CHECK:         ^bb1:127! CHECK:           %[[VAL_40:.*]] = fir.load %[[VAL_8]] : !fir.ref<index>128! CHECK:           %[[VAL_41:.*]] = arith.cmpi sgt, %[[VAL_40]], %[[VAL_6]] : index129! CHECK:           cf.cond_br %[[VAL_41]], ^bb2, ^bb3130! CHECK:         ^bb2:131 132subroutine loop_params3(a,lb,ub,st)133  integer :: i, lb, ub, st134  integer :: a(lb:ub)135  do concurrent (i=lb+1:ub-1:st*2)136    a(i) = i137  end do138end subroutine139! CHECK-LABEL:   func.func @_QPloop_params3(140! CHECK:           %[[VAL_4:.*]] = arith.constant 2 : i32141! CHECK:           %[[VAL_5:.*]] = arith.constant 1 : i32142! CHECK:           %[[VAL_11:.*]] = fir.declare %{{.*}}lb"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>143! CHECK:           %[[VAL_12:.*]] = fir.declare %{{.*}}ub"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>144! CHECK:           %[[VAL_14:.*]] = fir.declare %{{.*}}i"} : (!fir.ref<i32>) -> !fir.ref<i32>145! CHECK:           %[[VAL_15:.*]] = fir.declare %{{.*}}st"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>146! CHECK:           %[[VAL_16:.*]] = fir.load %[[VAL_11]] : !fir.ref<i32>147! CHECK:           %[[VAL_18:.*]] = fir.load %[[VAL_12]] : !fir.ref<i32>148! CHECK:           %[[VAL_27:.*]] = arith.addi %[[VAL_16]], %[[VAL_5]] overflow<nsw> : i32149! CHECK:           %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i32) -> index150! CHECK:           %[[VAL_29:.*]] = arith.subi %[[VAL_18]], %[[VAL_5]] overflow<nsw> : i32151! CHECK:           %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i32) -> index152! CHECK:           %[[VAL_31:.*]] = fir.load %[[VAL_15]] : !fir.ref<i32>153! CHECK:           %[[VAL_32:.*]] = arith.muli %[[VAL_31]], %[[VAL_4]] overflow<nsw> : i32154! CHECK:           %[[VAL_33:.*]] = fir.convert %[[VAL_32]] : (i32) -> index155! CHECK:           fir.do_concurrent {156! CHECK:             %[[VAL_9:.*]] = fir.declare %{{.*}}i"} : (!fir.ref<i32>) -> !fir.ref<i32>157! CHECK:             fir.do_concurrent.loop (%[[VAL_34:.*]]) = (%[[VAL_28]]) to (%[[VAL_30]]) step (%[[VAL_33]]) {158