diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-10-19 05:04:37 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-10-19 05:04:37 +0000 |
commit | 703c47f80784486bc22fd77371f4423b61c4fb44 (patch) | |
tree | 964658eb0f7e024b2255786996a99b6e9ea23f94 /clang/test/CodeGenCXX/regparm.cpp | |
parent | 5e79ee087e9eacc311d4abca736c734fb1012f18 (diff) | |
download | bcm5719-llvm-703c47f80784486bc22fd77371f4423b61c4fb44.tar.gz bcm5719-llvm-703c47f80784486bc22fd77371f4423b61c4fb44.zip |
Fix handling of the regparm attribute in the presence of classes with copy
constructors.
When I first moved regparm support to TargetInfo.cpp I tried to isolate it
in classifyArgumentTypeWithReg, but it is actually a lot easier to flip the
code around and check for regparm at the end of the decision tree.
Without this refactoring classifyArgumentTypeWithReg would have to duplicate
the logic about when to use non-byval indirect arguments.
llvm-svn: 166266
Diffstat (limited to 'clang/test/CodeGenCXX/regparm.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/regparm.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/regparm.cpp b/clang/test/CodeGenCXX/regparm.cpp index f0ebd2be416..07e9aa046ef 100644 --- a/clang/test/CodeGenCXX/regparm.cpp +++ b/clang/test/CodeGenCXX/regparm.cpp @@ -4,3 +4,24 @@ // CHECK: _Z3fooRi(i32* inreg void __attribute__ ((regparm (1))) foo(int &a) { } + +struct S1 { + int x; + S1(const S1 &y); +}; + +void __attribute__((regparm(3))) foo2(S1 a, int b); +// CHECK: declare void @_Z4foo22S1i(%struct.S1* inreg, i32 inreg) +void bar2(S1 a, int b) { + foo2(a, b); +} + +struct S2 { + int x; +}; + +void __attribute__((regparm(3))) foo3(struct S2 a, int b); +// declare void @_Z4foo12S1i(i32 inreg, i32 inreg) optsize +void bar3(struct S2 a, int b) { + foo3(a, b); +} |