Hello!
v2 patch differences:
- moves hook description text to target.def
- fixes error path to clear clobbers, as expected by recog_for_combine callers
2012-08-25 Uros Bizjak <[email protected]>
* target.def (reject_combined_insn): New target hook.
* doc/tm.texi.in (TARGET_REJECT_COMBINED_INSN): New hook.
* doc/tm.texi: Regenerated.
* combine.c (recog_for_combine): Call targetm.reject_combined_insn
to allow targets to reject combined insn.
Bootstrapped and regression tested on x86_64-pc-linux-gnu {,-m32}.
OK for mainline?
Uros.
Index: target.def
===================================================================
--- target.def (revision 190665)
+++ target.def (working copy)
@@ -1984,7 +1984,16 @@ DEFHOOK
const char *, (const_rtx insn),
default_invalid_within_doloop)
+/* Returns true if the combined insn should be rejected
+ for some reason. */
DEFHOOK
+(reject_combined_insn,
+"Take an instruction in @var{insn} and return @code{true} if the instruction\
+ should be rejected as a combination of two or more instructions.",
+ bool, (rtx insn),
+ hook_bool_rtx_false)
+
+DEFHOOK
(valid_dllimport_attribute_p,
"@var{decl} is a variable or function with @code{__attribute__((dllimport))}\
specified. Use this hook if the target needs to add extra validation\
Index: combine.c
===================================================================
--- combine.c (revision 190665)
+++ combine.c (working copy)
@@ -10500,11 +10500,13 @@ static int
recog_for_combine (rtx *pnewpat, rtx insn, rtx *pnotes)
{
rtx pat = *pnewpat;
+ rtx pat_without_clobbers;
int insn_code_number;
int num_clobbers_to_add = 0;
int i;
- rtx notes = 0;
+ rtx notes = NULL_RTX;
rtx old_notes, old_pat;
+ int old_icode;
/* If PAT is a PARALLEL, check to see if it contains the CLOBBER
we use to indicate that something didn't match. If we find such a
@@ -10518,7 +10520,7 @@ recog_for_combine (rtx *pnewpat, rtx insn, rtx *pn
old_pat = PATTERN (insn);
old_notes = REG_NOTES (insn);
PATTERN (insn) = pat;
- REG_NOTES (insn) = 0;
+ REG_NOTES (insn) = NULL_RTX;
insn_code_number = recog (pat, insn, &num_clobbers_to_add);
if (dump_file && (dump_flags & TDF_DETAILS))
@@ -10564,6 +10566,9 @@ recog_for_combine (rtx *pnewpat, rtx insn, rtx *pn
print_rtl_single (dump_file, pat);
}
}
+
+ pat_without_clobbers = pat;
+
PATTERN (insn) = old_pat;
REG_NOTES (insn) = old_notes;
@@ -10605,6 +10610,35 @@ recog_for_combine (rtx *pnewpat, rtx insn, rtx *pn
pat = newpat;
}
+ if (insn_code_number >= 0
+ && insn_code_number != NOOP_MOVE_INSN_CODE)
+ {
+ old_pat = PATTERN (insn);
+ old_notes = REG_NOTES (insn);
+ old_icode = INSN_CODE (insn);
+ PATTERN (insn) = pat;
+ REG_NOTES (insn) = notes;
+
+ /* Allow targets to reject combined insn. */
+ if (targetm.reject_combined_insn (insn))
+ {
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fputs ("Instruction not appropriate for target.",
+ dump_file);
+
+ /* Callers expect recog_for_combine to strip
+ clobbers from the pattern on failure. */
+ pat = pat_without_clobbers;
+ notes = NULL_RTX;
+
+ insn_code_number = -1;
+ }
+
+ PATTERN (insn) = old_pat;
+ REG_NOTES (insn) = old_notes;
+ INSN_CODE (insn) = old_icode;
+ }
+
*pnewpat = pat;
*pnotes = notes;
Index: doc/tm.texi
===================================================================
--- doc/tm.texi (revision 190665)
+++ doc/tm.texi (working copy)
@@ -10938,6 +10938,10 @@ By default, the RTL loop optimizer does not use a
loops containing function calls or branch on table instructions.
@end deftypefn
+@deftypefn {Target Hook} bool TARGET_REJECT_COMBINED_INSN (rtx @var{insn})
+Take an instruction in @var{insn} and return @code{true} if the instruction
should be rejected as a combination of two or more instructions.
+@end deftypefn
+
@defmac MD_CAN_REDIRECT_BRANCH (@var{branch1}, @var{branch2})
Take a branch insn in @var{branch1} and another in @var{branch2}.
Index: doc/tm.texi.in
===================================================================
--- doc/tm.texi.in (revision 190665)
+++ doc/tm.texi.in (working copy)
@@ -10796,6 +10796,8 @@ By default, the RTL loop optimizer does not use a
loops containing function calls or branch on table instructions.
@end deftypefn
+@hook TARGET_REJECT_COMBINED_INSN
+
@defmac MD_CAN_REDIRECT_BRANCH (@var{branch1}, @var{branch2})
Take a branch insn in @var{branch1} and another in @var{branch2}.