Patchwork RFC: simd enabled functions (omp declare simd / elementals)

login
register
mail settings
Submitter Aldy Hernandez
Date Nov. 8, 2013, 5:48 p.m.
Message ID <527D23FB.8000206@redhat.com>
Download mbox | patch
Permalink /patch/289901/
State New
Headers show

Comments

Aldy Hernandez - Nov. 8, 2013, 5:48 p.m.
On 11/07/13 09:09, Martin Jambor wrote:

> I am glad this is becoming a useful infrastructure rather than just a
> part of IPA-SRA.  Note that while ipa_combine_adjustments is not used
> from anywhere and thus probably buggy anyway, it should in theory be
> able to process new_param adjustments too.  Can you please at least
> put a "not implemented" assert there?  (The reason is that the plan

Done.

>> diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
>> index c38ba82..faae080 100644
>> --- a/gcc/ipa-cp.c
>> +++ b/gcc/ipa-cp.c
>> @@ -446,6 +446,13 @@ determine_versionability (struct cgraph_node *node)
>>       reason = "not a tree_versionable_function";
>>     else if (cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE)
>>       reason = "insufficient body availability";
>> +  else if (node->has_simd_clones)
>> +    {
>> +      /* Ideally we should clone the SIMD clones themselves and create
>> +	 vector copies of them, so IPA-cp and SIMD clones can happily
>> +	 coexist, but that may not be worth the effort.  */
>> +      reason = "function has SIMD clones";
>> +    }
>
> Lets hope we will eventually fix this in some followup :-)

Sure, but to be honest it's not super high on my priority list, perhaps 
once the basic functionality is in trunk.

>> +  tree new_arg_types = NULL;
>> +  for (int i = 0; i < len; i++)
>>       {
>>         struct ipa_parm_adjustment *adj;
>>         gcc_assert (link);
>>
>>         adj = &adjustments[i];
>> -      parm = oparms[adj->base_index];
>> +      tree parm;
>> +      if (adj->new_param)
>
> I don't know what I was thinking when I invented copy_param and
> remove_param as multiple flags rather than a single enum, I probably
> wasn't thinking at all.  I can change it myself as a followup if you
> have more pressing tasks now.  Meanwhile, can you gcc_checking_assert
> that at most one flag is set at appropriate places?

Not a problem, I can implement the enum changes since I'm already 
changing all this code.  Done.

>
>> +	parm = NULL;
>> +      else
>> +	parm = oparms[adj->base_index];
>>         adj->base = parm;
>
> I do not think it makes sense for new parameters to have a base which
> is basically the old decl.  Do you have any reasons for not setting it
> to NULL?

In this particular case, adj->base is already being set to NULL because 
parm=NULL for adj->op.  The code now reads:


>       if (adj->op == IPA_PARM_OP_NEW)
> 	parm = NULL;
>       else
> 	parm = oparms[adj->base_index];
>       adj->base = parm;

Am I missing something?  Base is already been set to NULL for new 
parameters.

>
>>
>>         if (adj->copy_param)
>> @@ -3417,8 +3418,18 @@ ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
>>   	  tree new_parm;
>>   	  tree ptype;
>>
>
>> -	  if (adj->by_ref)
>> -	    ptype = build_pointer_type (adj->type);
>
> Please add gcc_checking_assert (!adj->by_ref || adj->simdlen == 0)
> here...

Done.

>> +	  const char *prefix
>> +	    = adj->new_param ? adj->new_arg_prefix : synth_parm_prefix;
>
> Can we perhaps get rid of synth_parm_prefix then and just have
> adj->new_arg_prefix?  It's not particularly important but this is
> weird.

Done.

>
>
>> +	  DECL_NAME (new_parm) = create_tmp_var_name (prefix);
>>   	  DECL_ARTIFICIAL (new_parm) = 1;
>>   	  DECL_ARG_TYPE (new_parm) = ptype;
>>   	  DECL_CONTEXT (new_parm) = fndecl;
>> @@ -3436,17 +3448,20 @@ ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
>>   	  DECL_IGNORED_P (new_parm) = 1;
>>   	  layout_decl (new_parm, 0);
>>
>> -	  adj->base = parm;
>> +	  if (adj->new_param)
>> +	    adj->base = new_parm;
>
> Again, shouldn't this be NULL?

This one, yes :).  Done.

>> diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
>> index 48634d2..8d7d9b9 100644
>> --- a/gcc/ipa-prop.h
>> +++ b/gcc/ipa-prop.h
>> @@ -634,9 +634,10 @@ struct ipa_parm_adjustment
>>        arguments.  */
>>     tree alias_ptr_type;
>>
>> -  /* The new declaration when creating/replacing a parameter.  Created by
>> -     ipa_modify_formal_parameters, useful for functions modifying the body
>> -     accordingly. */
>> +  /* The new declaration when creating/replacing a parameter.  Created
>> +     by ipa_modify_formal_parameters, useful for functions modifying
>> +     the body accordingly.  For brand new arguments, this is the newly
>> +     created argument.  */
>>     tree reduction;
>
> We should eventually rename this to new_decl or something, given that
> this is not an SRA thing any more.  But that can be done later.

Done.

>
>>
>>     /* New declaration of a substitute variable that we may use to replace all
>> @@ -647,15 +648,36 @@ struct ipa_parm_adjustment
>>        is NULL), this is going to be its nonlocalized vars value.  */
>>     tree nonlocal_value;
>>
>> +  /* If this is a brand new argument, this holds the prefix to be used
>> +     for the DECL_NAME.  */
>> +  const char *new_arg_prefix;
>> +
>>     /* Offset into the original parameter (for the cases when the new parameter
>>        is a component of an original one).  */
>>     HOST_WIDE_INT offset;
>>
>> -  /* Zero based index of the original parameter this one is based on.  (ATM
>> -     there is no way to insert a new parameter out of the blue because there is
>> -     no need but if it arises the code can be easily exteded to do so.)  */
>> +  /* Zero based index of the original parameter this one is based on.  */
>>     int base_index;
>>
>> +  /* If non-null, the parameter is a vector of `type' with this many
>> +     elements.  */
>> +  int simdlen;
>> +
>> +  /* This is a brand new parameter.
>> +
>> +     For new parameters, base_index must be >= the number of
>> +     DECL_ARGUMENTS in the function.  That is, new arguments will be
>> +     the last arguments in the adjusted function.
>> +
>> +     ?? Perhaps we could redesign ipa_modify_formal_parameters() to
>> +     reorganize argument position, thus allowing inserting of brand
>> +     new arguments anywhere, but there is no use for this now.
>
> Where does this requirement come from?  At least at the moment I
> cannot see why ipa_modify_formal_parameters wouldn't be able to
> reorder parameters as it is?  What breaks if base_index of adjustments
> for new parameters has zero or a nonsensical value?

 From my very vivid imagination.  Forget I said that.  I hadn't looked 
into it at all; I just assumed.  I have removed the ??? comment.

> Hm, if you can directly use these, I really think you should rename
> them somehow so that their names do not contain SRA and move them to
> ipa-prop.c.

I'd like to do this as a followup so you can see all my changes before I 
move things en masse.

>
> Thanks for reviving this slightly moribund infrastructure and sorry
> again for the delay,

Not a problem.  Thanks for the review.

Would you be so kind as to review these changes to make sure I didn't 
miss anything?

The patch is lightly tested as my current box is pathetically slow today 
but so far so good with gomp.exp tests.

OK for gomp-4_0-branch pending tests?

Aldy
commit c4daa339084cb2d67b49fa2c33245ea09057752e
Author: Aldy Hernandez <aldyh@redhat.com>
Date:   Fri Nov 8 09:29:49 2013 -0700

    	* ipa-prop.c (ipa_modify_formal_parameters): Remove
    	synth_parm_prefix argument.
    	Use operator enum instead of bit fields.
    	Add assert for properly handling vector of references.
    	(ipa_modify_call_arguments): Use operator enum instead of bit
    	fields.
    	(ipa_combine_adjustments): Same.
    	Assert that IPA_PARM_OP_NEW is not used.
    	(ipa_dump_param_adjustments): Rename reduction to new_decl.
    	Use operator enum instead of bit fields.
    	* ipa-prop.h (enum ipa_parm_op): New.
    	(struct ipa_parm_adjustment): New field op.
    	Rename reduction to new_decl.
    	Rename new_arg_prefix to arg_prefix.
    	Remove new_param, remove_param, copy_param.
    	(ipa_modify_formal_parameters): Remove argument.
    	* omp-low.c (simd_clone_adjust_argument_types):	Set arg_prefix.
    	Use operator enum instead of bit fields.
    	(simd_clone_adjust_argument_types): Use operator enum instead of
    	bit fields.
    	Remove last argument to ipa_modify_formal_parameters call.
    	(simd_clone_init_simd_arrays): Use operator enum.
    	(ipa_simd_modify_stmt_ops): Rename reduction to new_decl.
    	(ipa_simd_modify_function_body): Same.
    	* tree-sra.c (turn_representatives_into_adjustments): Use operator
    	enum.  Set arg_prefix.
    	(get_adjustment_for_base): Use operator enum.
    	(sra_ipa_get_adjustment_candidate): Same.
    	(sra_ipa_modify_expr): Rename reduction to new_decl.
    	(sra_ipa_reset_debug_stmts): Use operator enum.
    	(modify_function): Do not pass prefix argument.
Martin Jambor - Nov. 11, 2013, 5:57 p.m.
Hi,

thanks for the followup.  I like it, I only don't understand...

On Fri, Nov 08, 2013 at 10:48:43AM -0700, Aldy Hernandez wrote:
> On 11/07/13 09:09, Martin Jambor wrote:
> 

<...>

> --- a/gcc/ipa-prop.h
> +++ b/gcc/ipa-prop.h
> @@ -609,6 +609,31 @@ extern alloc_pool ipcp_values_pool;
>  extern alloc_pool ipcp_sources_pool;
>  extern alloc_pool ipcp_agg_lattice_pool;
>  
> +/* Operation to be performed for the parameter in ipa_parm_adjustment
> +   below.  */
> +enum ipa_parm_op {
> +  IPA_PARM_OP_NONE,
> +
> +  /* This describes a brand new parameter.
> +
> +     For new parameters, base_index must be >= the number of
> +     DECL_ARGUMENTS in the function.  That is, new arguments will be
> +     the last arguments in the adjusted function.

...where this requirement comes from.  I would think that base_index
would be completely ignored for the new parameters, is it not?

Thanks,

Martin
Jakub Jelinek - Nov. 11, 2013, 6:30 p.m.
On Mon, Nov 11, 2013 at 06:57:39PM +0100, Martin Jambor wrote:
> > --- a/gcc/ipa-prop.h
> > +++ b/gcc/ipa-prop.h
> > @@ -609,6 +609,31 @@ extern alloc_pool ipcp_values_pool;
> >  extern alloc_pool ipcp_sources_pool;
> >  extern alloc_pool ipcp_agg_lattice_pool;
> >  
> > +/* Operation to be performed for the parameter in ipa_parm_adjustment
> > +   below.  */
> > +enum ipa_parm_op {
> > +  IPA_PARM_OP_NONE,
> > +
> > +  /* This describes a brand new parameter.
> > +
> > +     For new parameters, base_index must be >= the number of
> > +     DECL_ARGUMENTS in the function.  That is, new arguments will be
> > +     the last arguments in the adjusted function.
> 
> ...where this requirement comes from.  I would think that base_index
> would be completely ignored for the new parameters, is it not?

Ouch, I'll actually need to insert new parameters in the middle, because say
for SSE2
#pragma omp declare simd simdlen (4) inbranch
int foo (int x, long long y, int z);
is passed as
vector(4) int foo (vector(4) int x, vector(2) long long y,
		   vector(2) long long y2nd, vector(4) int z,
		   vector(4) int mask);
and thus I need to modify the first and second argument, then
insert a new argument after second, then modify third argument and add
another argument at the end.

	Jakub

Patch

diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 94a47cb..2a1f1e8 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -3362,12 +3362,8 @@  get_vector_of_formal_parm_types (tree fntype)
    base_index field.  */
 
 void
-ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
-			      const char *synth_parm_prefix)
+ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments)
 {
-  if (!synth_parm_prefix)
-    synth_parm_prefix = "SYNTH";
-
   vec<tree> oparms = ipa_get_vector_of_formal_parms (fndecl);
   tree orig_type = TREE_TYPE (fndecl);
   tree old_arg_types = TYPE_ARG_TYPES (orig_type);
@@ -3403,13 +3399,13 @@  ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
 
       adj = &adjustments[i];
       tree parm;
-      if (adj->new_param)
+      if (adj->op == IPA_PARM_OP_NEW)
 	parm = NULL;
       else
 	parm = oparms[adj->base_index];
       adj->base = parm;
 
-      if (adj->copy_param)
+      if (adj->op == IPA_PARM_OP_COPY)
 	{
 	  if (care_for_types)
 	    new_arg_types = tree_cons (NULL_TREE, otypes[adj->base_index],
@@ -3417,11 +3413,12 @@  ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
 	  *link = parm;
 	  link = &DECL_CHAIN (parm);
 	}
-      else if (!adj->remove_param)
+      else if (adj->op != IPA_PARM_OP_REMOVE)
 	{
 	  tree new_parm;
 	  tree ptype;
 
+	  gcc_checking_assert (!adj->by_ref || adj->simdlen);
 	  if (adj->simdlen)
 	    {
 	      /* If we have a non-null simdlen but by_ref is true, we
@@ -3442,8 +3439,7 @@  ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
 
 	  new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
 				 ptype);
-	  const char *prefix
-	    = adj->new_param ? adj->new_arg_prefix : synth_parm_prefix;
+	  const char *prefix = adj->arg_prefix ? adj->arg_prefix : "SYNTH";
 	  DECL_NAME (new_parm) = create_tmp_var_name (prefix);
 	  DECL_ARTIFICIAL (new_parm) = 1;
 	  DECL_ARG_TYPE (new_parm) = ptype;
@@ -3452,11 +3448,11 @@  ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
 	  DECL_IGNORED_P (new_parm) = 1;
 	  layout_decl (new_parm, 0);
 
-	  if (adj->new_param)
-	    adj->base = new_parm;
+	  if (adj->op == IPA_PARM_OP_NEW)
+	    adj->base = NULL;
 	  else
 	    adj->base = parm;
-	  adj->reduction = new_parm;
+	  adj->new_decl = new_parm;
 
 	  *link = new_parm;
 	  link = &DECL_CHAIN (new_parm);
@@ -3485,7 +3481,7 @@  ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
      instead.  */
   tree new_type = NULL;
   if (TREE_CODE (orig_type) != METHOD_TYPE
-       || (adjustments[0].copy_param
+       || (adjustments[0].op == IPA_PARM_OP_COPY
 	  && adjustments[0].base_index == 0))
     {
       new_type = build_distinct_type_copy (orig_type);
@@ -3558,13 +3554,13 @@  ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
 
       adj = &adjustments[i];
 
-      if (adj->copy_param)
+      if (adj->op == IPA_PARM_OP_COPY)
 	{
 	  tree arg = gimple_call_arg (stmt, adj->base_index);
 
 	  vargs.quick_push (arg);
 	}
-      else if (!adj->remove_param)
+      else if (adj->op != IPA_PARM_OP_REMOVE)
 	{
 	  tree expr, base, off;
 	  location_t loc;
@@ -3683,7 +3679,7 @@  ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
 					   NULL, true, GSI_SAME_STMT);
 	  vargs.quick_push (expr);
 	}
-      if (!adj->copy_param && MAY_HAVE_DEBUG_STMTS)
+      if (adj->op != IPA_PARM_OP_COPY && MAY_HAVE_DEBUG_STMTS)
 	{
 	  unsigned int ix;
 	  tree ddecl = NULL_TREE, origin = DECL_ORIGIN (adj->base), arg;
@@ -3803,10 +3799,14 @@  ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
       struct ipa_parm_adjustment *n;
       n = &inner[i];
 
-      if (n->remove_param)
+      if (n->op == IPA_PARM_OP_REMOVE)
 	removals++;
       else
-	tmp.quick_push (*n);
+	{
+	  /* FIXME: Handling of new arguments are not implemented yet.  */
+	  gcc_assert (n->op != IPA_PARM_OP_NEW);
+	  tmp.quick_push (*n);
+	}
     }
 
   adjustments.create (outlen + removals);
@@ -3817,27 +3817,32 @@  ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
       struct ipa_parm_adjustment *in = &tmp[out->base_index];
 
       memset (&r, 0, sizeof (r));
-      gcc_assert (!in->remove_param);
-      if (out->remove_param)
+      gcc_assert (in->op != IPA_PARM_OP_REMOVE);
+      if (out->op == IPA_PARM_OP_REMOVE)
 	{
 	  if (!index_in_adjustments_multiple_times_p (in->base_index, tmp))
 	    {
-	      r.remove_param = true;
+	      r.op = IPA_PARM_OP_REMOVE;
 	      adjustments.quick_push (r);
 	    }
 	  continue;
 	}
+      else
+	{
+	  /* FIXME: Handling of new arguments are not implemented yet.  */
+	  gcc_assert (out->op != IPA_PARM_OP_NEW);
+	}
 
       r.base_index = in->base_index;
       r.type = out->type;
 
       /* FIXME:  Create nonlocal value too.  */
 
-      if (in->copy_param && out->copy_param)
-	r.copy_param = true;
-      else if (in->copy_param)
+      if (in->op == IPA_PARM_OP_COPY && out->op == IPA_PARM_OP_COPY)
+	r.op = IPA_PARM_OP_COPY;
+      else if (in->op == IPA_PARM_OP_COPY)
 	r.offset = out->offset;
-      else if (out->copy_param)
+      else if (out->op == IPA_PARM_OP_COPY)
 	r.offset = in->offset;
       else
 	r.offset = in->offset + out->offset;
@@ -3848,7 +3853,7 @@  ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
     {
       struct ipa_parm_adjustment *n = &inner[i];
 
-      if (n->remove_param)
+      if (n->op == IPA_PARM_OP_REMOVE)
 	adjustments.quick_push (*n);
     }
 
@@ -3885,10 +3890,10 @@  ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
 	  fprintf (file, ", base: ");
 	  print_generic_expr (file, adj->base, 0);
 	}
-      if (adj->reduction)
+      if (adj->new_decl)
 	{
-	  fprintf (file, ", reduction: ");
-	  print_generic_expr (file, adj->reduction, 0);
+	  fprintf (file, ", new_decl: ");
+	  print_generic_expr (file, adj->new_decl, 0);
 	}
       if (adj->new_ssa_base)
 	{
@@ -3896,9 +3901,9 @@  ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
 	  print_generic_expr (file, adj->new_ssa_base, 0);
 	}
 
-      if (adj->copy_param)
+      if (adj->op == IPA_PARM_OP_COPY)
 	fprintf (file, ", copy_param");
-      else if (adj->remove_param)
+      else if (adj->op == IPA_PARM_OP_REMOVE)
 	fprintf (file, ", remove_param");
       else
 	fprintf (file, ", offset %li", (long) adj->offset);
diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
index 6aebf8d..e1e8622 100644
--- a/gcc/ipa-prop.h
+++ b/gcc/ipa-prop.h
@@ -609,6 +609,31 @@  extern alloc_pool ipcp_values_pool;
 extern alloc_pool ipcp_sources_pool;
 extern alloc_pool ipcp_agg_lattice_pool;
 
+/* Operation to be performed for the parameter in ipa_parm_adjustment
+   below.  */
+enum ipa_parm_op {
+  IPA_PARM_OP_NONE,
+
+  /* This describes a brand new parameter.
+
+     For new parameters, base_index must be >= the number of
+     DECL_ARGUMENTS in the function.  That is, new arguments will be
+     the last arguments in the adjusted function.
+
+     Also, `type' should be set to the new type, `arg_prefix'
+     should be set to the string prefix for the new DECL_NAME, and
+     `new_decl' will ultimately hold the newly created argument.  */
+  IPA_PARM_OP_NEW,
+
+  /* This new parameter is an unmodified parameter at index base_index. */
+  IPA_PARM_OP_COPY,
+
+  /* This adjustment describes a parameter that is about to be removed
+     completely.  Most users will probably need to book keep those so that they
+     don't leave behinfd any non default def ssa names belonging to them.  */
+  IPA_PARM_OP_REMOVE
+};
+
 /* Structure to describe transformations of formal parameters and actual
    arguments.  Each instance describes one new parameter and they are meant to
    be stored in a vector.  Additionally, most users will probably want to store
@@ -636,7 +661,7 @@  struct ipa_parm_adjustment
      by ipa_modify_formal_parameters, useful for functions modifying
      the body accordingly.  For brand new arguments, this is the newly
      created argument.  */
-  tree reduction;
+  tree new_decl;
 
   /* New declaration of a substitute variable that we may use to replace all
      non-default-def ssa names when a parm decl is going away.  */
@@ -646,9 +671,8 @@  struct ipa_parm_adjustment
      is NULL), this is going to be its nonlocalized vars value.  */
   tree nonlocal_value;
 
-  /* If this is a brand new argument, this holds the prefix to be used
-     for the DECL_NAME.  */
-  const char *new_arg_prefix;
+  /* This holds the prefix to be used for the new DECL_NAME.  */
+  const char *arg_prefix;
 
   /* Offset into the original parameter (for the cases when the new parameter
      is a component of an original one).  */
@@ -661,28 +685,9 @@  struct ipa_parm_adjustment
      elements.  */
   int simdlen;
 
-  /* This is a brand new parameter.
-
-     For new parameters, base_index must be >= the number of
-     DECL_ARGUMENTS in the function.  That is, new arguments will be
-     the last arguments in the adjusted function.
-
-     ?? Perhaps we could redesign ipa_modify_formal_parameters() to
-     reorganize argument position, thus allowing inserting of brand
-     new arguments anywhere, but there is no use for this now.
-
-     Also, `type' should be set to the new type, `new_arg_prefix'
-     should be set to the string prefix for the new DECL_NAME, and
-     `reduction' will ultimately hold the newly created argument.  */
-  unsigned new_param : 1;
-
-  /* This new parameter is an unmodified parameter at index base_index. */
-  unsigned copy_param : 1;
-
-  /* This adjustment describes a parameter that is about to be removed
-     completely.  Most users will probably need to book keep those so that they
-     don't leave behinfd any non default def ssa names belonging to them.  */
-  unsigned remove_param : 1;
+  /* Whether this parameter is a new parameter, a copy of an old one,
+     or one about to be removed.  */
+  enum ipa_parm_op op;
 
   /* The parameter is to be passed by reference.  */
   unsigned by_ref : 1;
@@ -693,8 +698,7 @@  typedef struct ipa_parm_adjustment ipa_parm_adjustment_t;
 typedef vec<ipa_parm_adjustment_t> ipa_parm_adjustment_vec;
 
 vec<tree> ipa_get_vector_of_formal_parms (tree fndecl);
-void ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec,
-				   const char *);
+void ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec);
 void ipa_modify_call_arguments (struct cgraph_edge *, gimple,
 				ipa_parm_adjustment_vec);
 ipa_parm_adjustment_vec ipa_combine_adjustments (ipa_parm_adjustment_vec,
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index 6845ee6..51cda58 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -11635,7 +11635,7 @@  simd_clone_adjust_argument_types (struct cgraph_node *node)
       if (node->simdclone->args[i].arg_type != SIMD_CLONE_ARG_TYPE_VECTOR)
 	{
 	  /* No adjustment necessary for scalar arguments.  */
-	  adj.copy_param = 1;
+	  adj.op = IPA_PARM_OP_COPY;
 	}
       else
 	{
@@ -11649,6 +11649,7 @@  simd_clone_adjust_argument_types (struct cgraph_node *node)
 				     TREE_TYPE (parm),
 				     node->simdclone->simdlen);
 	}
+      adj.arg_prefix = "simd";
       adjustments.quick_push (adj);
     }
 
@@ -11657,8 +11658,8 @@  simd_clone_adjust_argument_types (struct cgraph_node *node)
       struct ipa_parm_adjustment adj;
 
       memset (&adj, 0, sizeof (adj));
-      adj.new_param = 1;
-      adj.new_arg_prefix = "mask";
+      adj.op = IPA_PARM_OP_NEW;
+      adj.arg_prefix = "mask";
       adj.base_index = i;
       adj.type
 	= build_vector_type (integer_type_node, node->simdclone->simdlen);
@@ -11674,7 +11675,7 @@  simd_clone_adjust_argument_types (struct cgraph_node *node)
 	= create_tmp_simd_array ("mask", integer_type_node, sc->simdlen);
     }
 
-  ipa_modify_formal_parameters (node->decl, adjustments, "simd");
+  ipa_modify_formal_parameters (node->decl, adjustments);
   return adjustments;
 }
 
@@ -11693,7 +11694,7 @@  simd_clone_init_simd_arrays (struct cgraph_node *node,
        arg;
        arg = DECL_CHAIN (arg), i++)
     {
-      if (adjustments[i].copy_param)
+      if (adjustments[i].op == IPA_PARM_OP_COPY)
 	continue;
 
       node->simdclone->args[i].vector_arg = arg;
@@ -11749,7 +11750,7 @@  ipa_simd_modify_stmt_ops (tree *tp, int *walk_subtrees, void *data)
   gimple_stmt_iterator gsi = gsi_for_stmt (info->stmt);
   if (wi->is_lhs)
     {
-      stmt = gimple_build_assign (unshare_expr (cand->reduction), repl);
+      stmt = gimple_build_assign (unshare_expr (cand->new_decl), repl);
       gsi_insert_after (&gsi, stmt, GSI_SAME_STMT);
       SSA_NAME_DEF_STMT (repl) = info->stmt;
     }
@@ -11759,7 +11760,7 @@  ipa_simd_modify_stmt_ops (tree *tp, int *walk_subtrees, void *data)
 	 wi->val_only=true, but we may have `*var' which will get
 	 replaced into `*var_array[iter]' and will likely be something
 	 not gimple.  */
-      stmt = gimple_build_assign (repl, unshare_expr (cand->reduction));
+      stmt = gimple_build_assign (repl, unshare_expr (cand->new_decl));
       gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
     }
 
@@ -11802,7 +11803,7 @@  ipa_simd_modify_function_body (struct cgraph_node *node,
 	continue;
 
       tree basetype = TREE_TYPE (node->simdclone->args[i].orig_arg);
-      adjustments[i].reduction
+      adjustments[i].new_decl
 	= build4 (ARRAY_REF,
 		  basetype,
 		  node->simdclone->args[i].simd_array,
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 36994f7..2f19899 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -4271,9 +4271,10 @@  turn_representatives_into_adjustments (vec<access_p> representatives,
 	  adj.base_index = get_param_index (parm, parms);
 	  adj.base = parm;
 	  if (!repr)
-	    adj.copy_param = 1;
+	    adj.op = IPA_PARM_OP_COPY;
 	  else
-	    adj.remove_param = 1;
+	    adj.op = IPA_PARM_OP_REMOVE;
+	  adj.arg_prefix = "ISRA";
 	  adjustments.quick_push (adj);
 	}
       else
@@ -4293,6 +4294,7 @@  turn_representatives_into_adjustments (vec<access_p> representatives,
 	      adj.by_ref = (POINTER_TYPE_P (TREE_TYPE (repr->base))
 			    && (repr->grp_maybe_modified
 				|| repr->grp_not_necessarilly_dereferenced));
+	      adj.arg_prefix = "ISRA";
 	      adjustments.quick_push (adj);
 	    }
 	}
@@ -4423,7 +4425,7 @@  get_adjustment_for_base (ipa_parm_adjustment_vec adjustments, tree base)
       struct ipa_parm_adjustment *adj;
 
       adj = &adjustments[i];
-      if (!adj->copy_param && adj->base == base)
+      if (adj->op != IPA_PARM_OP_COPY && adj->base == base)
 	return adj;
     }
 
@@ -4534,14 +4536,14 @@  sra_ipa_get_adjustment_candidate (tree *&expr, bool *convert,
       struct ipa_parm_adjustment *adj = &adjustments[i];
 
       if (adj->base == base
-	  && (adj->offset == offset || adj->remove_param))
+	  && (adj->offset == offset || adj->op == IPA_PARM_OP_REMOVE))
 	{
 	  cand = adj;
 	  break;
 	}
     }
 
-  if (!cand || cand->copy_param || cand->remove_param)
+  if (!cand || cand->op == IPA_PARM_OP_COPY || cand->op == IPA_PARM_OP_REMOVE)
     return NULL;
   return cand;
 }
@@ -4564,9 +4566,9 @@  sra_ipa_modify_expr (tree *expr, bool convert,
 
   tree src;
   if (cand->by_ref)
-    src = build_simple_mem_ref (cand->reduction);
+    src = build_simple_mem_ref (cand->new_decl);
   else
-    src = cand->reduction;
+    src = cand->new_decl;
 
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
@@ -4760,7 +4762,7 @@  sra_ipa_reset_debug_stmts (ipa_parm_adjustment_vec adjustments)
       use_operand_p use_p;
 
       adj = &adjustments[i];
-      if (adj->copy_param || !is_gimple_reg (adj->base))
+      if (adj->op == IPA_PARM_OP_COPY || !is_gimple_reg (adj->base))
 	continue;
       name = ssa_default_def (cfun, adj->base);
       vexpr = NULL;
@@ -4943,7 +4945,7 @@  modify_function (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments)
   redirect_callers.release ();
 
   push_cfun (DECL_STRUCT_FUNCTION (new_node->decl));
-  ipa_modify_formal_parameters (current_function_decl, adjustments, "ISRA");
+  ipa_modify_formal_parameters (current_function_decl, adjustments);
   cfg_changed = ipa_sra_modify_function_body (adjustments);
   sra_ipa_reset_debug_stmts (adjustments);
   convert_callers (new_node, node->decl, adjustments);