Intrastructure for gcse fix

Richard Kenner kenner@vlsi1.ultra.nyu.edu
Sun Feb 18 06:36:00 GMT 2001


This adds a new function that genemit.c writes.  For insns that have
"added clobbers", it says if any of those clobbers are for hard regs.  It
will be used by my next change.  Lightly tested since not called yet.

Sun Feb 18 09:30:09 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>

	* rtl.h (add_clobbers): Remove duplicate declaration.
	* recog.h (added_clobbers_hard_reg_p): New declaration.
	* genemit.c (struct clobber_pat): New field has_hard_reg.
	(gen_insn): Record if added clobbers clobber hard reg.
	(gen_split): Avoid unused warning if number of operands is 0.
	(output_added_clobbers_hard_reg_p): New function.
	(main): Call it.

*** rtl.h	2001/02/17 19:50:57	1.243
--- rtl.h	2001/02/18 14:28:14
*************** extern void renumber_insns              
*** 1784,1790 ****
  extern void remove_unnecessary_notes             PARAMS ((void));
  
- /* In insn-emit.c */
- extern void add_clobbers		PARAMS ((rtx, int));
- 
  /* In combine.c */
  extern int combine_instructions		PARAMS ((rtx, unsigned int));
--- 1784,1787 ----
*************** extern int mode_dependent_address_p	PARA
*** 120,123 ****
--- 120,124 ----
  extern int recog			PARAMS ((rtx, rtx, int *));
  extern void add_clobbers		PARAMS ((rtx, int));
+ extern int added_clobbers_hard_reg_p	PARAMS ((int));
  extern void insn_extract		PARAMS ((rtx));
  extern void extract_insn		PARAMS ((rtx));
--- genemit.c	2001/02/18 14:28:16
*************** struct clobber_pat
*** 45,48 ****
--- 45,49 ----
    int first_clobber;
    struct clobber_pat *next;
+   int has_hard_reg;
  } *clobber_list;
  
*************** static void gen_expand			PARAMS ((rtx));
*** 63,66 ****
--- 64,68 ----
  static void gen_split			PARAMS ((rtx));
  static void output_add_clobbers		PARAMS ((void));
+ static void output_added_clobbers_hard_reg_p PARAMS ((void));
  static void gen_rtx_scratch		PARAMS ((rtx, enum rtx_code));
  static void output_peephole2_scratches	PARAMS ((rtx));
*************** gen_insn (insn)
*** 298,306 ****
    if (XVEC (insn, 1))
      {
        for (i = XVECLEN (insn, 1) - 1; i > 0; i--)
! 	if (GET_CODE (XVECEXP (insn, 1, i)) != CLOBBER
! 	    || (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) != REG
! 		&& GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) != MATCH_SCRATCH))
! 	  break;
  
        if (i != XVECLEN (insn, 1) - 1)
--- 300,315 ----
    if (XVEC (insn, 1))
      {
+       int has_hard_reg = 0;
+ 
        for (i = XVECLEN (insn, 1) - 1; i > 0; i--)
! 	{
! 	  if (GET_CODE (XVECEXP (insn, 1, i)) != CLOBBER)
! 	    break;
! 
! 	  if (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) == REG)
! 	    has_hard_reg = 1;
! 	  else if (GET_CODE (XEXP (XVECEXP (insn, 1, i), 0)) != MATCH_SCRATCH)
! 	    break;
! 	}
  
        if (i != XVECLEN (insn, 1) - 1)
*************** gen_insn (insn)
*** 350,353 ****
--- 359,363 ----
  	      p->first_clobber = i + 1;
  	      p->next = clobber_list;
+ 	      p->has_hard_reg = has_hard_reg;
  	      clobber_list = p;
  	    }
*************** gen_split (split)
*** 550,553 ****
--- 560,564 ----
    int operands;
    const char *name = "split";
+   const char *unused;
  
    if (GET_CODE (split) == DEFINE_PEEPHOLE2)
*************** gen_split (split)
*** 565,568 ****
--- 576,580 ----
    max_operand_vec (split, 2);
    operands = MAX (max_opno, MAX (max_dup_opno, max_scratch_opno)) + 1;
+   unused = (operands == 0 ? " ATTRIBUTE_UNUSED" : "");
  
    /* Output the prototype, function name and argument declarations.  */
*************** gen_split (split)
*** 571,584 ****
        printf ("extern rtx gen_%s_%d PARAMS ((rtx, rtx *));\n",
  	      name, insn_code_number);
!       printf ("rtx\ngen_%s_%d (curr_insn, operands)\n\
!      rtx curr_insn ATTRIBUTE_UNUSED;\n\
!      rtx *operands;\n", 
  	      name, insn_code_number);
      }
    else
      {
        printf ("extern rtx gen_split_%d PARAMS ((rtx *));\n", insn_code_number);
!       printf ("rtx\ngen_%s_%d (operands)\n     rtx *operands;\n", name,
! 	      insn_code_number);
      }
    printf ("{\n");
--- 583,596 ----
        printf ("extern rtx gen_%s_%d PARAMS ((rtx, rtx *));\n",
  	      name, insn_code_number);
!       printf ("rtx\ngen_%s_%d (curr_insn, operands)\n",
  	      name, insn_code_number);
+       printf ("     rtx curr_insn ATTRIBUTE_UNUSED;\n");
+       printf ("     rtx *operands%s;\n", unused);
      }
    else
      {
        printf ("extern rtx gen_split_%d PARAMS ((rtx *));\n", insn_code_number);
!       printf ("rtx\ngen_%s_%d (operands)\n", name, insn_code_number);
!       printf ("      rtx *operands%s;\n", unused);
      }
    printf ("{\n");
*************** output_add_clobbers ()
*** 690,693 ****
--- 702,738 ----
  }
  
+ /* Write a function, `added_clobbers_hard_reg_p' this is given an insn_code
+    number that needs clobbers and returns 1 if they include a clobber of a
+    hard reg and 0 if they just clobber SCRATCH.  */
+ 
+ static void
+ output_added_clobbers_hard_reg_p ()
+ {
+   struct clobber_pat *clobber;
+   struct clobber_ent *ent;
+   int clobber_p;
+ 
+   printf ("\n\nint\nadded_clobbers_hard_reg_p (insn_code_number)\n");
+   printf ("     int insn_code_number;\n");
+   printf ("{\n");
+   printf ("  switch (insn_code_number)\n");
+   printf ("    {\n");
+ 
+   for (clobber_p = 0; clobber_p <= 1; clobber_p++)
+     {
+       for (clobber = clobber_list; clobber; clobber = clobber->next)
+ 	if (clobber->has_hard_reg == clobber_p)
+ 	  for (ent = clobber->insns; ent; ent = ent->next)
+ 	    printf ("    case %d:\n", ent->code_number);
+ 
+       printf ("      return %d;\n\n", clobber_p);
+     }
+ 
+   printf ("    default:\n");
+   printf ("      abort ();\n");
+   printf ("    }\n");
+   printf ("}\n");
+ }
+ 
  /* Generate code to invoke find_free_register () as needed for the
     scratch registers used by the peephole2 pattern in SPLIT. */
*************** from the machine description file `md'. 
*** 813,818 ****
      }
  
!   /* Write out the routine to add CLOBBERs to a pattern.  */
    output_add_clobbers ();
  
    fflush (stdout);
--- 858,865 ----
      }
  
!   /* Write out the routines to add CLOBBERs to a pattern and say whether they
!      clobber a hard reg.  */
    output_add_clobbers ();
+   output_added_clobbers_hard_reg_p ();
  
    fflush (stdout);



More information about the Gcc-patches mailing list