const_insn = prev;
}
}
- lra_process_new_insns (curr_insn, before, after, "Inserting insn reload");
+ lra_process_new_insns (curr_insn, before, after,
+ "Inserting insn reload", true);
if (const_regno >= 0) {
bool move_p = true;
for (rtx_insn *insn = before; insn != curr_insn; insn = NEXT_INSN (insn))
extern void lra_dump_insns (FILE *f);
extern void lra_dump_insns_if_possible (const char *title);
-extern void lra_process_new_insns (rtx_insn *, rtx_insn *, rtx_insn *,
- const char *);
+extern void lra_process_new_insns (rtx_insn *insn, rtx_insn *before,
+ rtx_insn *after, const char *title,
+ bool fixup_reg_args_size = false);
extern bool lra_substitute_pseudo (rtx *, int, rtx, bool, bool);
extern bool lra_substitute_pseudo_within_insn (rtx_insn *, int, rtx, bool);
lra_dump_insns (lra_dump_file);
}
-/* Emit insns BEFORE before INSN and insns AFTER after INSN. Put the
- insns onto the stack. Print about emitting the insns with
- TITLE. */
+/* Emit insns BEFORE before INSN and insns AFTER after INSN. Put the insns
+ onto the stack. Print about emitting the insns with TITLE. Move insn
+ REG_ARGS_SIZE note to AFTER insns if FIXUP_REG_ARGS_SIZE. */
void
lra_process_new_insns (rtx_insn *insn, rtx_insn *before, rtx_insn *after,
- const char *title)
+ const char *title, bool fixup_reg_args_size)
{
if (before == NULL_RTX && after == NULL_RTX)
return;
emit_insn_after (after, insn);
push_insns (last, insn);
setup_sp_offset (after, last);
+ if (fixup_reg_args_size)
+ {
+ rtx note = find_reg_note (insn, REG_ARGS_SIZE, NULL_RTX);
+ if (note)
+ {
+ remove_note (insn, note);
+ fixup_args_size_notes (insn, last,
+ get_args_size (note));
+ if (lra_dump_file != NULL)
+ {
+ fprintf (lra_dump_file,
+ " fixing up REG_SIZE_NOTE for:\n");
+ dump_rtl_slim (lra_dump_file, insn, insn, -1, 0);
+ fprintf (lra_dump_file, " fixed insns after:\n");
+ dump_rtl_slim (lra_dump_file,
+ NEXT_INSN (insn), last, -1, 0);
+ }
+ }
+ }
}
else
{
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -g -fPIC" } */
+
+typedef void *decl_node;
+bool decl_isRecordField(decl_node);
+void decl_lookupSym(int);
+void mcDebug_assert(bool);
+typedef enum { decl_varient } decl_nodeT;
+typedef struct decl_nodeRec_r *decl_node__opaque;
+struct decl_nodeRec_r {
+ decl_nodeT kind;
+};
+decl_node__opaque tag, putVarientTag_tag, putVarientTag_v,
+ decl_buildVarientSelector_f;
+int decl_buildVarientSelector_tag;
+decl_node decl_buildVarientSelector_type;
+void decl_buildVarientSelector() {
+ mcDebug_assert(0);
+ if (decl_buildVarientSelector_type) {
+ decl_lookupSym(decl_buildVarientSelector_tag);
+ mcDebug_assert(0);
+ switch (putVarientTag_v->kind)
+ case decl_varient:
+ tag = putVarientTag_tag;
+ } else {
+ bool __trans_tmp_2 = decl_isRecordField(decl_buildVarientSelector_f);
+ mcDebug_assert(__trans_tmp_2);
+ mcDebug_assert(0);
+ switch (putVarientTag_v->kind)
+ case decl_varient:
+ tag = putVarientTag_tag;
+ }
+}