Message ID | CAD57uCfDKomop66KRd9RGhwH6aX=mKnJqjpVm_LHfyoTbsDCkw@mail.gmail.com |
---|---|
State | New |
Headers | show |
Hi On 9 March 2015 at 17:07, Yvan Roux <yvan.roux@linaro.org> wrote: > Hi, > > As added in the PR, this issue is also present on 4.9 branch and > affects at least arm-linux-gnueabihf target (as reported in PR61207). > > I've backported it in the 4.9 branch with the attached patch. The > difference with the trunk code is due the code introduced by PR63587 > fix (I didn't checked on power7, on which the PR was initially > reported, but I didn't managed to reproduce the issue for arm targets > on 4.9 branch). > > Boostrapped on x86_64, and tested on arm/aarch64 targets (regression > testing is ongoing). is ok for 4.9 branch when validation is done ? So bootstrapped/regtested on x86_64 and cross-compiled/regtested on aarch64-linux-gnu arm-linux-gnueabihf armeb-linux-gnueabihf i686-linux-gnu > Thanks > Yvan > > gcc/ > 2015-03-09 Yvan Roux <yvan.roux@linaro.org> > > Backport from trunk r220489. > 2015-02-06 Jakub Jelinek <jakub@redhat.com> > > PR ipa/64896 > * cgraphunit.c (cgraph_node::expand_thunk): If > restype is not is_gimple_reg_type nor the thunk_fndecl > returns aggregate_value_p, set restmp to a temporary variable > instead of resdecl. > > gcc/testsuite/ > 2015-03-09 Yvan Roux <yvan.roux@linaro.org> > > Backport from trunk r220489. > 2015-02-06 Jakub Jelinek <jakub@redhat.com> > > PR ipa/64896 > * g++.dg/ipa/pr64896.C: New test.
On 10 March 2015 at 19:18, Jan Hubicka <hubicka@ucw.cz> wrote: >> Hi >> >> On 9 March 2015 at 17:07, Yvan Roux <yvan.roux@linaro.org> wrote: >> > Hi, >> > >> > As added in the PR, this issue is also present on 4.9 branch and >> > affects at least arm-linux-gnueabihf target (as reported in PR61207). >> > >> > I've backported it in the 4.9 branch with the attached patch. The >> > difference with the trunk code is due the code introduced by PR63587 >> > fix (I didn't checked on power7, on which the PR was initially >> > reported, but I didn't managed to reproduce the issue for arm targets >> > on 4.9 branch). >> > >> > Boostrapped on x86_64, and tested on arm/aarch64 targets (regression >> > testing is ongoing). is ok for 4.9 branch when validation is done ? >> >> So bootstrapped/regtested on x86_64 and cross-compiled/regtested on >> aarch64-linux-gnu >> arm-linux-gnueabihf >> armeb-linux-gnueabihf >> i686-linux-gnu > > This is OK. note that cgraph_node::expand_thunk has gathered quite few > extra fixes that may be resonable for backporting. Looking across > changes after ipa-icf was enabled I think we should look into > these: > > PR ipa/65236 > * cgraphunit.c (cgraph_node::expand_thunk): Enable return slot > opt. > > PR ipa/64813 > * cgraphunit.c (cgraph_node::expand_thunk): Do not create > a return value for call to a function that is noreturn. > > PR ipa/63595 > * cgraphunit.c (cgraph_node::expand_thunk): DECL_BY_REFERENCE > is correctly handled for thunks created by IPA ICF. > > PR ipa/63587 > * cgraphunit.c (cgraph_node::expand_thunk): Only VAR_DECLs are put > to local declarations. > * function.c (add_local_decl): Implementation moved from header > file, assert introduced for tree type. > * function.h: Likewise. > > While these bugs was triggered by ipa-icf, they all IMO can be reproduced by > thunks on targets that do not define assembler thunks. > (most are about return values and those are not excercised on main targets with > MI thunks because covariant thunks always returns pointer) Thanks Honza. I can backport all of them and pass the same validation I did for this one if you want. Yvan
Honza, On 10 March 2015 at 20:09, Yvan Roux <yvan.roux@linaro.org> wrote: > On 10 March 2015 at 19:18, Jan Hubicka <hubicka@ucw.cz> wrote: >>> Hi >>> >>> On 9 March 2015 at 17:07, Yvan Roux <yvan.roux@linaro.org> wrote: >>> > Hi, >>> > >>> > As added in the PR, this issue is also present on 4.9 branch and >>> > affects at least arm-linux-gnueabihf target (as reported in PR61207). >>> > >>> > I've backported it in the 4.9 branch with the attached patch. The >>> > difference with the trunk code is due the code introduced by PR63587 >>> > fix (I didn't checked on power7, on which the PR was initially >>> > reported, but I didn't managed to reproduce the issue for arm targets >>> > on 4.9 branch). >>> > >>> > Boostrapped on x86_64, and tested on arm/aarch64 targets (regression >>> > testing is ongoing). is ok for 4.9 branch when validation is done ? >>> >>> So bootstrapped/regtested on x86_64 and cross-compiled/regtested on >>> aarch64-linux-gnu >>> arm-linux-gnueabihf >>> armeb-linux-gnueabihf >>> i686-linux-gnu >> >> This is OK. note that cgraph_node::expand_thunk has gathered quite few >> extra fixes that may be resonable for backporting. Looking across >> changes after ipa-icf was enabled I think we should look into >> these: >> >> PR ipa/65236 >> * cgraphunit.c (cgraph_node::expand_thunk): Enable return slot >> opt. This bugfix adds ipa-icf-6.C test which failed on 4.9 branch as ipa-icf is not backported on that branch. Is the bugfix still relevant and we can dropped the testcase ? >> PR ipa/64813 >> * cgraphunit.c (cgraph_node::expand_thunk): Do not create >> a return value for call to a function that is noreturn. >> >> PR ipa/63595 >> * cgraphunit.c (cgraph_node::expand_thunk): DECL_BY_REFERENCE >> is correctly handled for thunks created by IPA ICF. >> >> PR ipa/63587 >> * cgraphunit.c (cgraph_node::expand_thunk): Only VAR_DECLs are put >> to local declarations. >> * function.c (add_local_decl): Implementation moved from header >> file, assert introduced for tree type. >> * function.h: Likewise. >> >> While these bugs was triggered by ipa-icf, they all IMO can be reproduced by >> thunks on targets that do not define assembler thunks. >> (most are about return values and those are not excercised on main targets with >> MI thunks because covariant thunks always returns pointer) > > Thanks Honza. I can backport all of them and pass the same validation > I did for this one if you want. The test introduced > Yvan
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 8f57607..130fc0d 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -1572,9 +1572,14 @@ expand_thunk (struct cgraph_node *node, bool output_asm_thunks) restmp = gimple_fold_indirect_ref (resdecl); else if (!is_gimple_reg_type (restype)) { - restmp = resdecl; - add_local_decl (cfun, restmp); - BLOCK_VARS (DECL_INITIAL (current_function_decl)) = restmp; + if (aggregate_value_p (resdecl, TREE_TYPE (thunk_fndecl))) + { + restmp = resdecl; + add_local_decl (cfun, restmp); + BLOCK_VARS (DECL_INITIAL (current_function_decl)) = restmp; + } + else + restmp = create_tmp_var (restype, "retval"); } else restmp = create_tmp_reg (restype, "retval"); diff --git a/gcc/testsuite/g++.dg/ipa/pr64896.C b/gcc/testsuite/g++.dg/ipa/pr64896.C new file mode 100644 index 0000000..0a78220 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr64896.C @@ -0,0 +1,29 @@ +// PR ipa/64896 +// { dg-do compile } +// { dg-options "-O2" } + +struct A { int a, b; }; +struct B { A c; int d; }; +struct C { virtual B fn1 () const; }; +struct D { B fn2 () const; int fn3 () const; C *fn4 () const; }; + +int +D::fn3 () const +{ + fn4 ()->fn1 (); +} + +B +D::fn2 () const +{ + return B (); +} + +class F : C +{ + B + fn1 () const + { + return B (); + } +};