aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.cc
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2023-02-13 23:10:24 +0100
committerHans-Peter Nilsson <hp@bitrange.com>2023-04-30 00:19:01 +0200
commit7eefdc9c77892b679d183c1154ebb567251f0964 (patch)
tree6c90dc131bdba095af4041c5970e6142c33d38a5 /gcc/reload1.cc
parente2b204c31ba2b77dfe4a062b194129b7c97c81ad (diff)
downloadgcc-7eefdc9c77892b679d183c1154ebb567251f0964.zip
gcc-7eefdc9c77892b679d183c1154ebb567251f0964.tar.gz
gcc-7eefdc9c77892b679d183c1154ebb567251f0964.tar.bz2
reload: Handle generating reloads that also clobbers flags
* reload1.cc (emit_insn_if_valid_for_reload_1): Rename from emit_insn_if_valid_for_reload. (emit_insn_if_valid_for_reload): Call new helper, and if a SET fails to be recognized, also try emitting a parallel that clobbers TARGET_FLAGS_REGNUM, as applicable.
Diffstat (limited to 'gcc/reload1.cc')
-rw-r--r--gcc/reload1.cc29
1 files changed, 26 insertions, 3 deletions
diff --git a/gcc/reload1.cc b/gcc/reload1.cc
index 7dcef50..9ec2cb9 100644
--- a/gcc/reload1.cc
+++ b/gcc/reload1.cc
@@ -8377,11 +8377,11 @@ emit_reload_insns (class insn_chain *chain)
reg_reloaded_dead |= reg_reloaded_died;
}
-/* Go through the motions to emit INSN and test if it is strictly valid.
- Return the emitted insn if valid, else return NULL. */
+
+/* Helper for emit_insn_if_valid_for_reload. */
static rtx_insn *
-emit_insn_if_valid_for_reload (rtx pat)
+emit_insn_if_valid_for_reload_1 (rtx pat)
{
rtx_insn *last = get_last_insn ();
int code;
@@ -8403,6 +8403,29 @@ emit_insn_if_valid_for_reload (rtx pat)
return NULL;
}
+/* Go through the motions to emit INSN and test if it is strictly valid.
+ Return the emitted insn if valid, else return NULL. */
+
+static rtx_insn *
+emit_insn_if_valid_for_reload (rtx pat)
+{
+ rtx_insn *insn = emit_insn_if_valid_for_reload_1 (pat);
+
+ if (insn)
+ return insn;
+
+ /* If the pattern is a SET, and this target has a single
+ flags-register, try again with a PARALLEL that clobbers that
+ register. */
+ if (targetm.flags_regnum == INVALID_REGNUM || GET_CODE (pat) != SET)
+ return NULL;
+
+ rtx flags_clobber = gen_hard_reg_clobber (CCmode, targetm.flags_regnum);
+ rtx parpat = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, pat, flags_clobber));
+
+ return emit_insn_if_valid_for_reload (parpat);
+}
+
/* Emit code to perform a reload from IN (which may be a reload register) to
OUT (which may also be a reload register). IN or OUT is from operand
OPNUM with reload type TYPE.