Ping.

--
Maxim Kuvyrkov
www.trivialbugs.com



On 28/10/2011, at 9:01 PM, Maxim Kuvyrkov wrote:

> Jan,
> 
> Attached is the updated patch.  The only major change is the addition of 
> indirect_call_cost to size and time weights.  I've set the size cost of 
> indirect call to 3, which is what I remember calculating when I looked into 
> costs couple of months ago: one call instruction for the call itself, one 
> memory instruction to pull the call address out of vtable, and one ALU 
> instruction to calculate the address inside vtable.  On architectures with 
> base+offset addressing the above can be shrunk into 2 instructions.
> 
> The remapping of the known_vals and known_binfos did indeed turned out to 
> work just fine.  Probably, that was a bug that was fixed since.
> 
> The patch bootstraps and passes regtest.
> 
> Comments?  OK for trunk?
> 
> --
> Maxim Kuvyrkov
> CodeSourcery / Mentor Graphics
> 
> 
> 
> On 28/10/2011, at 3:43 PM, Maxim Kuvyrkov wrote:
> 
>> On 20/10/2011, at 10:11 PM, Jan Hubicka wrote:
>>> static clause_t
>>> -evaluate_conditions_for_edge (struct cgraph_edge *e, bool inline_p)
>>> +evaluate_conditions_vals_binfos_for_edge (struct cgraph_edge *e,
>>> +                                     bool inline_p,
>>> +                                     VEC (tree, heap) **known_vals_ptr,
>>> +                                     VEC (tree, heap) **known_binfos_ptr)
>>> 
>>> Hmm, I would make clause also returned by reference to be sonsistent and 
>>> perhaps
>>> call it something like edge_properties
>>> since it is not really only about evaulating the clause anymore.
>> 
>> Agree.
>> 
>>> 
>>> -/* Increase SIZE and TIME for size and time needed to handle all calls in 
>>> NODE.  */
>>> +/* Estimate benefit devirtualizing indirect edge IE, provided KNOWN_VALS 
>>> and
>>> +   KNOWN_BINFOS.  */
>>> +
>>> +static void
>>> +estimate_edge_devirt_benefit (struct cgraph_edge *ie,
>>> +                         int *size, int *time, int prob,
>>> +                         VEC (tree, heap) *known_vals,
>>> +                         VEC (tree, heap) *known_binfos)
>>> 
>>> I think this whole logic should go into estimate_edge_time_and_size.  This 
>>> way
>>> we will save all the duplication of scaling logic
>>> Just add the known_vals/binfos arguments.
>> 
>> Then devirtualization benefit will not be available through 
>> estimate_node_size_and_time, which is the primary interface for users of 
>> ipa-inline-analysis other than the inliner itself.  I.e., 
>> estimate_ipcp_clone_size_and_time, which is the only other user of the 
>> analysis at the moment, will not see devirtualization benefit.
>> 
>>> 
>>> I am not quite sure how to estimate the actual benefits.  estimate_num_insns
>>> doesn't really make a difference in between direct and indirect calls.
>>> 
>>> I see it is good idea to inline more then the destination is known & 
>>> inlinable.
>>> This is an example when we have additional knowledge that we want to mix 
>>> into
>>> badness metric that does not directly translate to time/size.  There are 
>>> multiple
>>> cases like this.  I was thinking of adding kind of bonus metric for this 
>>> purpose,
>>> but I would suggest doing this incrementally.
>> 
>> I too thought about this, and decided to keep the bonus metric part to bare 
>> minimum in this patch.
>> 
>>> 
>>> What about
>>> 1) extending estimate_num_insns wieghts to account direct calls differently
>>>  from indirect calls (i.e. adding indirect_call cost value into eni wights)
>>>  I would set it 2 for size metrics and 15 for time metrics for start
>>> 2) make estimate_edge_time_and_size to subtract difference of those two 
>>> metrics
>>>  from edge costs when destination is direct.
>> 
>> OK, I'll try this.
>> 
>>> @@ -2125,25 +2207,35 @@ estimate_calls_size_and_time (struct cgraph_node 
>>> *node, int *size, int *time,
>>>         }
>>>       else
>>>         estimate_calls_size_and_time (e->callee, size, time,
>>> -                                     possible_truths);
>>> +                                     possible_truths,
>>> +                                     /* TODO: remap KNOWN_VALS and
>>> +                                        KNOWN_BINFOS to E->CALLEE
>>> +                                        parameters, and use them.  */
>>> +                                     NULL, NULL);
>>> 
>>> Remapping should not be needed here - the jump functions are merged after 
>>> marking edge inline, so jump
>>> functions in inlined functions actually reffer to the parameters of the 
>>> function they are inlined to.
>> 
>> I remember it crashing on some testcase and thought the lack of remapping 
>> was the cause.  I'll look into this.
>> 
>> Thank you,
>> 
>> --
>> Maxim Kuvyrkov
>> CodeSourcery / Mentor Graphics
>> 
> 
> <fsf-gcc-devirt-account-2.ChangeLog><fsf-gcc-devirt-account-2.patch>

Reply via email to