http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54693



--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-10-19 
12:34:14 UTC ---

Thanks, the threadedge patch looks reasonable (I think gimple_location on debug

stmts is ignored, so we don't need to drop it).



As for ivopts, there is no use in these cases.  We'd either need to add debug

uses of IVs as a special set of uses (perhaps in a different vector), that

wouldn't be used for decision of which IVs to keep/use, but just for

computation of the best candidate for it (where for debug info best is

something very different from best for code, for debug info smaller cost is as

small as possible expression, as few address expressions in it as possible, as

few SSA_NAMEs as possible).

Or I guess another alternative for unused IVs used in debug stmts is do what

your loop does (but drop the PHI check and do it for all unused IVs?; in the

particular testcase before your threadedge change the DEBUG stmts use i_10,

which is i_16 + 1 (where i_16 is set in PHI <i_10, 0>), so it wouldn't do

anything).  You can build an artificial temporary use object,

get_computation_at

only uses the iv field of it (so just struct iv_use use; memset (&use, 0,

sizeof (use)); use.iv = info->iv;, for stmt I'd use for PHI setters

gsi_after_labels stmt, for normal assignments next stmt after the setter it if

any.  And for cand perhaps go through all of the (or just a subsect of)

iv_cands that are

iv_use (data, i)->selected for some i.  Perhaps we can first search for a

cand->iv with equal step to the unused iv if any (and prefer integer bases over

more complex ones, on this testcase the removed iv used by some DEBUG stmts is:

ssa name i_10

  type int

  base 1

  step 1

  is a biv

and iv_cands that are selected by any uses are:

  type unsigned long

  base (unsigned long) &arr

  step 1

  base object (void *) &arr

and

  type unsigned int

  base 48

  step 1

where better is to use the second one, both because it has an integer base, and

because TYPE_MODE of its type is identical to TYPE_MODE of the iv (so no

extension/truncation is needed).  get_computation_at returns possibly large

tree, so we need to gimplify it into perhaps series of debug temps, finally

assign to a debug temp after the setter stmt, then rewrite all the debug stmt

uses to use this debug temp.

Reply via email to