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