On Tue, Mar 6, 2018 at 4:50 PM, Bin.Cheng <amker.ch...@gmail.com> wrote:
> On Tue, Mar 6, 2018 at 2:28 PM, Richard Biener
> <richard.guent...@gmail.com> wrote:
>> On Tue, Mar 6, 2018 at 1:00 PM, Prathamesh Kulkarni
>> <prathamesh.kulka...@linaro.org> wrote:
>>> For the following test-case,
>>> int a;
>>> static void foo()
>>> a = 3;
>>> int main()
>>> a = 4;
>>> foo ();
>>> return a;
>>> I assume it's safe to remove "a = 4" since 'a' would be overwritten
>>> by call to foo ?
>>> IIUC, ipa-reference pass does mod/ref analysis to compute side-effects
>>> of function call,
>>> so could we perhaps use ipa_reference_get_not_written_global() in dse
>>> pass to check if a global variable will be killed on call to a
>>> function ? If not, I suppose we could write a similar ipa pass that
>>> computes the set of killed global variables per function but I am not
>>> sure if that's the correct approach.
>> Do you think the situation happens often enough to make this worthwhile?
> There is one probably more useful case. Program may use global flags
> how it does (heavy) computation. Such flags are only set couple of
> times in execution
> time. It would be useful if we can (IPA) propagate flags into computation
> functions by versioning (if necessary). For example:
> int flag = 1;
> void foo ()
> //heavy computation wrto to flag
> void main()
> flag = 2;
> flag = 1;
Yeah, libquantum does this. There's also related example
from some SPEC fortran testcase:
static int initialized;
static T data;
data.x = 1;
initialized = 1;
where we want to constant propagate from data.x. IIRC I tried
to work on this, not sure if I solved it yet...
> Of course this may only be useful for LTO.
>> ipa-reference doesn't compute must-def, only may-def and may-use IIRC.