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