[PATCH][LTO] Fix PR45018

Diego Novillo dnovillo@google.com
Thu Jul 22 11:53:00 GMT 2010


On 10-07-21 12:15 , Richard Guenther wrote:
> +			     struct pointer_map_t *, struct obstack *);
>
> -bool
> -gimple_types_compatible_p (tree t1, tree t2, bool for_merging_p)
> +static bool
> +gtc_visit (tree t1, tree t2, bool for_merging_p,
> +	   struct sccs *state,
> +	   VEC(type_pair_t, heap) **sccstack,
> +	   struct pointer_map_t *sccstate,
> +	   struct obstack *sccstate_obstack)

Needs documentation.

> +  if (!cstate)
>       {
> -      /* We are currently comparing this pair of types, assume
> -	 that they are the same and let the caller decide.  */
> -      return 1;
> +      int res;
> +      /* Not yet visited.  DFS recurse.  */
> +      res = gimple_types_compatible_p_1 (t1, t2, for_merging_p,
> +					 sccstack, sccstate, sccstate_obstack);
> +      if (!cstate)
> +	cstate = (struct sccs *)* pointer_map_contains (sccstate, p);
> +      state->low = MIN (state->low, cstate->low);
> +      /* If the type is no longer on the SCC stack and thus is not part
> +	 of the parents SCC mix in its hash value.  Otherwise we will
> +	 ignore the type for hashing purposes and return the unaltered
> +	 hash value.  */
> +      if (!cstate->on_sccstack)
> +	return res;
>       }
> +  if (cstate->dfsnum<  state->dfsnum
> +&&  cstate->on_sccstack)
> +    state->low = MIN (cstate->dfsnum, state->low);
> +
> +  /* We are part of our parents SCC, skip this entry and return true.  */
> +  return 1;

s/1/true/


> +}
> +
> +/* Return 1 iff T1 and T2 are structurally identical.
> +   Otherwise, return 0.  */
> +
> +static bool
> +gimple_types_compatible_p_1 (tree t1, tree t2, bool for_merging_p,
> +			     VEC(type_pair_t, heap) **sccstack,
> +			     struct pointer_map_t *sccstate,
> +			     struct obstack *sccstate_obstack)

Arguments need documentation.


>
>     /* Common exit path for types that are not compatible.  */
>   different_types:
> -  p->same_p = 0;
> -  return 0;
> +  state->hash/*same_p*/ = 0;
> +  goto pop;
>
>     /* Common exit path for types that are compatible.  */
>   same_types:
> -  p->same_p = 1;
> -  return 1;
> +  state->hash/*same_p*/ = 1;

Why the /*same_p*/ comment?  Better add a 'same_p' field to 'state' 
instead of overloading the field (or make a union?).

Change all the return 0/1 to return false/true?  Or make the functions 
return int, I guess.

OK with those changes.

Seems to me that this should give some speedup to type comparison, right?


Diego.



More information about the Gcc-patches mailing list