1
+ // RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -fclangir -fclangir-call-conv-lowering -emit-cir-flat -mmlir --mlir-print-ir-after=cir-call-conv-lowering %s -o %t.cir
2
+ // RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR
3
+ // RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t.ll -fclangir-call-conv-lowering
4
+ // RUN: FileCheck --input-file=%t.ll %s -check-prefix=LLVM
5
+
6
+ // CIR: !ty_U = !cir.struct<union "U" {!s32i, !s32i, !s32i}>
7
+ // LLVM: %union.U = type { i32 }
8
+ typedef union {
9
+ int a , b , c ;
10
+ } U ;
11
+
12
+ // CIR: cir.func @foo(%arg0: !u64i
13
+ // CIR: %[[#V0:]] = cir.alloca !ty_U, !cir.ptr<!ty_U>, [""] {alignment = 4 : i64}
14
+ // CIR: %[[#V1:]] = cir.cast(integral, %arg0 : !u64i), !u32i
15
+ // CIR: %[[#V2:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!ty_U>), !cir.ptr<!u32i>
16
+ // CIR: cir.store %[[#V1]], %[[#V2]] : !u32i, !cir.ptr<!u32i>
17
+ // CIR: cir.return
18
+
19
+ // LLVM: void @foo(i64 %[[#V0:]]
20
+ // LLVM: %[[#V2:]] = alloca %union.U, i64 1, align 4
21
+ // LLVM: %[[#V3:]] = trunc i64 %[[#V0]] to i32
22
+ // LLVM: store i32 %[[#V3]], ptr %[[#V2]], align 4
23
+ // LLVM: ret void
24
+ void foo (U u ) {}
25
+
26
+ // CIR: cir.func no_proto @init() -> !u32i
27
+ // CIR: %[[#V0:]] = cir.alloca !ty_U, !cir.ptr<!ty_U>, ["__retval"] {alignment = 4 : i64}
28
+ // CIR: %[[#V1:]] = cir.load %[[#V0]] : !cir.ptr<!ty_U>, !ty_U
29
+ // CIR: %[[#V2:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!ty_U>), !cir.ptr<!u32i>
30
+ // CIR: %[[#V3:]] = cir.load %[[#V2]] : !cir.ptr<!u32i>, !u32i
31
+ // CIR: cir.return %[[#V3]] : !u32i
32
+
33
+ // LLVM: i32 @init()
34
+ // LLVM: %[[#V1:]] = alloca %union.U, i64 1, align 4
35
+ // LLVM: %[[#V2:]] = load %union.U, ptr %[[#V1]], align 4
36
+ // LLVM: %[[#V3:]] = load i32, ptr %[[#V1]], align 4
37
+ // LLVM: ret i32 %[[#V3]]
38
+ U init () {
39
+ U u ;
40
+ return u ;
41
+ }
0 commit comments