[Bug rtl-optimization/102147] IRA dependent on 32-bit vs 64-bit pointer size
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102147 --- Comment #9 from Peter Bergner --- (In reply to CVS Commits from comment #8) > The master branch has been updated by Vladimir Makarov > : > > https://gcc.gnu.org/g:51ca05031959d3accffe873e87d4bc4fbd22e9e9 > > commit r12-3881-g51ca05031959d3accffe873e87d4bc4fbd22e9e9 > Author: Vladimir N. Makarov > Date: Fri Sep 24 10:06:45 2021 -0400 > > Make profitability calculation of RA conflict presentations independent > of host compiler type sizes. [PR102147] > > gcc/ChangeLog: > > 2021-09-24 Vladimir Makarov > > PR rtl-optimization/102147 > * ira-build.c (ira_conflict_vector_profitable_p): Make > profitability calculation independent of host compiler pointer > and > IRA_INT_BITS sizes. Can we mark this as RESOLVED / FIXED now?
[Bug rtl-optimization/102147] IRA dependent on 32-bit vs 64-bit pointer size
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102147 --- Comment #8 from CVS Commits --- The master branch has been updated by Vladimir Makarov : https://gcc.gnu.org/g:51ca05031959d3accffe873e87d4bc4fbd22e9e9 commit r12-3881-g51ca05031959d3accffe873e87d4bc4fbd22e9e9 Author: Vladimir N. Makarov Date: Fri Sep 24 10:06:45 2021 -0400 Make profitability calculation of RA conflict presentations independent of host compiler type sizes. [PR102147] gcc/ChangeLog: 2021-09-24 Vladimir Makarov PR rtl-optimization/102147 * ira-build.c (ira_conflict_vector_profitable_p): Make profitability calculation independent of host compiler pointer and IRA_INT_BITS sizes.
[Bug rtl-optimization/102147] IRA dependent on 32-bit vs 64-bit pointer size
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102147 --- Comment #7 from Vladimir Makarov --- I've been thinking about ways to fix this problem but only come to the following patch. The patch results in working mostly the same for 64-bit targets and different for 32-bit targets. In any case the profitability is only an estimation so I think the patch is ok. Avoiding 4 stage bootstrap is more important than a bit slower RA on 32-bit targets (which is questionable) on few border cases. I am going to commit the patch this Friday. --- a/gcc/ira-build.c +++ b/gcc/ira-build.c @@ -629,7 +629,7 @@ ior_hard_reg_conflicts (ira_allocno_t a, const_hard_reg_set set) bool ira_conflict_vector_profitable_p (ira_object_t obj, int num) { - int nw; + int nbytes; int max = OBJECT_MAX (obj); int min = OBJECT_MIN (obj); @@ -638,9 +638,14 @@ ira_conflict_vector_profitable_p (ira_object_t obj, int num) in allocation. */ return false; - nw = (max - min + IRA_INT_BITS) / IRA_INT_BITS; - return (2 * sizeof (ira_object_t) * (num + 1) - < 3 * nw * sizeof (IRA_INT_TYPE)); + nbytes = (max - min) / 8 + 1; + STATIC_ASSERT (sizeof (ira_object_t) <= 8); + /* Don't use sizeof (ira_object_t), use constant 8. Size of ira_object_t (a + pointer) is different on 32-bit and 64-bit targets. Usage sizeof + (ira_object_t) can result in different code generation by GCC built as 32- + and 64-bit program. In any case the profitability is just an estimation + and border cases are rare. */ + return (2 * 8 /* sizeof (ira_object_t) */ * (num + 1) < 3 * nbytes); } /* Allocates and initialize the conflict vector of OBJ for NUM
[Bug rtl-optimization/102147] IRA dependent on 32-bit vs 64-bit pointer size
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102147 --- Comment #6 from Vladimir Makarov --- (In reply to David Edelsohn from comment #5) > Vlad privately commented: "I suspect order of processing conflicts might > depend on their representation." > > The two representations may produce different results and the heuristics to > choose the representation depend on the pointer size. Yes. I'll be working on the PR. It is an interesting type of problem. I think GCC output should be the same independently what type of compiler (64-bit or 32-bit one) we use for building GCC.
[Bug rtl-optimization/102147] IRA dependent on 32-bit vs 64-bit pointer size
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102147 --- Comment #5 from David Edelsohn --- Vlad privately commented: "I suspect order of processing conflicts might depend on their representation." The two representations may produce different results and the heuristics to choose the representation depend on the pointer size.
[Bug rtl-optimization/102147] IRA dependent on 32-bit vs 64-bit pointer size
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102147 --- Comment #4 from Richard Biener --- btw, using bootstrap4 might be another solution.
[Bug rtl-optimization/102147] IRA dependent on 32-bit vs 64-bit pointer size
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102147 --- Comment #3 from Richard Biener --- Well, ira_conflict_vector_profitable_p is dependent on sizeof (ira_object_t) but it's a decision about the representation of conflicts. The question is now whether at any point processing of the two representations can yield different answers. That might happen if we somewhere iterate over conflicts? I suppose the simplest fix for the actual bootstrap issue is to make ira_conflict_vector_profitable_p independent of sizeof (ira_object_t) and sizeof (IRA_INT_TYPE) and simplify return (2 * sizeof (ira_object_t) * (num + 1) < 3 * nw * sizeof (IRA_INT_TYPE)); for example to return (2 * (num + 1) < 3 * nw); (note 'nw' is also rounded up to IRA_INT_BITS).