]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
aarch64: Reorg aarch64_if_the_else_costs, conditional branch
authorRichard Henderson <richard.henderson@linaro.org>
Tue, 5 Aug 2025 20:58:36 +0000 (20:58 +0000)
committerRichard Henderson <richard.henderson@linaro.org>
Mon, 11 Aug 2025 23:25:08 +0000 (23:25 +0000)
gcc:
* config/aarch64/aarch64.cc (aarch64_if_the_else_costs): Reorg to
include the cost of inner within TBZ sign-bit test, only match
CBZ/CBNZ with valid modes, and both for the aarch64_imm24 test.

gcc/config/aarch64/aarch64.cc

index 50b300416e771d7e9635703b6fc124b2e4eec62d..123aa1090bb63b40989e015287169a1098d59f30 100644 (file)
@@ -14380,39 +14380,48 @@ aarch64_if_then_else_costs (rtx op0, rtx op1, rtx op2, int *cost, bool speed)
   if (GET_CODE (op1) == PC || GET_CODE (op2) == PC)
     {
       /* Conditional branch.  */
-      if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_CC)
+      enum machine_mode cmpmode = GET_MODE (inner);
+      if (GET_MODE_CLASS (cmpmode) == MODE_CC)
        return true;
 
-      if (cmpcode == NE || cmpcode == EQ)
+      if (comparator == const0_rtx)
        {
-         if (comparator == const0_rtx)
+         switch (cmpcode)
            {
-             /* TBZ/TBNZ/CBZ/CBNZ.  */
+           case NE:
+           case EQ:
+             if (cmpmode != SImode && cmpmode != DImode)
+               break;
              if (GET_CODE (inner) == ZERO_EXTRACT)
-               /* TBZ/TBNZ.  */
-               *cost += rtx_cost (XEXP (inner, 0), VOIDmode,
-                                  ZERO_EXTRACT, 0, speed);
-             else
-               /* CBZ/CBNZ.  */
-               *cost += rtx_cost (inner, VOIDmode, cmpcode, 0, speed);
+               {
+                 /* TBZ/TBNZ.  */
+                 *cost += rtx_cost (XEXP (inner, 0), VOIDmode,
+                                    ZERO_EXTRACT, 0, speed);
+                 return true;
+               }
+             /* FALLTHRU */
 
+           case LT:
+           case GE:
+             /* CBZ/CBNZ/TBZ/TBNZ.  */
+             *cost += rtx_cost (inner, cmpmode, cmpcode, 0, speed);
              return true;
-           }
-         if (register_operand (inner, VOIDmode)
-             && aarch64_imm24 (comparator, VOIDmode))
-           {
-             /* SUB and SUBS.  */
-             *cost += COSTS_N_INSNS (2);
-             if (speed)
-               *cost += extra_cost->alu.arith * 2;
-             return true;
+
+           default:
+             break;
            }
        }
-      else if (cmpcode == LT || cmpcode == GE)
+
+      if ((cmpcode == NE || cmpcode == EQ)
+         && (cmpmode == SImode || cmpmode == DImode)
+         && aarch64_imm24 (comparator, cmpmode))
        {
-         /* TBZ/TBNZ.  */
-         if (comparator == const0_rtx)
-           return true;
+         /* SUB and SUBS.  */
+         *cost += rtx_cost (inner, cmpmode, cmpcode, 0, speed);
+         *cost += COSTS_N_INSNS (2);
+         if (speed)
+           *cost += extra_cost->alu.arith * 2;
+         return true;
        }
     }
   else if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_CC)