@@ -230,3 +230,32 @@ void callS() {
230
230
S s ;
231
231
passS (s );
232
232
}
233
+
234
+ typedef struct {
235
+ uint8_t a ;
236
+ uint16_t b ;
237
+ uint8_t c ;
238
+ } S_PAD ;
239
+
240
+ // CHECK: cir.func {{.*@ret_s_pad}}() -> !u48i
241
+ // CHECK: %[[#V0:]] = cir.alloca !ty_S_PAD, !cir.ptr<!ty_S_PAD>, ["__retval"] {alignment = 2 : i64}
242
+ // CHECK: %[[#V1:]] = cir.load %[[#V0]] : !cir.ptr<!ty_S_PAD>, !ty_S_PAD
243
+ // CHECK: %[[#V2:]] = cir.alloca !u48i, !cir.ptr<!u48i>, [""] {alignment = 2 : i64}
244
+ // CHECK: %[[#V3:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!ty_S_PAD>)
245
+ // CHECK: %[[#V4:]] = cir.cast(bitcast, %[[#V2:]] : !cir.ptr<!u48i>), !cir.ptr<!void>
246
+ // CHECK: %[[#V5:]] = cir.const #cir.int<6> : !u64i
247
+ // CHECK: cir.libc.memcpy %[[#V5]] bytes from %[[#V3]] to %[[#V4]] : !u64i, !cir.ptr<!void>
248
+ // CHECK: %[[#V6:]] = cir.load %[[#V2]] : !cir.ptr<!u48i>
249
+ // CHECK: cir.return %[[#V6]]
250
+
251
+ // LLVM: i48 @ret_s_pad()
252
+ // LLVM: %[[#V1:]] = alloca %struct.S_PAD, i64 1, align 2
253
+ // LLVM: %[[#V2:]] = load %struct.S_PAD, ptr %[[#V1]], align 2
254
+ // LLVM: %[[#V3:]] = alloca i48, i64 1, align 2
255
+ // LLVM: call void @llvm.memcpy.p0.p0.i64(ptr %[[#V3]], ptr %[[#V1]], i64 6, i1 false)
256
+ // LLVM: %[[#V4:]] = load i48, ptr %[[#V3]]
257
+ // LLVM: ret i48 %[[#V4]]
258
+ S_PAD ret_s_pad () {
259
+ S_PAD s ;
260
+ return s ;
261
+ }
0 commit comments