diff mbox series

[1/5] Use alternative_mask for add_insn_allocno_copies

Message ID mptk1dfm503.fsf@arm.com
State New
Headers show
Series Tweak IRA handling of tying and earlyclobbers | expand

Commit Message

Richard Sandiford June 21, 2019, 1:39 p.m. UTC
add_insn_allocno_copies and its subroutines used HARD_REG_SET to
represent a bitmask of alternatives.  There's not really any connection
between the number of registers and the maximum number of alternatives,
so this patch uses alternative_mask instead (which wasn't around when
this code was added).

This is just a minor clean-up making way for later patches.


2019-06-21  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* ira-int.h (ira_setup_alts, ira_get_dup_out_num): Use
	alternative_mask instead of HARD_REG_SET to represent a
	bitmask of alternatives.
	* ira.c (ira_setup_alts, ira_get_dup_out_num): Likewise.
	* ira-conflicts.c (add_insn_allocno_copies): Likewise.

Comments

Richard Sandiford June 28, 2019, 11:46 a.m. UTC | #1
Ping.  (And thanks for the reviews of the other patches in the series.)

Richard Sandiford <richard.sandiford@arm.com> writes:
> add_insn_allocno_copies and its subroutines used HARD_REG_SET to
> represent a bitmask of alternatives.  There's not really any connection
> between the number of registers and the maximum number of alternatives,
> so this patch uses alternative_mask instead (which wasn't around when
> this code was added).
>
> This is just a minor clean-up making way for later patches.
>
>
> 2019-06-21  Richard Sandiford  <richard.sandiford@arm.com>
>
> gcc/
> 	* ira-int.h (ira_setup_alts, ira_get_dup_out_num): Use
> 	alternative_mask instead of HARD_REG_SET to represent a
> 	bitmask of alternatives.
> 	* ira.c (ira_setup_alts, ira_get_dup_out_num): Likewise.
> 	* ira-conflicts.c (add_insn_allocno_copies): Likewise.
>
> Index: gcc/ira-int.h
> ===================================================================
> --- gcc/ira-int.h	2019-06-21 14:34:05.000000000 +0100
> +++ gcc/ira-int.h	2019-06-21 14:34:05.883715050 +0100
> @@ -963,8 +963,8 @@ extern void ira_print_disposition (FILE
>  extern void ira_debug_disposition (void);
>  extern void ira_debug_allocno_classes (void);
>  extern void ira_init_register_move_cost (machine_mode);
> -extern void ira_setup_alts (rtx_insn *insn, HARD_REG_SET &alts);
> -extern int ira_get_dup_out_num (int op_num, HARD_REG_SET &alts);
> +extern alternative_mask ira_setup_alts (rtx_insn *);
> +extern int ira_get_dup_out_num (int, alternative_mask);
>  
>  /* ira-build.c */
>  
> Index: gcc/ira.c
> ===================================================================
> --- gcc/ira.c	2019-06-21 14:34:05.000000000 +0100
> +++ gcc/ira.c	2019-06-21 14:34:05.887715020 +0100
> @@ -1784,9 +1784,12 @@ setup_prohibited_mode_move_regs (void)
>  
>  
>  
> -/* Setup possible alternatives in ALTS for INSN.  */
> -void
> -ira_setup_alts (rtx_insn *insn, HARD_REG_SET &alts)
> +/* Extract INSN and return the set of alternatives that we should consider.
> +   This excludes any alternatives whose constraints are obviously impossible
> +   to meet (e.g. because the constraint requires a constant and the operand
> +   is nonconstant).  */
> +alternative_mask
> +ira_setup_alts (rtx_insn *insn)
>  {
>    /* MAP nalt * nop -> start of constraints for given operand and
>       alternative.  */
> @@ -1798,7 +1801,7 @@ ira_setup_alts (rtx_insn *insn, HARD_REG
>  
>    extract_insn (insn);
>    alternative_mask preferred = get_preferred_alternatives (insn);
> -  CLEAR_HARD_REG_SET (alts);
> +  alternative_mask alts = 0;
>    insn_constraints.release ();
>    insn_constraints.safe_grow_cleared (recog_data.n_operands
>  				      * recog_data.n_alternatives + 1);
> @@ -1833,8 +1836,7 @@ ira_setup_alts (rtx_insn *insn, HARD_REG
>  	}
>        for (nalt = 0; nalt < recog_data.n_alternatives; nalt++)
>  	{
> -	  if (!TEST_BIT (preferred, nalt)
> -	      || TEST_HARD_REG_BIT (alts, nalt))
> +	  if (!TEST_BIT (preferred, nalt) || TEST_BIT (alts, nalt))
>  	    continue;
>  
>  	  for (nop = 0; nop < recog_data.n_operands; nop++)
> @@ -1906,7 +1908,7 @@ ira_setup_alts (rtx_insn *insn, HARD_REG
>  	      ;
>  	    }
>  	  if (nop >= recog_data.n_operands)
> -	    SET_HARD_REG_BIT (alts, nalt);
> +	    alts |= ALTERNATIVE_BIT (nalt);
>  	}
>        if (commutative < 0)
>  	break;
> @@ -1916,6 +1918,7 @@ ira_setup_alts (rtx_insn *insn, HARD_REG
>        if (curr_swapped)
>  	break;
>      }
> +  return alts;
>  }
>  
>  /* Return the number of the output non-early clobber operand which
> @@ -1923,7 +1926,7 @@ ira_setup_alts (rtx_insn *insn, HARD_REG
>     negative value if there is no such operand).  The function takes
>     only really possible alternatives into consideration.  */
>  int
> -ira_get_dup_out_num (int op_num, HARD_REG_SET &alts)
> +ira_get_dup_out_num (int op_num, alternative_mask alts)
>  {
>    int curr_alt, c, original, dup;
>    bool ignore_p, use_commut_op_p;
> @@ -1940,7 +1943,7 @@ ira_get_dup_out_num (int op_num, HARD_RE
>      {
>        rtx op = recog_data.operand[op_num];
>        
> -      for (curr_alt = 0, ignore_p = !TEST_HARD_REG_BIT (alts, curr_alt),
> +      for (curr_alt = 0, ignore_p = !TEST_BIT (alts, curr_alt),
>  	   original = -1;;)
>  	{
>  	  c = *str;
> @@ -1951,7 +1954,7 @@ ira_get_dup_out_num (int op_num, HARD_RE
>  	  else if (c == ',')
>  	    {
>  	      curr_alt++;
> -	      ignore_p = !TEST_HARD_REG_BIT (alts, curr_alt);
> +	      ignore_p = !TEST_BIT (alts, curr_alt);
>  	    }
>  	  else if (! ignore_p)
>  	    switch (c)
> Index: gcc/ira-conflicts.c
> ===================================================================
> --- gcc/ira-conflicts.c	2019-06-21 14:34:05.000000000 +0100
> +++ gcc/ira-conflicts.c	2019-06-21 14:34:05.883715050 +0100
> @@ -358,7 +358,7 @@ add_insn_allocno_copies (rtx_insn *insn)
>    rtx set, operand, dup;
>    bool bound_p[MAX_RECOG_OPERANDS];
>    int i, n, freq;
> -  HARD_REG_SET alts;
> +  alternative_mask alts;
>  
>    freq = REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn));
>    if (freq == 0)
> @@ -379,7 +379,7 @@ add_insn_allocno_copies (rtx_insn *insn)
>       there are no dead registers, there will be no such copies.  */
>    if (! find_reg_note (insn, REG_DEAD, NULL_RTX))
>      return;
> -  ira_setup_alts (insn, alts);
> +  alts = ira_setup_alts (insn);
>    for (i = 0; i < recog_data.n_operands; i++)
>      bound_p[i] = false;
>    for (i = 0; i < recog_data.n_operands; i++)
Vladimir Makarov June 28, 2019, 2:17 p.m. UTC | #2
On 2019-06-28 7:46 a.m., Richard Sandiford wrote:
> Ping.  (And thanks for the reviews of the other patches in the series.)
Sorry, I missed this patch.  Yes, the patch is OK, Richard.
> Richard Sandiford <richard.sandiford@arm.com> writes:
>> add_insn_allocno_copies and its subroutines used HARD_REG_SET to
>> represent a bitmask of alternatives.  There's not really any connection
>> between the number of registers and the maximum number of alternatives,
>> so this patch uses alternative_mask instead (which wasn't around when
>> this code was added).
>>
>> This is just a minor clean-up making way for later patches.
>>
>>
>> 2019-06-21  Richard Sandiford  <richard.sandiford@arm.com>
>>
>> gcc/
>> 	* ira-int.h (ira_setup_alts, ira_get_dup_out_num): Use
>> 	alternative_mask instead of HARD_REG_SET to represent a
>> 	bitmask of alternatives.
>> 	* ira.c (ira_setup_alts, ira_get_dup_out_num): Likewise.
>> 	* ira-conflicts.c (add_insn_allocno_copies): Likewise.
>>
diff mbox series

Patch

Index: gcc/ira-int.h
===================================================================
--- gcc/ira-int.h	2019-06-21 14:34:05.000000000 +0100
+++ gcc/ira-int.h	2019-06-21 14:34:05.883715050 +0100
@@ -963,8 +963,8 @@  extern void ira_print_disposition (FILE
 extern void ira_debug_disposition (void);
 extern void ira_debug_allocno_classes (void);
 extern void ira_init_register_move_cost (machine_mode);
-extern void ira_setup_alts (rtx_insn *insn, HARD_REG_SET &alts);
-extern int ira_get_dup_out_num (int op_num, HARD_REG_SET &alts);
+extern alternative_mask ira_setup_alts (rtx_insn *);
+extern int ira_get_dup_out_num (int, alternative_mask);
 
 /* ira-build.c */
 
Index: gcc/ira.c
===================================================================
--- gcc/ira.c	2019-06-21 14:34:05.000000000 +0100
+++ gcc/ira.c	2019-06-21 14:34:05.887715020 +0100
@@ -1784,9 +1784,12 @@  setup_prohibited_mode_move_regs (void)
 
 
 
-/* Setup possible alternatives in ALTS for INSN.  */
-void
-ira_setup_alts (rtx_insn *insn, HARD_REG_SET &alts)
+/* Extract INSN and return the set of alternatives that we should consider.
+   This excludes any alternatives whose constraints are obviously impossible
+   to meet (e.g. because the constraint requires a constant and the operand
+   is nonconstant).  */
+alternative_mask
+ira_setup_alts (rtx_insn *insn)
 {
   /* MAP nalt * nop -> start of constraints for given operand and
      alternative.  */
@@ -1798,7 +1801,7 @@  ira_setup_alts (rtx_insn *insn, HARD_REG
 
   extract_insn (insn);
   alternative_mask preferred = get_preferred_alternatives (insn);
-  CLEAR_HARD_REG_SET (alts);
+  alternative_mask alts = 0;
   insn_constraints.release ();
   insn_constraints.safe_grow_cleared (recog_data.n_operands
 				      * recog_data.n_alternatives + 1);
@@ -1833,8 +1836,7 @@  ira_setup_alts (rtx_insn *insn, HARD_REG
 	}
       for (nalt = 0; nalt < recog_data.n_alternatives; nalt++)
 	{
-	  if (!TEST_BIT (preferred, nalt)
-	      || TEST_HARD_REG_BIT (alts, nalt))
+	  if (!TEST_BIT (preferred, nalt) || TEST_BIT (alts, nalt))
 	    continue;
 
 	  for (nop = 0; nop < recog_data.n_operands; nop++)
@@ -1906,7 +1908,7 @@  ira_setup_alts (rtx_insn *insn, HARD_REG
 	      ;
 	    }
 	  if (nop >= recog_data.n_operands)
-	    SET_HARD_REG_BIT (alts, nalt);
+	    alts |= ALTERNATIVE_BIT (nalt);
 	}
       if (commutative < 0)
 	break;
@@ -1916,6 +1918,7 @@  ira_setup_alts (rtx_insn *insn, HARD_REG
       if (curr_swapped)
 	break;
     }
+  return alts;
 }
 
 /* Return the number of the output non-early clobber operand which
@@ -1923,7 +1926,7 @@  ira_setup_alts (rtx_insn *insn, HARD_REG
    negative value if there is no such operand).  The function takes
    only really possible alternatives into consideration.  */
 int
-ira_get_dup_out_num (int op_num, HARD_REG_SET &alts)
+ira_get_dup_out_num (int op_num, alternative_mask alts)
 {
   int curr_alt, c, original, dup;
   bool ignore_p, use_commut_op_p;
@@ -1940,7 +1943,7 @@  ira_get_dup_out_num (int op_num, HARD_RE
     {
       rtx op = recog_data.operand[op_num];
       
-      for (curr_alt = 0, ignore_p = !TEST_HARD_REG_BIT (alts, curr_alt),
+      for (curr_alt = 0, ignore_p = !TEST_BIT (alts, curr_alt),
 	   original = -1;;)
 	{
 	  c = *str;
@@ -1951,7 +1954,7 @@  ira_get_dup_out_num (int op_num, HARD_RE
 	  else if (c == ',')
 	    {
 	      curr_alt++;
-	      ignore_p = !TEST_HARD_REG_BIT (alts, curr_alt);
+	      ignore_p = !TEST_BIT (alts, curr_alt);
 	    }
 	  else if (! ignore_p)
 	    switch (c)
Index: gcc/ira-conflicts.c
===================================================================
--- gcc/ira-conflicts.c	2019-06-21 14:34:05.000000000 +0100
+++ gcc/ira-conflicts.c	2019-06-21 14:34:05.883715050 +0100
@@ -358,7 +358,7 @@  add_insn_allocno_copies (rtx_insn *insn)
   rtx set, operand, dup;
   bool bound_p[MAX_RECOG_OPERANDS];
   int i, n, freq;
-  HARD_REG_SET alts;
+  alternative_mask alts;
 
   freq = REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn));
   if (freq == 0)
@@ -379,7 +379,7 @@  add_insn_allocno_copies (rtx_insn *insn)
      there are no dead registers, there will be no such copies.  */
   if (! find_reg_note (insn, REG_DEAD, NULL_RTX))
     return;
-  ira_setup_alts (insn, alts);
+  alts = ira_setup_alts (insn);
   for (i = 0; i < recog_data.n_operands; i++)
     bound_p[i] = false;
   for (i = 0; i < recog_data.n_operands; i++)