Hi,

On Mon, Jun 29 2020, Erick Ochoa wrote:
> On 29.06.20 06:05, Martin Jambor wrote:
>> Hi,
>> 
>> On Mon, Jun 29 2020, Erick Ochoa wrote:
>>> == How do we get what we want? ==
>>>
>>> Ideally what we want is to:
>>>
>> 
>> [...]
>> 
>>> * Disable constant propagation and other optimizations:
>>>     * possibly __attribute__((noipa))
>> 
>> [...]
>> 
>>> == What's the WORST CASE performance of having an unknown sizeof? ==
>>>
>>> I was concerned that the values generated by sizeof might be used by
>>> constant propagation and other optimizations might depend on this value.
>>> So, in order to have an idea of the impact of this transformation might
>>> have on code, I manually changed all sizeof statements on MCF for an
>>> equivalent function __lto_sizeof_T() where T identifies the type. I made
>>> all these functions static and used the attribute noipa. There was no
>>> measurable performance degradation when compared with an untransformed
>>> run of MCF. Of course, this is only a data point and the performance
>>> might depend on the application/workload/architecture... but it is good
>>> to have a data point!
>> 
>> Note that attribute noipa also disables inlining.
>
> This is good! We want to basically make the values returned by these 
> functions as opaque as possible. At least as a worst case analysis for 
> how bad removing the sizeof parse time substitution all the way until 
> runtime would be.
>
>> 
>>>
>>> == What are some known unknowns? ==
>>>
>>>
>>> * Does noipa work for variables?
>>>     * I think attribute noipa works for functions but I am not sure if it
>>> works for variables.
>> 
>> No, but there are not too many IPA analyses/optimizations working on
>> global variables.  And making the attributes work for them should not be
>> hard.
>> 
>>> * After changing the definition of struct can we re-run all link time
>>> optimizations?
>>>     * I would not like to sacrifice performance. Because I might have
>>> hindered constant propagation all optimizations which depend on it might
>>> suffer. Therefore, I was wondering if after changing the fields I can
>>> delete the noipa attribtue and re-run all link time optimizations
>>> somehow? (However, the experiment tells us that this might not be a
>>> worry. Perhaps there might be other benchmarks which are more affected
>>> by this transformation.)
>> 
>> That would need quite a surgery in the pass manager, and it would
>> require re-running all body analyses at the link phase, something we're
>> trying to avoid.
>
> I understand. We might skip this since the experiment showed that there 
> was no performance degradation. But again... only one data point != 
> generalization.
>
>> 
>> If you need to disable IPA-CP (and IPA-SRA) changing a particular
>> parameter (e.g. because an earlier IPA pass has changed it beyond
>> recognition), ipa_param_adjustments::get_surviving_params should place
>> false in the corresponding vector element.
>
> Awesome! Thanks! I have been looking for something like this for a 
> little while.
>
>> 
>> If you need to disable propagation of a specific value in a specific
>> call, you need to prevent creation of the associated jump function.
>> 
>> But of course, if the call gets inlined the propagation will happen
>> anyway, so if you are afraid that propagation of any value anywhere can
>> possibly be based on an offsetof or sizeof which you are changing, then
>> I don't think your problems are limited just to IPA (link time
>> optimization) propagation.
>
> Sorry, I have some problem understanding this. You mentioned that noipa 
> disables inlining (which is good). Here you state that "if the call gets 
> inlined" then the value will be propagated.
>
> Are you saying that this mini benchmark experiment was flawed and that 
> we should also look at how to disable non-ipa passes?

My point was simply that if you just do not want inter-procedural
propagations to happen, than you cannot just somehow disable/limit
IPA-CP but also inlining, because that can convert them to plain old
intra-procedural propagation.  And disabling inlining is going to have
huge performance implications.  So I'd try to avoid such need as much as
possible.

Martin

Reply via email to