The Arm port has never had the compare elimination pass enabled by
adding a definition of TARGET_FLAGS_REGNUM. But just adding this is
insufficient because the target uses COND_EXEC and compare-elim is not
yet set up to handle this.
This seems to be quite simple, since we just need to recognize
COND_EXEC in insns when scanning for uses of the condition code
register.
This is a partial mitigation for the code quality regression
reported in PR target/123604.
gcc/ChangeLog:
PR target/123604
* compare-elim.cc (find_flags_uses_in_insn): Handle COND_EXEC.
* config/arm/arm.cc (TARGET_FLAGS_REGNUM): Define.
---
At present it seems that no port has both TARGET_FLAGS_REGNUM and a
define_cond_exec pattern, so I think this patch ought to be pretty
safe even for stage 4 since it can affect no targets other than Arm.
gcc/compare-elim.cc | 2 ++
gcc/config/arm/arm.cc | 3 +++
2 files changed, 5 insertions(+)
diff --git a/gcc/compare-elim.cc b/gcc/compare-elim.cc
index 006d4e35efc..723f9e31c79 100644
--- a/gcc/compare-elim.cc
+++ b/gcc/compare-elim.cc
@@ -258,6 +258,8 @@ find_flags_uses_in_insn (struct comparison *cmp, rtx_insn
*insn)
x = SET_SRC (x);
if (GET_CODE (x) == IF_THEN_ELSE)
x = XEXP (x, 0);
+ if (GET_CODE (x) == COND_EXEC)
+ x = COND_EXEC_TEST (x);
if (COMPARISON_P (x)
&& loc == &XEXP (x, 0)
&& XEXP (x, 1) == const0_rtx)
diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
index 0a1f6612d07..ff3400ae035 100644
--- a/gcc/config/arm/arm.cc
+++ b/gcc/config/arm/arm.cc
@@ -839,6 +839,9 @@ static const scoped_attribute_specs *const
arm_attribute_table[] =
#undef TARGET_VECTORIZE_GET_MASK_MODE
#define TARGET_VECTORIZE_GET_MASK_MODE arm_get_mask_mode
+
+#undef TARGET_FLAGS_REGNUM
+#define TARGET_FLAGS_REGNUM CC_REGNUM
/* Obstack for minipool constant handling. */
static struct obstack minipool_obstack;
--
2.43.0