[PING][PATCH] Mark symbols in offload tables with force_output in read_offload_tables

Tom de Vries Tom_deVries@mentor.com
Mon Feb 8 13:20:00 GMT 2016


On 26/01/16 14:01, Ilya Verbin wrote:
> On Tue, Jan 26, 2016 at 13:21:57 +0100, Tom de Vries wrote:
>> On 25/01/16 14:27, Ilya Verbin wrote:
>>> On Tue, Jan 05, 2016 at 15:56:15 +0100, Tom de Vries wrote:
>>>>> diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
>>>>> index 62e5454..cdaee41 100644
>>>>> --- a/gcc/lto-cgraph.c
>>>>> +++ b/gcc/lto-cgraph.c
>>>>> @@ -1911,6 +1911,11 @@ input_offload_tables (void)
>>>>>   	      tree fn_decl
>>>>>   		= lto_file_decl_data_get_fn_decl (file_data, decl_index);
>>>>>   	      vec_safe_push (offload_funcs, fn_decl);
>>>>> +
>>>>> +	      /* Prevent IPA from removing fn_decl as unreachable, since there
>>>>> +		 may be no refs from the parent function to child_fn in offload
>>>>> +		 LTO mode.  */
>>>>> +	      cgraph_node::get (fn_decl)->mark_force_output ();
>>>>>   	    }
>>>>>   	  else if (tag == LTO_symtab_variable)
>>>>>   	    {
>>>>> @@ -1918,6 +1923,10 @@ input_offload_tables (void)
>>>>>   	      tree var_decl
>>>>>   		= lto_file_decl_data_get_var_decl (file_data, decl_index);
>>>>>   	      vec_safe_push (offload_vars, var_decl);
>>>>> +
>>>>> +	      /* Prevent IPA from removing var_decl as unused, since there
>>>>> +		 may be no refs to var_decl in offload LTO mode.  */
>>>>> +	      varpool_node::get (var_decl)->force_output = 1;
>>>>>   	    }
>>>
>>> This doesn't work when there is more than one LTO partition, because only first
>>> partition contains full offload table to maintain correct order, but cgraph and
>>> varpool nodes aren't necessarily created for the first partition.  To reproduce:
>>>
>>> $ make check-target-libgomp RUNTESTFLAGS="c.exp=for-* --target_board=unix/-flto"
>>> FAIL: libgomp.c/for-3.c (internal compiler error)
>>> FAIL: libgomp.c/for-5.c (internal compiler error)
>>> FAIL: libgomp.c/for-6.c (internal compiler error)
>>> $ make check-target-libgomp RUNTESTFLAGS="c++.exp=for-* --target_board=unix/-flto"
>>> FAIL: libgomp.c++/for-11.C (internal compiler error)
>>> FAIL: libgomp.c++/for-13.C (internal compiler error)
>>> FAIL: libgomp.c++/for-14.C (internal compiler error)
>>
>> This works for me.
>>
>> OK for trunk?
>>
>> Thanks,
>> - Tom
>>
>
>> Check that cgraph/varpool_node exists before use in input_offload_tables
>>
>> 2016-01-26  Tom de Vries  <tom@codesourcery.com>
>>
>> 	* lto-cgraph.c (input_offload_tables): Check that cgraph/varpool_node
>> 	exists before use.
>
> In this case they will be not marked as force_output in other partitions (except
> the first one).

AFAIU, that's not the case.

If we're splitting up lto compilation over partitions, it means we're 
first calling lto1 in WPA mode. We'll read in all offload tables, and 
mark all symbols with force_output, and when writing out the partitions, 
we'll write the offload symbols out with force_output set.

This updated patch only does the force_output marking for offload 
symbols in WPA or LTO. It's not necessary in LTRANS mode.

Bootstrapped and reg-tested on x86_64.

Build for nvidia accelerator and reg-tested libgomp with various lto 
settings.

OK for trunk, stage4?

Thanks,
- Tom

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0006-Don-t-mark-offload-symbols-with-force_output-in-ltrans.patch
Type: text/x-patch
Size: 2627 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20160208/fe5719d8/attachment.bin>


More information about the Gcc-patches mailing list