1b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s
2b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
3b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f1(int a, int b, int c, int d);
4b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f1(i32 inreg, i32 inreg, i32 inreg, i32)
5b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g1() {
6b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f1(41, 42, 43, 44);
7b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
8b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
9b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s1 {
10b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x1;
11b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
12b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f2(int a, int b, struct s1 c, int d);
13b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f2(i32 inreg, i32 inreg, i32 inreg, i32)
14b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g2() {
15b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s1 x = {43};
16b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f2(41, 42, x, 44);
17b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
18b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
19b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s2 {
20b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x1;
21b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x2;
22b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
23b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f3(int a, int b, struct s2 c, int d);
24b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f3(i32 inreg, i32 inreg, i32, i32, i32)
25b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g3() {
26b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s2 x = {43, 44};
27b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f3(41, 42, x, 45);
28b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
29b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f4(int a, struct s2 b, int c);
30b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f4(i32 inreg, i32 inreg, i32 inreg, i32)
31b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g4() {
32b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s2 x = {42, 43};
33b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f4(41, x, 44);
34b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
35b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
36b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s3 {
37b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x1;
38b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x2;
39b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x3;
40b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
41b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f5(int a, struct s3 b, int c);
42b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f5(i32 inreg, i32, i32, i32, i32)
43b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g5() {
44b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s3 x = {42, 43, 44};
45b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f5(41, x, 45);
46b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
47b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f6(struct s3 a, int b);
48b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f6(i32 inreg, i32 inreg, i32 inreg, i32)
49b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g6() {
50b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s3 x = {41, 42, 43};
51b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f6(x, 44);
52b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
53b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
54b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s4 {
55b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x1;
56b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x2;
57b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x3;
58b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x4;
59b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
60b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f7(struct s4 a, int b);
61b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f7(i32, i32, i32, i32, i32)
62b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g7() {
63b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s4 x = {41, 42, 43, 44};
64b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f7(x, 45);
65b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
66b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
67b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f8(float a, int b);
68b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f8(float, i32 inreg)
69b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g8(void) {
70b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f8(41, 42);
71b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
72b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
73b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s5 {
74b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  float x1;
75b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
76b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f9(struct s5 a, int b);
77b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f9(float, i32 inreg)
78b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g9(void) {
79b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s5 x = {41};
80b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f9(x, 42);
81b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
82b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
83b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s6 {
84b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  float x1;
85b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x2;
86b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
87b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f10(struct s6 a, int b);
88b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f10(i32 inreg, i32 inreg, i32 inreg)
89b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g10(void) {
90b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s6 x = {41, 42};
91b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f10(x, 43);
92b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
93b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
94b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s7 {
95b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  float x1;
96b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  int x2;
97b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  float x3;
98b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
99b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f11(struct s7 a, int b);
100b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f11(i32 inreg, i32 inreg, i32 inreg, i32)
101b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g11(void) {
102b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s7 x = {41, 42, 43};
103b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f11(x, 44);
104b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
105b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
106b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s8 {
107b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  float x1;
108b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  float x2;
109b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
110b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f12(struct s8 a, int b);
111b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f12(i32 inreg, i32 inreg, i32 inreg)
112b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g12(void) {
113b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s8 x = {41, 42};
114b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f12(x, 43);
115b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
116b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
117b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s9 {
118b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  float x1;
119b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  float x2;
120b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  float x3;
121b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
122b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f13(struct s9 a, int b);
123b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f13(i32 inreg, i32 inreg, i32 inreg, i32)
124b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g13(void) {
125b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s9 x = {41, 42, 43};
126b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f13(x, 44);
127b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
128b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
129b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s10 {
130b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  double x1;
131b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
132b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f14(struct s10 a, int b, int c);
133b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f14(double, i32 inreg, i32 inreg)
134b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g14(void) {
135b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s10 x = { 41 };
136b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f14(x, 42, 43);
137b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
138b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
139b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s11 {
140b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  double x1;
141b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  double x2;
142b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
143b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f15(struct s11 a, int b);
144b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f15(double, double, i32)
145b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g15(void) {
146b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s11 x = { 41, 42 };
147b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f15(x, 43);
148b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
149b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
150b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s12 {
151b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  double x1;
152b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  float x2;
153b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
154b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f16(struct s12 a, int b);
155b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f16(i32 inreg, i32 inreg, i32 inreg, i32)
156b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g16(void) {
157b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s12 x = { 41, 42 };
158b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f16(x, 43);
159b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
160b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
161b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) struct s12 f17(int a, int b, int c);
162b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f17(%struct.s12* inreg sret, i32 inreg, i32 inreg, i32)
163b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g17(void) {
164b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f17(41, 42, 43);
165b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
166b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
167b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolastruct s13 {
168b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct inner {
169b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola    float x;
170b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  } y;
171b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola};
172b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola__attribute__((regparm(3))) void f18(struct s13 a, int b, int c, int d);
173b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola// CHECK: declare void @f18(%struct.s13* byval align 4, i32 inreg, i32 inreg, i32 inreg)
174b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindolavoid g18(void) {
175b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  struct s13 x = {{41}};
176b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola  f18(x, 42, 43, 44);
177b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola}
178