Hi,

On Fri, Nov 22, 2013 at 12:19:33PM +0100, Jakub Jelinek wrote:
> On Fri, Nov 22, 2013 at 11:08:41AM +0100, Richard Biener wrote:
> > > @@ -284,6 +382,12 @@ public:
> > >    /* Declaration node used to be clone of. */
> > >    tree former_clone_of;
> > >  
> > > +  /* If this is a SIMD clone, this points to the SIMD specific
> > > +     information for it.  */
> > > +  struct cgraph_simd_clone *simdclone;
> > > +  /* If this function has SIMD clones, this points to the first clone.  
> > > */
> > > +  struct cgraph_node *simd_clones;
> > > +
> > 
> > I wonder how you run all of this through LTO (I'll see below I guess ;))
> 
> It doesn't work, as in, all the added testcases work just fine without -flto
> and all of them ICE with -flto, but there are multiple known issues with LTO
> before that (internal fns, etc.).  More below.
> 
> > The expr.c hunk is also ok independently of the patch.
> 
> Ok, thanks (though without the rest of the patch probably nothing emits it).
> 
> > > @@ -3758,6 +3772,124 @@ ipa_modify_call_arguments (struct cgraph
> > >    free_dominance_info (CDI_DOMINATORS);
> > >  }
> > 
> > You've run the above through Martin IIRC, but ...
> 
> Aldy did.
> 
> > > +/* If the expression *EXPR should be replaced by a reduction of a 
> > > parameter, do
> > > +   so.  ADJUSTMENTS is a pointer to a vector of adjustments.  CONVERT
> > > +   specifies whether the function should care about type incompatibility 
> > > the
> > > +   current and new expressions.  If it is false, the function will leave
> > > +   incompatibility issues to the caller.  Return true iff the expression
> > > +   was modified. */
> > > +
> > > +bool
> > > +ipa_modify_expr (tree *expr, bool convert,
> > > +          ipa_parm_adjustment_vec adjustments)
> > > +{
> > > +  struct ipa_parm_adjustment *cand
> > > +    = ipa_get_adjustment_candidate (&expr, &convert, adjustments, false);
> > > +  if (!cand)
> > > +    return false;
> > > +
> > > +  tree src;
> > > +  if (cand->by_ref)
> > > +    src = build_simple_mem_ref (cand->new_decl);
> > 
> > is this function mostly copied from elsewhere?  Because
> > using build_simple_mem_ref always smells like possible TBAA problems.
> 
> Perhaps, but this is just code reorg, the same
> 
> -  if (cand->by_ref)
> -    src = build_simple_mem_ref (cand->reduction);
> -  else
> -    src = cand->reduction;
> 
> used to sit in sra_ipa_modify_expr before.

IPA-SRA (in splice_param_accesses) makes sure that it only pushes
dereferences to the caller (which are created by this code) when all
dereferences in the calle have the same reference_alias_ptr_type.  THe
dereference is then made in type of one such dereference.  I hope that
means there are no TBAA issues.

> 
> > 
> > > +  else
> > > +    src = cand->new_decl;
> > > +
> > > +  if (dump_file && (dump_flags & TDF_DETAILS))
> > > +    {
> > > +      fprintf (dump_file, "About to replace expr ");
> > > +      print_generic_expr (dump_file, *expr, 0);
> > > +      fprintf (dump_file, " with ");
> > > +      print_generic_expr (dump_file, src, 0);
> > > +      fprintf (dump_file, "\n");
> > > +    }
> > > +
> > > +  if (convert && !useless_type_conversion_p (TREE_TYPE (*expr), 
> > > cand->type))
> > > +    {
> > > +      tree vce = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (*expr), src);
> > > +      *expr = vce;
> > 
> > Why build1 and not fold it?  I assume from above you either have a plain 
> > decl (cand->new_decl) or a MEM_REF.  For both cases simply folding
> > the VCE into a MEM_REF works.
> 
> Again, preexisting code from sra_ipa_modify_expr.  Can it be changed
> incrementally/independently of this?

I'm not sure, perhaps it made sense before we had MEM_REF and it was
not converted... or it was simply always a bug.  I can fix this after
the merge, not sure whether now of in the next stage1 though.

> 
> > > +    }
> > > +  else
> > > +    *expr = src;
> > > +  return true;
> > > +}
> > > +
> > > +/* If T is an SSA_NAME, return NULL if it is not a default def or
> > > +   return its base variable if it is.  If IGNORE_DEFAULT_DEF is true,
> > > +   the base variable is always returned, regardless if it is a default
> > > +   def.  Return T if it is not an SSA_NAME.  */
> > > +
> > > +static tree
> > > +get_ssa_base_param (tree t, bool ignore_default_def)
> > > +{
> > > +  if (TREE_CODE (t) == SSA_NAME)
> > > +    {
> > > +      if (ignore_default_def || SSA_NAME_IS_DEFAULT_DEF (t))
> > > + return SSA_NAME_VAR (t);
> > > +      else
> > > + return NULL_TREE;
> > > +    }
> > > +  return t;
> > > +}
> > 
> > This function will return non-NULL for non-PARMs - is that intended?
> 
> Again, seems to be preexisting code from tree-sra.c.  Aldy/Martin?

Yeah, at least in the old form it is either checked later on or it
does not matter (we just use the DECL_UID to clear its bit in bitmap
of candidates).  But it would probaly make sense to move the check
there, again as a followup, whether now or for 4.10.

Thanks,

Martin

Reply via email to