22// RUN: FileCheck %s --input-file=%t.cir -check-prefix=MLIR
33
44!s32i = !cir.int<s, 32>
5+ !rec_A = !cir.record<union "A" {!s32i}>
6+ !rec_anon2E0 = !cir.record<union "anon.0" {!rec_A} #cir.record.decl.ast>
57
68module {
79cir.func @_Z1xi(%arg0: !s32i) -> !s32i {
@@ -22,7 +24,6 @@ cir.func @_Z1xi(%arg0: !s32i) -> !s32i {
2224 %6 = cir.load %1 : !cir.ptr<!s32i>, !s32i
2325 cir.return %6 : !s32i
2426 }
25- }
2627
2728// MLIR: llvm.func @_Z1xi(%arg0: i32) -> i32
2829// MLIR-NEXT: %0 = llvm.mlir.constant(1 : index) : i64
@@ -45,3 +46,66 @@ cir.func @_Z1xi(%arg0: !s32i) -> !s32i {
4546// MLIR-NEXT: %10 = llvm.load %3 {alignment = 4 : i64} : !llvm.ptr -> i32
4647// MLIR-NEXT: llvm.return %10 : i32
4748// MLIR-NEXT: }
49+
50+ cir.global external dso_local @a = #cir.zero : !cir.array<!rec_anon2E0 x 1> {alignment = 4 : i64}
51+ cir.func no_proto dso_local @B() -> !rec_A {
52+ %0 = cir.alloca !rec_A, !cir.ptr<!rec_A>, ["__retval"] {alignment = 4 : i64}
53+ %1 = cir.get_global @a : !cir.ptr<!cir.array<!rec_anon2E0 x 1>>
54+ %2 = cir.cast bitcast %1 : !cir.ptr<!cir.array<!rec_anon2E0 x 1>> -> !cir.ptr<!cir.array<!rec_anon2E0 x 0>>
55+ %3 = cir.get_global @a : !cir.ptr<!cir.array<!rec_anon2E0 x 1>>
56+ %4 = cir.cast bitcast %3 : !cir.ptr<!cir.array<!rec_anon2E0 x 1>> -> !cir.ptr<!cir.array<!rec_anon2E0 x 0>>
57+ %5 = cir.cast array_to_ptrdecay %4 : !cir.ptr<!cir.array<!rec_anon2E0 x 0>> -> !cir.ptr<!rec_anon2E0>
58+ %6 = cir.const #cir.ptr<null> : !cir.ptr<!rec_anon2E0>
59+ %7 = cir.cmp(lt, %5, %6) : !cir.ptr<!rec_anon2E0>, !cir.bool
60+ %8 = cir.cast bool_to_int %7 : !cir.bool -> !s32i
61+ %9 = cir.ternary(%7, true {
62+ cir.yield %8 : !s32i
63+ }, false {
64+ %14 = cir.get_global @a : !cir.ptr<!cir.array<!rec_anon2E0 x 1>>
65+ %15 = cir.cast bitcast %14 : !cir.ptr<!cir.array<!rec_anon2E0 x 1>> -> !cir.ptr<!cir.array<!rec_anon2E0 x 0>>
66+ %16 = cir.const #cir.int<0> : !s32i
67+ %17 = cir.get_element %15[%16] : (!cir.ptr<!cir.array<!rec_anon2E0 x 0>>, !s32i) -> !cir.ptr<!rec_anon2E0>
68+ %18 = cir.get_member %17[0] {name = "B"} : !cir.ptr<!rec_anon2E0> -> !cir.ptr<!rec_A>
69+ %19 = cir.get_member %18[0] {name = "A"} : !cir.ptr<!rec_A> -> !cir.ptr<!s32i>
70+ %20 = cir.load align(4) %19 : !cir.ptr<!s32i>, !s32i
71+ cir.yield %20 : !s32i
72+ }) : (!cir.bool) -> !s32i
73+ %10 = cir.const #cir.int<0> : !s32i
74+ %11 = cir.binop(sub, %9, %10) nsw : !s32i
75+ %12 = cir.get_element %2[%11] : (!cir.ptr<!cir.array<!rec_anon2E0 x 0>>, !s32i) -> !cir.ptr<!rec_anon2E0>
76+ %13 = cir.load %0 : !cir.ptr<!rec_A>, !rec_A
77+ cir.return %13 : !rec_A
78+ }
79+ // MLIR-LABEL: llvm.func @B() -> !llvm.struct<"union.A", (i32)>
80+ // MLIR: %[[VAL_0:.*]] = llvm.mlir.constant(1 : index) : i64
81+ // MLIR: %[[VAL_1:.*]] = llvm.alloca %[[VAL_0]] x !llvm.struct<"union.A", (i32)> {alignment = 4 : i64} : (i64) -> !llvm.ptr
82+ // MLIR: %[[VAL_2:.*]] = llvm.mlir.addressof @a : !llvm.ptr
83+ // MLIR: %[[VAL_3:.*]] = llvm.bitcast %[[VAL_2]] : !llvm.ptr to !llvm.ptr
84+ // MLIR: %[[VAL_4:.*]] = llvm.mlir.addressof @a : !llvm.ptr
85+ // MLIR: %[[VAL_5:.*]] = llvm.bitcast %[[VAL_4]] : !llvm.ptr to !llvm.ptr
86+ // MLIR: %[[VAL_6:.*]] = llvm.getelementptr %[[VAL_5]][0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<"union.anon.0", (struct<"union.A", (i32)>)>
87+ // MLIR: %[[VAL_7:.*]] = llvm.mlir.zero : !llvm.ptr
88+ // MLIR: %[[VAL_8:.*]] = llvm.icmp "ult" %[[VAL_6]], %[[VAL_7]] : !llvm.ptr
89+ // MLIR: %[[VAL_9:.*]] = llvm.zext %[[VAL_8]] : i1 to i32
90+ // MLIR: llvm.cond_br %[[VAL_8]], ^bb1, ^bb2
91+ // MLIR: ^bb1:
92+ // MLIR: llvm.br ^bb3(%[[VAL_9]] : i32)
93+ // MLIR: ^bb2:
94+ // MLIR: %[[VAL_10:.*]] = llvm.mlir.addressof @a : !llvm.ptr
95+ // MLIR: %[[VAL_11:.*]] = llvm.bitcast %[[VAL_10]] : !llvm.ptr to !llvm.ptr
96+ // MLIR: %[[VAL_12:.*]] = llvm.mlir.constant(0 : i32) : i32
97+ // MLIR: %[[VAL_13:.*]] = llvm.sext %[[VAL_12]] : i32 to i64
98+ // MLIR: %[[VAL_14:.*]] = llvm.getelementptr %[[VAL_11]][0, %[[VAL_13]]] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.array<0 x struct<"union.anon.0", (struct<"union.A", (i32)>)>>
99+ // MLIR: %[[VAL_15:.*]] = llvm.bitcast %[[VAL_14]] : !llvm.ptr to !llvm.ptr
100+ // MLIR: %[[VAL_16:.*]] = llvm.bitcast %[[VAL_15]] : !llvm.ptr to !llvm.ptr
101+ // MLIR: %[[VAL_17:.*]] = llvm.load %[[VAL_16]] {alignment = 4 : i64} : !llvm.ptr -> i32
102+ // MLIR: llvm.br ^bb3(%[[VAL_17]] : i32)
103+ // MLIR: ^bb3(%[[VAL_18:.*]]: i32):
104+ // MLIR: %[[VAL_19:.*]] = llvm.mlir.constant(0 : i32) : i32
105+ // MLIR: %[[VAL_20:.*]] = llvm.sub %[[VAL_18]], %[[VAL_19]] overflow<nsw> : i32
106+ // MLIR: %[[VAL_21:.*]] = llvm.sext %[[VAL_20]] : i32 to i64
107+ // MLIR: %[[VAL_22:.*]] = llvm.getelementptr %[[VAL_3]][0, %[[VAL_21]]] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.array<0 x struct<"union.anon.0", (struct<"union.A", (i32)>)>>
108+ // MLIR: %[[VAL_23:.*]] = llvm.load %[[VAL_1]] {alignment = 4 : i64} : !llvm.ptr -> !llvm.struct<"union.A", (i32)>
109+ // MLIR: llvm.return %[[VAL_23]] : !llvm.struct<"union.A", (i32)>
110+ // MLIR: }
111+ }
0 commit comments