(Dropping gcc@ and people known to subscribe to gcc-patches from the CC.) Sorry for the drive-by review, but...
On Fri, 22 Aug 2014, Ilya Enkovich wrote: > Hi, > > On Cauldron 2014 we had a couple of talks about relaxation of > ebx usage in 32bit PIC mode. It was decided that the best > approach would be to not fix ebx register, use speudo register > for GOT base address and let allocator do the rest. This should > be similar to how clang and icc work with GOT base address. > I've been working for some time on such patch and now want to > share my results. ...did you send the right version of the patch? This one uses the RTX-returning hook only in boolean tests, unless I misread. Using the return value in boolean tests (non/NULL) here: > diff --git a/gcc/calls.c b/gcc/calls.c > index 4285ec1..85dae6b 100644 > --- a/gcc/calls.c > +++ b/gcc/calls.c > @@ -1122,6 +1122,14 @@ initialize_argument_information (int num_actuals > ATTRIBUTE_UNUSED, > call_expr_arg_iterator iter; > tree arg; > > + if (targetm.calls.implicit_pic_arg (fndecl ? fndecl : fntype)) ... > + /* Add implicit PIC arg. */ > + if (targetm.calls.implicit_pic_arg (fndecl ? fndecl : fntype)) > + num_actuals++; ... > + if (targetm.calls.implicit_pic_arg (fndecl ? fndecl : fntype)) but: > +/* Return reg in which implicit PIC base address > + arg is passed. */ > +static rtx > +ix86_implicit_pic_arg (const_tree fntype_or_decl ATTRIBUTE_UNUSED) ... > +#undef TARGET_IMPLICIT_PIC_ARG > +#define TARGET_IMPLICIT_PIC_ARG ix86_implicit_pic_arg > #undef TARGET_FUNCTION_ARG_BOUNDARY and: > --- a/gcc/doc/tm.texi > +++ b/gcc/doc/tm.texi > @@ -3967,6 +3967,12 @@ If @code{TARGET_FUNCTION_INCOMING_ARG} is not defined, > @code{TARGET_FUNCTION_ARG} serves both purposes. > @end deftypefn > > +@deftypefn {Target Hook} rtx TARGET_IMPLICIT_PIC_ARG (const_tree > @var{fntype_or_decl}) > +This hook returns register holding PIC base address for functions > +which do not fix hard register but handle it similar to function arg > +assigning a virtual reg for it. > +@end deftypefn Also, the contains_symbol_ref removal seems like an independent cleanup-patch. > index a458380..63d2be5 100644 > --- a/gcc/var-tracking.c > +++ b/gcc/var-tracking.c > @@ -661,7 +661,6 @@ static bool variable_different_p (variable, variable); > static bool dataflow_set_different (dataflow_set *, dataflow_set *); > static void dataflow_set_destroy (dataflow_set *); > > -static bool contains_symbol_ref (rtx); brgds, H-P