@@ -17,11 +17,12 @@ struct Sp {
17
17
// CHECK-A64-NEXT: ret void
18
18
//
19
19
// CHECK-A64_32-LABEL: define void @_Z2Tp2Sp(
20
- // CHECK-A64_32-SAME: ptr [[S_COERCE:%.*]]) #[[ATTR0:[0-9]+]] {
20
+ // CHECK-A64_32-SAME: i64 [[S_COERCE:%.*]]) #[[ATTR0:[0-9]+]] {
21
21
// CHECK-A64_32-NEXT: [[ENTRY:.*:]]
22
22
// CHECK-A64_32-NEXT: [[S:%.*]] = alloca [[STRUCT_SP:%.*]], align 4
23
23
// CHECK-A64_32-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_SP]], ptr [[S]], i32 0, i32 0
24
- // CHECK-A64_32-NEXT: store ptr [[S_COERCE]], ptr [[COERCE_DIVE]], align 4
24
+ // CHECK-A64_32-NEXT: [[COERCE_VAL_II:%.*]] = trunc i64 [[S_COERCE]] to i32
25
+ // CHECK-A64_32-NEXT: store i32 [[COERCE_VAL_II]], ptr [[COERCE_DIVE]], align 4
25
26
// CHECK-A64_32-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SP]], ptr [[S]], i32 0, i32 0
26
27
// CHECK-A64_32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 4
27
28
// CHECK-A64_32-NEXT: store i32 1, ptr [[TMP0]], align 4
@@ -43,11 +44,10 @@ struct Spp {
43
44
// CHECK-A64-NEXT: ret void
44
45
//
45
46
// CHECK-A64_32-LABEL: define void @_Z3Tpp3Spp(
46
- // CHECK-A64_32-SAME: ptr [[S_COERCE:%.*]]) #[[ATTR0]] {
47
+ // CHECK-A64_32-SAME: i64 [[S_COERCE:%.*]]) #[[ATTR0]] {
47
48
// CHECK-A64_32-NEXT: [[ENTRY:.*:]]
48
49
// CHECK-A64_32-NEXT: [[S:%.*]] = alloca [[STRUCT_SPP:%.*]], align 4
49
- // CHECK-A64_32-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_SPP]], ptr [[S]], i32 0, i32 0
50
- // CHECK-A64_32-NEXT: store ptr [[S_COERCE]], ptr [[COERCE_DIVE]], align 4
50
+ // CHECK-A64_32-NEXT: store i64 [[S_COERCE]], ptr [[S]], align 4
51
51
// CHECK-A64_32-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SPP]], ptr [[S]], i32 0, i32 0
52
52
// CHECK-A64_32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 4
53
53
// CHECK-A64_32-NEXT: store i32 1, ptr [[TMP0]], align 4
@@ -69,10 +69,12 @@ struct Sppp {
69
69
// CHECK-A64-NEXT: ret void
70
70
//
71
71
// CHECK-A64_32-LABEL: define void @_Z4Tppp4Sppp(
72
- // CHECK-A64_32-SAME: [2 x ptr ] [[S_COERCE:%.*]]) #[[ATTR0]] {
72
+ // CHECK-A64_32-SAME: [2 x i64 ] [[S_COERCE:%.*]]) #[[ATTR0]] {
73
73
// CHECK-A64_32-NEXT: [[ENTRY:.*:]]
74
74
// CHECK-A64_32-NEXT: [[S:%.*]] = alloca [[STRUCT_SPPP:%.*]], align 4
75
- // CHECK-A64_32-NEXT: store [2 x ptr] [[S_COERCE]], ptr [[S]], align 4
75
+ // CHECK-A64_32-NEXT: [[TMP_COERCE:%.*]] = alloca [2 x i64], align 8
76
+ // CHECK-A64_32-NEXT: store [2 x i64] [[S_COERCE]], ptr [[TMP_COERCE]], align 8
77
+ // CHECK-A64_32-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[S]], ptr align 8 [[TMP_COERCE]], i32 12, i1 false)
76
78
// CHECK-A64_32-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SPPP]], ptr [[S]], i32 0, i32 0
77
79
// CHECK-A64_32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 4
78
80
// CHECK-A64_32-NEXT: store i32 1, ptr [[TMP0]], align 4
@@ -119,11 +121,10 @@ struct Srp {
119
121
// CHECK-A64-NEXT: ret void
120
122
//
121
123
// CHECK-A64_32-LABEL: define void @_Z3Trp3Srp(
122
- // CHECK-A64_32-SAME: ptr [[S_COERCE:%.*]]) #[[ATTR0]] {
124
+ // CHECK-A64_32-SAME: i64 [[S_COERCE:%.*]]) #[[ATTR0]] {
123
125
// CHECK-A64_32-NEXT: [[ENTRY:.*:]]
124
126
// CHECK-A64_32-NEXT: [[S:%.*]] = alloca [[STRUCT_SRP:%.*]], align 4
125
- // CHECK-A64_32-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_SRP]], ptr [[S]], i32 0, i32 0
126
- // CHECK-A64_32-NEXT: store ptr [[S_COERCE]], ptr [[COERCE_DIVE]], align 4
127
+ // CHECK-A64_32-NEXT: store i64 [[S_COERCE]], ptr [[S]], align 4
127
128
// CHECK-A64_32-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SRP]], ptr [[S]], i32 0, i32 0
128
129
// CHECK-A64_32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 4
129
130
// CHECK-A64_32-NEXT: store i32 1, ptr [[TMP0]], align 4
@@ -145,11 +146,10 @@ struct __attribute__((__packed__)) Spp_packed {
145
146
// CHECK-A64-NEXT: ret void
146
147
//
147
148
// CHECK-A64_32-LABEL: define void @_Z10Tpp_packed10Spp_packed(
148
- // CHECK-A64_32-SAME: ptr [[S_COERCE:%.*]]) #[[ATTR0]] {
149
+ // CHECK-A64_32-SAME: i64 [[S_COERCE:%.*]]) #[[ATTR0]] {
149
150
// CHECK-A64_32-NEXT: [[ENTRY:.*:]]
150
151
// CHECK-A64_32-NEXT: [[S:%.*]] = alloca [[STRUCT_SPP_PACKED:%.*]], align 1
151
- // CHECK-A64_32-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_SPP_PACKED]], ptr [[S]], i32 0, i32 0
152
- // CHECK-A64_32-NEXT: store ptr [[S_COERCE]], ptr [[COERCE_DIVE]], align 1
152
+ // CHECK-A64_32-NEXT: store i64 [[S_COERCE]], ptr [[S]], align 1
153
153
// CHECK-A64_32-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SPP_PACKED]], ptr [[S]], i32 0, i32 0
154
154
// CHECK-A64_32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 1
155
155
// CHECK-A64_32-NEXT: store i32 1, ptr [[TMP0]], align 4
@@ -172,11 +172,12 @@ union Upp {
172
172
// CHECK-A64-NEXT: ret void
173
173
//
174
174
// CHECK-A64_32-LABEL: define void @_Z11Tupp_packed3Upp(
175
- // CHECK-A64_32-SAME: ptr [[S_COERCE:%.*]]) #[[ATTR0]] {
175
+ // CHECK-A64_32-SAME: i64 [[S_COERCE:%.*]]) #[[ATTR0]] {
176
176
// CHECK-A64_32-NEXT: [[ENTRY:.*:]]
177
177
// CHECK-A64_32-NEXT: [[S:%.*]] = alloca [[UNION_UPP:%.*]], align 4
178
178
// CHECK-A64_32-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[UNION_UPP]], ptr [[S]], i32 0, i32 0
179
- // CHECK-A64_32-NEXT: store ptr [[S_COERCE]], ptr [[COERCE_DIVE]], align 4
179
+ // CHECK-A64_32-NEXT: [[COERCE_VAL_II:%.*]] = trunc i64 [[S_COERCE]] to i32
180
+ // CHECK-A64_32-NEXT: store i32 [[COERCE_VAL_II]], ptr [[COERCE_DIVE]], align 4
180
181
// CHECK-A64_32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S]], align 4
181
182
// CHECK-A64_32-NEXT: store i32 1, ptr [[TMP0]], align 4
182
183
// CHECK-A64_32-NEXT: ret void
@@ -271,10 +272,10 @@ struct SSpSp {
271
272
struct Sp a, b;
272
273
};
273
274
// CHECK-A64-LABEL: define dso_local void @_Z5TSpSp5SSpSp(
274
- // CHECK-A64-SAME: [2 x i64 ] [[S_COERCE:%.*]]) #[[ATTR0]] {
275
+ // CHECK-A64-SAME: [2 x ptr ] [[S_COERCE:%.*]]) #[[ATTR0]] {
275
276
// CHECK-A64-NEXT: [[ENTRY:.*:]]
276
277
// CHECK-A64-NEXT: [[S:%.*]] = alloca [[STRUCT_SSPSP:%.*]], align 8
277
- // CHECK-A64-NEXT: store [2 x i64 ] [[S_COERCE]], ptr [[S]], align 8
278
+ // CHECK-A64-NEXT: store [2 x ptr ] [[S_COERCE]], ptr [[S]], align 8
278
279
// CHECK-A64-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SSPSP]], ptr [[S]], i32 0, i32 0
279
280
// CHECK-A64-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SP:%.*]], ptr [[A]], i32 0, i32 0
280
281
// CHECK-A64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 8
@@ -308,13 +309,11 @@ struct SSp : public Sp {
308
309
// CHECK-A64-NEXT: ret void
309
310
//
310
311
// CHECK-A64_32-LABEL: define void @_Z3TSp3SSp(
311
- // CHECK-A64_32-SAME: ptr [[S_COERCE:%.*]]) #[[ATTR0]] {
312
+ // CHECK-A64_32-SAME: i64 [[S_COERCE:%.*]]) #[[ATTR0]] {
312
313
// CHECK-A64_32-NEXT: [[ENTRY:.*:]]
313
314
// CHECK-A64_32-NEXT: [[S:%.*]] = alloca [[STRUCT_SSP:%.*]], align 4
314
- // CHECK-A64_32-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_SSP]], ptr [[S]], i32 0, i32 0
315
- // CHECK-A64_32-NEXT: [[COERCE_DIVE1:%.*]] = getelementptr inbounds nuw [[STRUCT_SP:%.*]], ptr [[COERCE_DIVE]], i32 0, i32 0
316
- // CHECK-A64_32-NEXT: store ptr [[S_COERCE]], ptr [[COERCE_DIVE1]], align 4
317
- // CHECK-A64_32-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SP]], ptr [[S]], i32 0, i32 0
315
+ // CHECK-A64_32-NEXT: store i64 [[S_COERCE]], ptr [[S]], align 4
316
+ // CHECK-A64_32-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SP:%.*]], ptr [[S]], i32 0, i32 0
318
317
// CHECK-A64_32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 4
319
318
// CHECK-A64_32-NEXT: store i32 1, ptr [[TMP0]], align 4
320
319
// CHECK-A64_32-NEXT: ret void
@@ -328,22 +327,20 @@ struct SSpi : public Si {
328
327
int * y;
329
328
};
330
329
// CHECK-A64-LABEL: define dso_local void @_Z4TSpi4SSpi(
331
- // CHECK-A64-SAME: [2 x ptr ] [[S_COERCE:%.*]]) #[[ATTR0]] {
330
+ // CHECK-A64-SAME: [2 x i64 ] [[S_COERCE:%.*]]) #[[ATTR0]] {
332
331
// CHECK-A64-NEXT: [[ENTRY:.*:]]
333
332
// CHECK-A64-NEXT: [[S:%.*]] = alloca [[STRUCT_SSPI:%.*]], align 8
334
- // CHECK-A64-NEXT: store [2 x ptr ] [[S_COERCE]], ptr [[S]], align 8
333
+ // CHECK-A64-NEXT: store [2 x i64 ] [[S_COERCE]], ptr [[S]], align 8
335
334
// CHECK-A64-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SI:%.*]], ptr [[S]], i32 0, i32 0
336
335
// CHECK-A64-NEXT: store i32 1, ptr [[X]], align 8
337
336
// CHECK-A64-NEXT: ret void
338
337
//
339
338
// CHECK-A64_32-LABEL: define void @_Z4TSpi4SSpi(
340
- // CHECK-A64_32-SAME: ptr [[S_COERCE:%.*]]) #[[ATTR0]] {
339
+ // CHECK-A64_32-SAME: i64 [[S_COERCE:%.*]]) #[[ATTR0]] {
341
340
// CHECK-A64_32-NEXT: [[ENTRY:.*:]]
342
341
// CHECK-A64_32-NEXT: [[S:%.*]] = alloca [[STRUCT_SSPI:%.*]], align 4
343
- // CHECK-A64_32-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_SSPI]], ptr [[S]], i32 0, i32 0
344
- // CHECK-A64_32-NEXT: [[COERCE_DIVE1:%.*]] = getelementptr inbounds nuw [[STRUCT_SI:%.*]], ptr [[COERCE_DIVE]], i32 0, i32 0
345
- // CHECK-A64_32-NEXT: store ptr [[S_COERCE]], ptr [[COERCE_DIVE1]], align 4
346
- // CHECK-A64_32-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SI]], ptr [[S]], i32 0, i32 0
342
+ // CHECK-A64_32-NEXT: store i64 [[S_COERCE]], ptr [[S]], align 4
343
+ // CHECK-A64_32-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SI:%.*]], ptr [[S]], i32 0, i32 0
347
344
// CHECK-A64_32-NEXT: store i32 1, ptr [[X]], align 4
348
345
// CHECK-A64_32-NEXT: ret void
349
346
//
@@ -353,11 +350,11 @@ struct Spa {
353
350
int * xs[1 ];
354
351
};
355
352
// CHECK-A64-LABEL: define dso_local void @_Z3Tpa3Spa(
356
- // CHECK-A64-SAME: i64 [[S_COERCE:%.*]]) #[[ATTR0]] {
353
+ // CHECK-A64-SAME: ptr [[S_COERCE:%.*]]) #[[ATTR0]] {
357
354
// CHECK-A64-NEXT: [[ENTRY:.*:]]
358
355
// CHECK-A64-NEXT: [[S:%.*]] = alloca [[STRUCT_SPA:%.*]], align 8
359
356
// CHECK-A64-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_SPA]], ptr [[S]], i32 0, i32 0
360
- // CHECK-A64-NEXT: store i64 [[S_COERCE]], ptr [[COERCE_DIVE]], align 8
357
+ // CHECK-A64-NEXT: store ptr [[S_COERCE]], ptr [[COERCE_DIVE]], align 8
361
358
// CHECK-A64-NEXT: [[XS:%.*]] = getelementptr inbounds nuw [[STRUCT_SPA]], ptr [[S]], i32 0, i32 0
362
359
// CHECK-A64-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [1 x ptr], ptr [[XS]], i64 0, i64 0
363
360
// CHECK-A64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[ARRAYIDX]], align 8
@@ -383,11 +380,11 @@ struct Spa2 {
383
380
int * xs[2 ];
384
381
};
385
382
// CHECK-A64-LABEL: define dso_local void @_Z4Tpa24Spa2(
386
- // CHECK-A64-SAME: [2 x i64 ] [[S_COERCE:%.*]]) #[[ATTR0]] {
383
+ // CHECK-A64-SAME: [2 x ptr ] [[S_COERCE:%.*]]) #[[ATTR0]] {
387
384
// CHECK-A64-NEXT: [[ENTRY:.*:]]
388
385
// CHECK-A64-NEXT: [[S:%.*]] = alloca [[STRUCT_SPA2:%.*]], align 8
389
386
// CHECK-A64-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_SPA2]], ptr [[S]], i32 0, i32 0
390
- // CHECK-A64-NEXT: store [2 x i64 ] [[S_COERCE]], ptr [[COERCE_DIVE]], align 8
387
+ // CHECK-A64-NEXT: store [2 x ptr ] [[S_COERCE]], ptr [[COERCE_DIVE]], align 8
391
388
// CHECK-A64-NEXT: [[XS:%.*]] = getelementptr inbounds nuw [[STRUCT_SPA2]], ptr [[S]], i32 0, i32 0
392
389
// CHECK-A64-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x ptr], ptr [[XS]], i64 0, i64 0
393
390
// CHECK-A64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[ARRAYIDX]], align 8
0 commit comments