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