]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
compare-elim: arm: enable compare-elimination on Arm [PR123604]
authorRichard Earnshaw <rearnsha@arm.com>
Wed, 4 Feb 2026 14:14:37 +0000 (14:14 +0000)
committerRichard Earnshaw <rearnsha@arm.com>
Thu, 5 Feb 2026 12:49:27 +0000 (12:49 +0000)
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.

gcc/compare-elim.cc
gcc/config/arm/arm.cc

index 006d4e35efcdad547c8dd87f5b3da016d9bf9fed..723f9e31c79146c269810efbb5353d6db5c59c22 100644 (file)
@@ -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)
index 0a1f6612d07fd2230be11cb0ffbf0a892a3f244a..ff3400ae0353520f9ec0f7c6e11de02cc1d963f1 100644 (file)
@@ -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
 \f
 /* Obstack for minipool constant handling.  */
 static struct obstack minipool_obstack;