On Thu, Aug 28, 2014 at 3:29 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:
>>>>>>> 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)) >>>>>>> + { >>>>>>> + gcc_assert (pic_offset_table_rtx); >>>>>>> + args[j].tree_value = make_tree (ptr_type_node, >>>>>>> + pic_offset_table_rtx); >>>>>>> + j--; >>>>>>> + } >>>>>>> + >>>>>>> if (struct_value_addr_value) >>>>>>> { >>>>>>> args[j].tree_value = struct_value_addr_value; >>>>>> >>>>>> So why do you need this? Can't this be handled in the call/call_value >>>>>> expanders or what about attaching the use to CALL_INSN_FUNCTION_USAGE >>>>>> from >>>>>> inside ix86_expand_call? Basically I'm not seeing the need for another >>>>>> target hook here. I think that would significantly simply the patch as >>>>>> well. >>>>> >>>>> GOT base address become an additional implicit arg with EBX relaxed >>>>> and I handled it as all other args. I can move EBX initialization into >>>>> ix86_expand_call. Would still need some hint from target to init >>>>> pic_offset_table_rtx with proper value in the beginning of function >>>>> expand. >>>> >>>> Maybe you can you use get_hard_reg_initial_val for this? >>> >>> Actually there is no input hard reg holding GOT address. Currently I >>> use initialization with ebx with following ebx initialization in >>> prolog_epilog pass. But this is a temporary workaround. It is >>> inefficient because always uses callee save reg to get GOT address. I >>> suppose we should generate pseudo reg for pic_offset_table_rtx and >>> also set_got with this register as a destination in expand pass. >>> After register allocation set_got may be transformed into get_pc_thunk >>> call with proper hard reg. But some target hook has to be used for >>> this. >> >> Let me expand my idea a bit. IIRC, get_hard_reg_initial_val and >> friends will automatically emit intialization of a pseudo from >> pic_offset_table_rtx hard reg. After reload, real initialization of >> pic_offset_table_rtx hard reg is emitted in pro_and_epilogue pass. I >> don't know if this works with current implementation of dynamic >> pic_offset_table_rtx selection, though. > > That means you should choose some hard reg early before register > allocation to be used for PIC reg initialization. I do not like we > have to do this and want to just generate set_got with pseudo reg and > do not involve any additional hard reg. That would look like > > (insn/f 168 167 169 2 (parallel [ > (set (reg:SI 127) > (unspec:SI [ > (const_int 0 [0]) > ] UNSPEC_SET_GOT)) > (clobber (reg:CC 17 flags)) > ]) test.cc:42 -1 > (expr_list:REG_CFA_FLUSH_QUEUE (nil) > (nil))) > > after expand pass. r127 is pic_offset_table_rtx here. And after > reload it would become: > > (insn/f 168 167 169 2 (parallel [ > (set (reg:SI 3 bx) > (unspec:SI [ > (const_int 0 [0]) > ] UNSPEC_SET_GOT)) > (clobber (reg:CC 17 flags)) > ]) test.cc:42 -1 > (expr_list:REG_CFA_FLUSH_QUEUE (nil) > (nil))) > > And no additional actions are required on pro_and_epilogue. Also it > simplifies analysis whether we should generate set_got at all. > Current we check hard reg is ever live which is wrong with not fixed > ebx because any usage of hard reg used to init GOT doesn't mean GOT > usage. And with my proposed scheme unused GOT would mean DCE just > removes useless set_got. Yes this is better. I was under impression you want to retain current initialization insertion in expand_prologue. Uros.