64 lines · plain
1// RUN: cir-opt %s --verify-roundtrip | FileCheck %s2 3!s32i = !cir.int<s, 32>4 5module {6 7cir.func @throw_with_no_return() {8 cir.throw9 cir.unreachable10}11 12// CHECK: cir.func @throw_with_no_return() {13// CHECK: cir.throw14// CHECK: cir.unreachable15// CHECK: }16 17cir.func @throw_with_no_return_2(%arg0: !s32i, %arg1: !s32i) -> !s32i {18 %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init]19 %1 = cir.alloca !s32i, !cir.ptr<!s32i>, ["b", init]20 %2 = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]21 cir.store %arg0, %0 : !s32i, !cir.ptr<!s32i>22 cir.store %arg1, %1 : !s32i, !cir.ptr<!s32i>23 cir.scope {24 %7 = cir.load align(4) %1 : !cir.ptr<!s32i>, !s32i25 %8 = cir.const #cir.int<0> : !s32i26 %9 = cir.cmp(eq, %7, %8) : !s32i, !cir.bool27 cir.if %9 {28 cir.throw29 cir.unreachable30 }31 }32 %3 = cir.load align(4) %0 : !cir.ptr<!s32i>, !s32i33 %4 = cir.load align(4) %1 : !cir.ptr<!s32i>, !s32i34 %5 = cir.binop(div, %3, %4) : !s32i35 cir.store %5, %2 : !s32i, !cir.ptr<!s32i>36 %6 = cir.load %2 : !cir.ptr<!s32i>, !s32i37 cir.return %6 : !s32i38}39 40// CHECK: cir.func @throw_with_no_return_2(%[[ARG_0:.*]]: !s32i, %[[ARG_1:.*]]: !s32i) -> !s32i {41// CHECK: %[[A_ADDR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init]42// CHECK: %[[B_ADDR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["b", init]43// CHECK: %[[RES_ADDR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]44// CHECK: cir.store %[[ARG_0]], %[[A_ADDR]] : !s32i, !cir.ptr<!s32i>45// CHECK: cir.store %[[ARG_1]], %[[B_ADDR]] : !s32i, !cir.ptr<!s32i>46// CHECK: cir.scope {47// CHECK: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!s32i>, !s32i48// CHECK: %[[CONST_0:.*]] = cir.const #cir.int<0> : !s32i49// CHECK: %[[IS_B_ZERO:.*]] = cir.cmp(eq, %[[TMP_B]], %[[CONST_0]]) : !s32i, !cir.bool50// CHECK: cir.if %[[IS_B_ZERO]] {51// CHECK: cir.throw52// CHECK: cir.unreachable53// CHECK: }54// CHECK: }55// CHECK: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!s32i>, !s32i56// CHECK: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!s32i>, !s32i57// CHECK: %[[DIV_A_B:.*]] = cir.binop(div, %[[TMP_A:.*]], %[[TMP_B:.*]]) : !s32i58// CHECK: cir.store %[[DIV_A_B]], %[[RES_ADDR]] : !s32i, !cir.ptr<!s32i>59// CHECK: %[[RESULT:.*]] = cir.load %[[RES_ADDR]] : !cir.ptr<!s32i>, !s32i60// CHECK: cir.return %[[RESULT]] : !s32i61// CHECK: }62 63}64