96 lines · plain
1// RUN: cir-opt %s -cir-to-llvm -o %t.cir2// RUN: FileCheck %s --input-file=%t.cir3 4!s16i = !cir.int<s, 16>5!s32i = !cir.int<s, 32>6!s64i = !cir.int<s, 64>7!s8i = !cir.int<s, 8>8!u32i = !cir.int<u, 32>9!u8i = !cir.int<u, 8>10!u64i = !cir.int<u, 64>11 12module {13 cir.func @cStyleCasts(%arg0: !u32i, %arg1: !s32i, %arg2: !cir.float, %arg3: !cir.double) -> !s32i {14 // CHECK: llvm.func @cStyleCasts15 %0 = cir.alloca !u32i, !cir.ptr<!u32i>, ["x1", init] {alignment = 4 : i64}16 %1 = cir.alloca !s32i, !cir.ptr<!s32i>, ["x2", init] {alignment = 4 : i64}17 %20 = cir.alloca !s16i, !cir.ptr<!s16i>, ["x4", init] {alignment = 2 : i64}18 %2 = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}19 %3 = cir.alloca !s8i, !cir.ptr<!s8i>, ["a", init] {alignment = 1 : i64}20 %4 = cir.alloca !s16i, !cir.ptr<!s16i>, ["b", init] {alignment = 2 : i64}21 %5 = cir.alloca !s64i, !cir.ptr<!s64i>, ["c", init] {alignment = 8 : i64}22 %6 = cir.alloca !s64i, !cir.ptr<!s64i>, ["d", init] {alignment = 8 : i64}23 %8 = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["e", init] {alignment = 8 : i64}24 cir.store %arg0, %0 : !u32i, !cir.ptr<!u32i>25 cir.store %arg1, %1 : !s32i, !cir.ptr<!s32i>26 27 // Integer casts.28 %9 = cir.load %0 : !cir.ptr<!u32i>, !u32i29 %10 = cir.cast integral %9 : !u32i -> !s8i30 // CHECK: %{{[0-9]+}} = llvm.trunc %{{[0-9]+}} : i32 to i831 cir.store %10, %3 : !s8i, !cir.ptr<!s8i>32 %11 = cir.load %1 : !cir.ptr<!s32i>, !s32i33 %12 = cir.cast integral %11 : !s32i -> !s16i34 // CHECK: %{{[0-9]+}} = llvm.trunc %{{[0-9]+}} : i32 to i1635 cir.store %12, %4 : !s16i, !cir.ptr<!s16i>36 %13 = cir.load %0 : !cir.ptr<!u32i>, !u32i37 %14 = cir.cast integral %13 : !u32i -> !s64i38 // CHECK: %{{[0-9]+}} = llvm.zext %{{[0-9]+}} : i32 to i6439 cir.store %14, %5 : !s64i, !cir.ptr<!s64i>40 %15 = cir.load %1 : !cir.ptr<!s32i>, !s32i41 %16 = cir.cast integral %15 : !s32i -> !s64i42 // CHECK: %{{[0-9]+}} = llvm.sext %{{[0-9]+}} : i32 to i6443 %30 = cir.cast integral %arg1 : !s32i -> !u32i44 // Should not produce a cast.45 %32 = cir.cast integral %arg0 : !u32i -> !s32i46 // Should not produce a cast.47 %21 = cir.load %20 : !cir.ptr<!s16i>, !s16i48 %22 = cir.cast integral %21 : !s16i -> !u64i49 // CHECK: %[[TMP:[0-9]+]] = llvm.sext %{{[0-9]+}} : i16 to i6450 %33 = cir.cast int_to_bool %arg1 : !s32i -> !cir.bool51 // CHECK: %[[#ZERO:]] = llvm.mlir.constant(0 : i32) : i3252 // CHECK: %[[#CMP:]] = llvm.icmp "ne" %arg1, %[[#ZERO]] : i3253 54 // Pointer casts.55 cir.store %16, %6 : !s64i, !cir.ptr<!s64i>56 %23 = cir.cast int_to_ptr %22 : !u64i -> !cir.ptr<!u8i>57 // CHECK: %[[TMP2:[0-9]+]] = llvm.inttoptr %[[TMP]] : i64 to !llvm.ptr58 %24 = cir.cast ptr_to_int %23 : !cir.ptr<!u8i> -> !s32i59 // CHECK: %{{[0-9]+}} = llvm.ptrtoint %[[TMP2]] : !llvm.ptr to i3260 %29 = cir.cast ptr_to_bool %23 : !cir.ptr<!u8i> -> !cir.bool61 62 // Floating point casts.63 %25 = cir.cast int_to_float %arg1 : !s32i -> !cir.float64 // CHECK: %{{.+}} = llvm.sitofp %{{.+}} : i32 to f3265 %26 = cir.cast int_to_float %arg0 : !u32i -> !cir.float66 // CHECK: %{{.+}} = llvm.uitofp %{{.+}} : i32 to f3267 %27 = cir.cast float_to_int %arg2 : !cir.float -> !s32i68 // CHECK: %{{.+}} = llvm.fptosi %{{.+}} : f32 to i3269 %28 = cir.cast float_to_int %arg2 : !cir.float -> !u32i70 // CHECK: %{{.+}} = llvm.fptoui %{{.+}} : f32 to i3271 %18 = cir.const #cir.int<0> : !s32i72 // CHECK: %{{.+}} = llvm.fptrunc %{{.+}} : f64 to f3273 %34 = cir.cast floating %arg3 : !cir.double -> !cir.float74 75 cir.store %18, %2 : !s32i, !cir.ptr<!s32i>76 %19 = cir.load %2 : !cir.ptr<!s32i>, !s32i77 cir.return %19 : !s32i78 }79 80 cir.func @testBoolToIntCast(%arg0: !cir.bool) {81 // CHECK: llvm.func @testBoolToIntCast82 %0 = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["bl", init] {alignment = 1 : i64}83 %1 = cir.alloca !u8i, !cir.ptr<!u8i>, ["y", init] {alignment = 1 : i64}84 cir.store %arg0, %0 : !cir.bool, !cir.ptr<!cir.bool>85 86 %2 = cir.load %0 : !cir.ptr<!cir.bool>, !cir.bool87 %3 = cir.cast bool_to_int %2 : !cir.bool -> !u8i88 // CHECK: %[[LOAD_BOOL:.*]] = llvm.load %{{.*}} : !llvm.ptr -> i889 // CHECK: %[[TRUNC:.*]] = llvm.trunc %[[LOAD_BOOL]] : i8 to i190 // CHECK: %[[EXT:.*]] = llvm.zext %[[TRUNC]] : i1 to i891 92 cir.store %3, %1 : !u8i, !cir.ptr<!u8i>93 cir.return94 }95}96