> On Thu, 6 Feb 2014, Jan Hubicka wrote: > > > Hi, > > at WPA we currently read trees accessed by jump functions and then copy them > > to remove location that is already known to be UNKNOWN and then keep copying > > them for every inline clone introduced (and there are many for firefox) > > > > This patch makes us to copy only when expression really has an location in > > it. > > > > Bootstrapped/regtested x86_64-linux, OK? > > Hmm, I think you either can use just > > if (EXPR_P (expr)) > walk_tree (&expr, prune_expr_location, NULL, NULL); > > or you miss unsharing and create invalid shared trees when > the expr does not contain locations. > > I fear it's the latter, given how ipa_set_jf_* is used.
Well, ipa-prop analysis takes random operands from GIMPLE bodies and stores them into jump function. Then it streams in/out, propagates and eventually uses them as a replacements for bodies. We use unshare_without_location primarily to prevent LTO from need to stream stale BLOCK expressions and to avoid inserting wrong blocks into clones http://gcc.gnu.org/ml/gcc-patches/2012-12/msg01176.html http://gcc.gnu.org/ml/gcc-patches/2012-09/msg01343.html Calling prine_expr_location would kill locations in the original function body they are taken from. For constant JF, they are IP invariants, so I do not think they need unsharing. THe arithmetic is never inserted back to GIMPLE code. I can also just add no_unshare parameter to jump functions to avoid the unsharing during stream-in, possibly. Honza