77 lines · plain
1// RUN: cir-opt -cir-canonicalize -cir-simplify -o %t.cir %s2// RUN: FileCheck --input-file=%t.cir %s3 4!s32i = !cir.int<s, 32>5 6module {7 cir.func @fold_ternary(%arg0: !s32i, %arg1: !s32i) -> !s32i {8 %0 = cir.const #cir.bool<false> : !cir.bool9 %1 = cir.ternary (%0, true {10 cir.yield %arg0 : !s32i11 }, false {12 cir.yield %arg1 : !s32i13 }) : (!cir.bool) -> !s32i14 cir.return %1 : !s32i15 }16 17 // CHECK: cir.func{{.*}} @fold_ternary(%{{.+}}: !s32i, %[[ARG:.+]]: !s32i) -> !s32i {18 // CHECK-NEXT: cir.return %[[ARG]] : !s32i19 // CHECK-NEXT: }20 21 cir.func @simplify_ternary(%arg0 : !cir.bool, %arg1 : !s32i) -> !s32i {22 %0 = cir.ternary (%arg0, true {23 %1 = cir.const #cir.int<42> : !s32i24 cir.yield %1 : !s32i25 }, false {26 cir.yield %arg1 : !s32i27 }) : (!cir.bool) -> !s32i28 cir.return %0 : !s32i29 }30 31 // CHECK: cir.func{{.*}} @simplify_ternary(%[[ARG0:.+]]: !cir.bool, %[[ARG1:.+]]: !s32i) -> !s32i {32 // CHECK-NEXT: %[[#A:]] = cir.const #cir.int<42> : !s32i33 // CHECK-NEXT: %[[#B:]] = cir.select if %[[ARG0]] then %[[#A]] else %[[ARG1]] : (!cir.bool, !s32i, !s32i) -> !s32i34 // CHECK-NEXT: cir.return %[[#B]] : !s32i35 // CHECK-NEXT: }36 37 cir.func @simplify_ternary_false_const(%arg0 : !cir.bool, %arg1 : !s32i) -> !s32i {38 %0 = cir.ternary (%arg0, true {39 cir.yield %arg1 : !s32i40 }, false {41 %1 = cir.const #cir.int<24> : !s32i42 cir.yield %1 : !s32i43 }) : (!cir.bool) -> !s32i44 cir.return %0 : !s32i45 }46 47 // CHECK: cir.func{{.*}} @simplify_ternary_false_const(%[[ARG0:.+]]: !cir.bool, %[[ARG1:.+]]: !s32i) -> !s32i {48 // CHECK-NEXT: %[[#A:]] = cir.const #cir.int<24> : !s32i49 // CHECK-NEXT: %[[#B:]] = cir.select if %[[ARG0]] then %[[ARG1]] else %[[#A]] : (!cir.bool, !s32i, !s32i) -> !s32i50 // CHECK-NEXT: cir.return %[[#B]] : !s32i51 // CHECK-NEXT: }52 53 cir.func @non_simplifiable_ternary(%arg0 : !cir.bool) -> !s32i {54 %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init]55 %1 = cir.ternary (%arg0, true {56 %2 = cir.const #cir.int<42> : !s32i57 cir.yield %2 : !s32i58 }, false {59 %3 = cir.load %0 : !cir.ptr<!s32i>, !s32i60 cir.yield %3 : !s32i61 }) : (!cir.bool) -> !s32i62 cir.return %1 : !s32i63 }64 65 // CHECK: cir.func{{.*}} @non_simplifiable_ternary(%[[ARG0:.+]]: !cir.bool) -> !s32i {66 // CHECK-NEXT: %[[#A:]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init]67 // CHECK-NEXT: %[[#B:]] = cir.ternary(%[[ARG0]], true {68 // CHECK-NEXT: %[[#C:]] = cir.const #cir.int<42> : !s32i69 // CHECK-NEXT: cir.yield %[[#C]] : !s32i70 // CHECK-NEXT: }, false {71 // CHECK-NEXT: %[[#D:]] = cir.load %[[#A]] : !cir.ptr<!s32i>, !s32i72 // CHECK-NEXT: cir.yield %[[#D]] : !s32i73 // CHECK-NEXT: }) : (!cir.bool) -> !s32i74 // CHECK-NEXT: cir.return %[[#B]] : !s32i75 // CHECK-NEXT: }76}77