rtl.h (emit): Add an optional boolean parameter to control whether barriers are emitted.
gcc/ * rtl.h (emit): Add an optional boolean parameter to control whether barriers are emitted. * emit-rtl.c (emit): Likewise. * gensupport.c (get_emit_function): Return null rather than "emit". * genemit.c (gen_emit_seq): Handle the null return value. Don't emit barriers after the final instruction in the sequence. * gentarget-def.c (main): Don't emit barriers after the instruction. From-SVN: r225000
This commit is contained in:
parent
311bd4d897
commit
9d8895c934
@ -1,3 +1,13 @@
|
|||||||
|
2015-06-26 Richard Sandiford <richard.sandiford@arm.com>
|
||||||
|
|
||||||
|
* rtl.h (emit): Add an optional boolean parameter to control
|
||||||
|
whether barriers are emitted.
|
||||||
|
* emit-rtl.c (emit): Likewise.
|
||||||
|
* gensupport.c (get_emit_function): Return null rather than "emit".
|
||||||
|
* genemit.c (gen_emit_seq): Handle the null return value.
|
||||||
|
Don't emit barriers after the final instruction in the sequence.
|
||||||
|
* gentarget-def.c (main): Don't emit barriers after the instruction.
|
||||||
|
|
||||||
2015-06-26 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
|
2015-06-26 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
|
||||||
|
|
||||||
* config/arm/arm.c (arm_output_multireg_pop): Fix use of
|
* config/arm/arm.c (arm_output_multireg_pop): Fix use of
|
||||||
|
@ -5303,11 +5303,14 @@ set_dst_reg_note (rtx insn, enum reg_note kind, rtx datum, rtx dst)
|
|||||||
return NULL_RTX;
|
return NULL_RTX;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emit the rtl pattern X as an appropriate kind of insn.
|
/* Emit the rtl pattern X as an appropriate kind of insn. Also emit a
|
||||||
|
following barrier if the instruction needs one and if ALLOW_BARRIER_P
|
||||||
|
is true.
|
||||||
|
|
||||||
If X is a label, it is simply added into the insn chain. */
|
If X is a label, it is simply added into the insn chain. */
|
||||||
|
|
||||||
rtx_insn *
|
rtx_insn *
|
||||||
emit (rtx x)
|
emit (rtx x, bool allow_barrier_p)
|
||||||
{
|
{
|
||||||
enum rtx_code code = classify_insn (x);
|
enum rtx_code code = classify_insn (x);
|
||||||
|
|
||||||
@ -5320,7 +5323,8 @@ emit (rtx x)
|
|||||||
case JUMP_INSN:
|
case JUMP_INSN:
|
||||||
{
|
{
|
||||||
rtx_insn *insn = emit_jump_insn (x);
|
rtx_insn *insn = emit_jump_insn (x);
|
||||||
if (any_uncondjump_p (insn) || GET_CODE (x) == RETURN)
|
if (allow_barrier_p
|
||||||
|
&& (any_uncondjump_p (insn) || GET_CODE (x) == RETURN))
|
||||||
return emit_barrier ();
|
return emit_barrier ();
|
||||||
return insn;
|
return insn;
|
||||||
}
|
}
|
||||||
|
@ -277,12 +277,22 @@ gen_emit_seq (rtvec vec, char *used)
|
|||||||
{
|
{
|
||||||
for (int i = 0, len = GET_NUM_ELEM (vec); i < len; ++i)
|
for (int i = 0, len = GET_NUM_ELEM (vec); i < len; ++i)
|
||||||
{
|
{
|
||||||
|
bool last_p = (i == len - 1);
|
||||||
rtx next = RTVEC_ELT (vec, i);
|
rtx next = RTVEC_ELT (vec, i);
|
||||||
printf (" %s (", get_emit_function (next));
|
if (const char *name = get_emit_function (next))
|
||||||
gen_exp (next, DEFINE_EXPAND, used);
|
{
|
||||||
printf (");\n");
|
printf (" %s (", name);
|
||||||
if (needs_barrier_p (next))
|
gen_exp (next, DEFINE_EXPAND, used);
|
||||||
printf (" emit_barrier ();");
|
printf (");\n");
|
||||||
|
if (!last_p && needs_barrier_p (next))
|
||||||
|
printf (" emit_barrier ();");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf (" emit (");
|
||||||
|
gen_exp (next, DEFINE_EXPAND, used);
|
||||||
|
printf (", %s);\n", last_p ? "false" : "true");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2983,7 +2983,9 @@ get_pattern_stats (struct pattern_stats *stats, rtvec pattern)
|
|||||||
stats->max_scratch_opno)) + 1;
|
stats->max_scratch_opno)) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the emit_* function that should be used for pattern X. */
|
/* Return the emit_* function that should be used for pattern X, or NULL
|
||||||
|
if we can't pick a particular type at compile time and should instead
|
||||||
|
fall back to "emit". */
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
get_emit_function (rtx x)
|
get_emit_function (rtx x)
|
||||||
@ -3000,7 +3002,7 @@ get_emit_function (rtx x)
|
|||||||
return "emit_jump_insn";
|
return "emit_jump_insn";
|
||||||
|
|
||||||
case UNKNOWN:
|
case UNKNOWN:
|
||||||
return "emit";
|
return NULL;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
gcc_unreachable ();
|
gcc_unreachable ();
|
||||||
|
@ -245,7 +245,7 @@ main (int argc, char **argv)
|
|||||||
printf (" if (rtx_insn *insn = dyn_cast <rtx_insn *> (x))\n");
|
printf (" if (rtx_insn *insn = dyn_cast <rtx_insn *> (x))\n");
|
||||||
printf (" return insn;\n");
|
printf (" return insn;\n");
|
||||||
printf (" start_sequence ();\n");
|
printf (" start_sequence ();\n");
|
||||||
printf (" emit (x);\n");
|
printf (" emit (x, false);\n");
|
||||||
printf (" rtx_insn *res = get_insns ();\n");
|
printf (" rtx_insn *res = get_insns ();\n");
|
||||||
printf (" end_sequence ();\n");
|
printf (" end_sequence ();\n");
|
||||||
printf (" return res;\n");
|
printf (" return res;\n");
|
||||||
|
@ -3494,7 +3494,7 @@ extern void add_insn (rtx_insn *);
|
|||||||
extern void add_insn_before (rtx, rtx, basic_block);
|
extern void add_insn_before (rtx, rtx, basic_block);
|
||||||
extern void add_insn_after (rtx, rtx, basic_block);
|
extern void add_insn_after (rtx, rtx, basic_block);
|
||||||
extern void remove_insn (rtx);
|
extern void remove_insn (rtx);
|
||||||
extern rtx_insn *emit (rtx);
|
extern rtx_insn *emit (rtx, bool = true);
|
||||||
extern void emit_insn_at_entry (rtx);
|
extern void emit_insn_at_entry (rtx);
|
||||||
extern rtx gen_lowpart_SUBREG (machine_mode, rtx);
|
extern rtx gen_lowpart_SUBREG (machine_mode, rtx);
|
||||||
extern rtx gen_const_mem (machine_mode, rtx);
|
extern rtx gen_const_mem (machine_mode, rtx);
|
||||||
|
Loading…
Reference in New Issue
Block a user