Skip to content

Commit 6825a7d

Browse files
committed
[AArch64] Add a test case for the coerced arguments. NFC
1 parent 6d4d017 commit 6825a7d

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2+
// RUN: %clang_cc1 -triple aarch64-none-elf -fcxx-exceptions -fexceptions -emit-llvm -o - %s | FileCheck %s
3+
4+
struct Sp {
5+
int *x;
6+
};
7+
// CHECK-LABEL: define dso_local void @_Z2Tp2Sp(
8+
// CHECK-SAME: i64 [[S_COERCE:%.*]]) #[[ATTR0:[0-9]+]] {
9+
// CHECK-NEXT: [[ENTRY:.*:]]
10+
// CHECK-NEXT: [[S:%.*]] = alloca [[STRUCT_SP:%.*]], align 8
11+
// CHECK-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_SP]], ptr [[S]], i32 0, i32 0
12+
// CHECK-NEXT: [[COERCE_VAL_IP:%.*]] = inttoptr i64 [[S_COERCE]] to ptr
13+
// CHECK-NEXT: store ptr [[COERCE_VAL_IP]], ptr [[COERCE_DIVE]], align 8
14+
// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SP]], ptr [[S]], i32 0, i32 0
15+
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 8
16+
// CHECK-NEXT: store i32 1, ptr [[TMP0]], align 4
17+
// CHECK-NEXT: ret void
18+
//
19+
void Tp(Sp s) { *s.x = 1; }
20+
21+
struct Spp {
22+
int *x, *y;
23+
};
24+
// CHECK-LABEL: define dso_local void @_Z3Tpp3Spp(
25+
// CHECK-SAME: [2 x i64] [[S_COERCE:%.*]]) #[[ATTR0]] {
26+
// CHECK-NEXT: [[ENTRY:.*:]]
27+
// CHECK-NEXT: [[S:%.*]] = alloca [[STRUCT_SPP:%.*]], align 8
28+
// CHECK-NEXT: store [2 x i64] [[S_COERCE]], ptr [[S]], align 8
29+
// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SPP]], ptr [[S]], i32 0, i32 0
30+
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 8
31+
// CHECK-NEXT: store i32 1, ptr [[TMP0]], align 4
32+
// CHECK-NEXT: ret void
33+
//
34+
void Tpp(Spp s) { *s.x = 1; }
35+
36+
struct Sppp {
37+
int *x, *y, *z;
38+
};
39+
// CHECK-LABEL: define dso_local void @_Z4Tppp4Sppp(
40+
// CHECK-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
41+
// CHECK-NEXT: [[ENTRY:.*:]]
42+
// CHECK-NEXT: [[S_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
43+
// CHECK-NEXT: store ptr [[S]], ptr [[S_INDIRECT_ADDR]], align 8
44+
// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SPPP:%.*]], ptr [[S]], i32 0, i32 0
45+
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 8
46+
// CHECK-NEXT: store i32 1, ptr [[TMP0]], align 4
47+
// CHECK-NEXT: ret void
48+
//
49+
void Tppp(Sppp s) { *s.x = 1; }
50+
51+
struct Spi {
52+
int *x, y;
53+
};
54+
// CHECK-LABEL: define dso_local void @_Z3Tpi3Spi(
55+
// CHECK-SAME: [2 x i64] [[S_COERCE:%.*]]) #[[ATTR0]] {
56+
// CHECK-NEXT: [[ENTRY:.*:]]
57+
// CHECK-NEXT: [[S:%.*]] = alloca [[STRUCT_SPI:%.*]], align 8
58+
// CHECK-NEXT: store [2 x i64] [[S_COERCE]], ptr [[S]], align 8
59+
// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SPI]], ptr [[S]], i32 0, i32 0
60+
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 8
61+
// CHECK-NEXT: store i32 1, ptr [[TMP0]], align 4
62+
// CHECK-NEXT: ret void
63+
//
64+
void Tpi(Spi s) { *s.x = 1; }
65+
66+
struct Srp {
67+
int &x, *y;
68+
};
69+
// CHECK-LABEL: define dso_local void @_Z3Trp3Srp(
70+
// CHECK-SAME: [2 x i64] [[S_COERCE:%.*]]) #[[ATTR0]] {
71+
// CHECK-NEXT: [[ENTRY:.*:]]
72+
// CHECK-NEXT: [[S:%.*]] = alloca [[STRUCT_SRP:%.*]], align 8
73+
// CHECK-NEXT: store [2 x i64] [[S_COERCE]], ptr [[S]], align 8
74+
// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SRP]], ptr [[S]], i32 0, i32 0
75+
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 8
76+
// CHECK-NEXT: store i32 1, ptr [[TMP0]], align 4
77+
// CHECK-NEXT: ret void
78+
//
79+
void Trp(Srp s) { s.x = 1; }
80+
81+
struct __attribute__((__packed__)) Spp_packed {
82+
int *x, *y;
83+
};
84+
// CHECK-LABEL: define dso_local void @_Z10Tpp_packed10Spp_packed(
85+
// CHECK-SAME: [2 x i64] [[S_COERCE:%.*]]) #[[ATTR0]] {
86+
// CHECK-NEXT: [[ENTRY:.*:]]
87+
// CHECK-NEXT: [[S:%.*]] = alloca [[STRUCT_SPP_PACKED:%.*]], align 1
88+
// CHECK-NEXT: store [2 x i64] [[S_COERCE]], ptr [[S]], align 1
89+
// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_SPP_PACKED]], ptr [[S]], i32 0, i32 0
90+
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X]], align 1
91+
// CHECK-NEXT: store i32 1, ptr [[TMP0]], align 4
92+
// CHECK-NEXT: ret void
93+
//
94+
void Tpp_packed(Spp_packed s) { *s.x = 1; }

0 commit comments

Comments
 (0)