https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121385

--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Both can match:
(jump_insn 297 296 298 35 (set (pc)
        (if_then_else (lt (reg:DI 170 [ _94 ])
                (const_int 0 [0]))
            (label_ref 303)
            (pc))) "../../../comb/libgcc/libgcc2.c":366:12 discrim 1 29
{aarch64_cbltdi}
     (expr_list:REG_DEAD (reg:DI 170 [ _94 ])
        (int_list:REG_BR_PROB 4 (nil)))
 -> 303)

But aarch64_tbzltdi1 has a clobber against CC.

So if we are seeing how many clobbers needs to be added we match against
aarch64_tbzltdi1 but since there was no clobbers on the aarch64_cbltdi pattern,
it is rejected.

One way of fixing this is move the aarch64_cbltdi patterns in front of
aarch64_tbzltdi1 .

Or easier disable aarch64_tbzltdi1 if TARGET_CMPBR like:
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index a4ae6859da0..7c87b091f6b 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -839,7 +839,7 @@ (define_insn "*aarch64_tbz<optab><mode>1"
                           (label_ref (match_operand 1))
                           (pc)))
    (clobber (reg:CC CC_REGNUM))]
-  "!aarch64_track_speculation"
+  "!aarch64_track_speculation && !TARGET_CMPBR"
   {
     if (get_attr_length (insn) == 8)
       {

Reply via email to