@@ -33,3 +33,55 @@ struct HasScalarArrayMember {
33
33
// LLVM-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr %[[#THIS_ARR]], ptr %[[#OTHER_ARR]], i32 16, i1 false)
34
34
// LLVM-NEXT: ret void
35
35
HasScalarArrayMember::HasScalarArrayMember (const HasScalarArrayMember &) = default;
36
+
37
+ struct Trivial { int *i; };
38
+ struct ManyMembers {
39
+ int i;
40
+ int j;
41
+ Trivial k;
42
+ int l[1 ];
43
+ int m[2 ];
44
+ Trivial n;
45
+ int &o;
46
+ int *p;
47
+ };
48
+
49
+ // CIR-LABEL: cir.func linkonce_odr @_ZN11ManyMembersC2ERKS_(
50
+ // CIR: %[[#THIS_LOAD:]] = cir.load %[[#]]
51
+ // CIR-NEXT: %[[#THIS_I:]] = cir.get_member %[[#THIS_LOAD]][0] {name = "i"}
52
+ // CIR-NEXT: %[[#OTHER_LOAD:]] = cir.load %[[#OTHER:]]
53
+ // CIR-NEXT: %[[#OTHER_I:]] = cir.get_member %[[#OTHER_LOAD]][0] {name = "i"}
54
+ // CIR-NEXT: %[[#MEMCPY_SIZE:]] = cir.const #cir.int<8>
55
+ // CIR-NEXT: %[[#THIS_I_CAST:]] = cir.cast(bitcast, %[[#THIS_I]] : !cir.ptr<!s32i>), !cir.ptr<!void>
56
+ // CIR-NEXT: %[[#OTHER_I_CAST:]] = cir.cast(bitcast, %[[#OTHER_I]] : !cir.ptr<!s32i>), !cir.ptr<!void>
57
+ // CIR-NEXT: cir.libc.memcpy %[[#MEMCPY_SIZE]] bytes from %[[#OTHER_I_CAST]] to %[[#THIS_I_CAST]]
58
+ // CIR-NEXT: %[[#THIS_K:]] = cir.get_member %[[#THIS_LOAD]][2] {name = "k"}
59
+ // CIR-NEXT: %[[#OTHER_LOAD:]] = cir.load %[[#OTHER]]
60
+ // CIR-NEXT: %[[#OTHER_K:]] = cir.get_member %[[#OTHER_LOAD]][2] {name = "k"}
61
+ // CIR-NEXT: cir.call @_ZN7TrivialC1ERKS_(%[[#THIS_K]], %[[#OTHER_K]])
62
+ // CIR-NEXT: %[[#THIS_L:]] = cir.get_member %[[#THIS_LOAD]][3] {name = "l"}
63
+ // CIR-NEXT: %[[#OTHER_LOAD:]] = cir.load %[[#OTHER]]
64
+ // CIR-NEXT: %[[#OTHER_L:]] = cir.get_member %[[#OTHER_LOAD]][3] {name = "l"}
65
+ // CIR-NEXT: %[[#MEMCPY_SIZE:]] = cir.const #cir.int<12>
66
+ // CIR-NEXT: %[[#THIS_L_CAST:]] = cir.cast(bitcast, %[[#THIS_L]] : !cir.ptr<!cir.array<!s32i x 1>>), !cir.ptr<!void>
67
+ // CIR-NEXT: %[[#OTHER_L_CAST:]] = cir.cast(bitcast, %[[#OTHER_L]] : !cir.ptr<!cir.array<!s32i x 1>>), !cir.ptr<!void>
68
+ // CIR-NEXT: cir.libc.memcpy %[[#MEMCPY_SIZE]] bytes from %[[#OTHER_L_CAST]] to %[[#THIS_L_CAST]]
69
+ // CIR-NEXT: %[[#THIS_N:]] = cir.get_member %[[#THIS_LOAD]][5] {name = "n"}
70
+ // CIR-NEXT: %[[#OTHER_LOAD:]] = cir.load %[[#OTHER]]
71
+ // CIR-NEXT: %[[#OTHER_N:]] = cir.get_member %[[#OTHER_LOAD]][5] {name = "n"}
72
+ // CIR-NEXT: cir.call @_ZN7TrivialC1ERKS_(%[[#THIS_N]], %[[#OTHER_N]])
73
+ // CIR-NEXT: %[[#THIS_O:]] = cir.get_member %[[#THIS_LOAD]][6] {name = "o"}
74
+ // CIR-NEXT: %[[#OTHER_LOAD:]] = cir.load %[[#OTHER]]
75
+ // CIR-NEXT: %[[#OTHER_O:]] = cir.get_member %[[#OTHER_LOAD]][6] {name = "o"}
76
+ // CIR-NEXT: %[[#MEMCPY_SIZE:]] = cir.const #cir.int<16>
77
+ // CIR-NEXT: %[[#THIS_O_CAST:]] = cir.cast(bitcast, %[[#THIS_O]] : !cir.ptr<!cir.ptr<!s32i>>), !cir.ptr<!void>
78
+ // CIR-NEXT: %[[#OTHER_O_CAST:]] = cir.cast(bitcast, %[[#OTHER_O]] : !cir.ptr<!cir.ptr<!s32i>>), !cir.ptr<!void>
79
+ // CIR-NEXT: cir.libc.memcpy %[[#MEMCPY_SIZE]] bytes from %[[#OTHER_O_CAST]] to %[[#THIS_O_CAST]]
80
+ // CIR-NEXT: cir.return
81
+ // CIR-NEXT: }
82
+
83
+ // CIR-LABEL: cir.func @_Z6doCopyR11ManyMembers(
84
+ // CIR: cir.call @_ZN11ManyMembersC1ERKS_(
85
+ ManyMembers doCopy (ManyMembers &src) {
86
+ return src;
87
+ }
0 commit comments