https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94042
--- Comment #19 from Martin Liška <marxin at gcc dot gnu.org> --- Ok, using the following patch: diff --git a/gcc/dbgcnt.def b/gcc/dbgcnt.def index 232b192..7e45e46 100644 --- a/gcc/dbgcnt.def +++ b/gcc/dbgcnt.def @@ -173,6 +173,7 @@ DEBUG_COUNTER (if_conversion_tree) DEBUG_COUNTER (ipa_sra_params) DEBUG_COUNTER (ipa_sra_retvalues) DEBUG_COUNTER (ira_move) +DEBUG_COUNTER (irahonor) DEBUG_COUNTER (ivopts_loop) DEBUG_COUNTER (local_alloc_for_sched) DEBUG_COUNTER (match) diff --git a/gcc/ira-color.c b/gcc/ira-color.c index a2bf108..908c717 100644 --- a/gcc/ira-color.c +++ b/gcc/ira-color.c @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see #include "ira-int.h" #include "reload.h" #include "cfgloop.h" +#include "dbgcnt.h" typedef struct allocno_hard_regs *allocno_hard_regs_t; @@ -1925,8 +1926,9 @@ assign_hard_reg (ira_allocno_t a, bool retry_p) } if (min_cost > cost) min_cost = cost; + bool honor = dbg_cnt(irahonor); if (min_full_cost > full_cost - || (!HONOR_REG_ALLOC_ORDER && min_full_cost == full_cost + || (honor && !HONOR_REG_ALLOC_ORDER && min_full_cost == full_cost && best_hard_regno > hard_regno)) { min_full_cost = full_cost; First bad: -fdbg-cnt=irahonor:788382 Last good: -fdbg-cnt=irahonor:788381 The change is only in function tsubst_template_arg: diff -u /tmp/good.s /tmp/bad.s -U99999 --- /tmp/good.s 2020-03-06 09:33:27.548791681 +0100 +++ /tmp/bad.s 2020-03-06 09:48:46.504419609 +0100 @@ -1,38 +1,37 @@ mr. r7,r3 beq 0x104c91x0 <._Z19tsubst_template_argP9tree_nodeS0_iS0_+> lhz r8,0(r7) addis r9,r2,-128 addi r9,r9,29456 rldicr r8,r8,2,61 lwzx r9,r9,r8 cmpwi r9,2 beq 0x104c91x0 <._Z19tsubst_template_argP9tree_nodeS0_iS0_+> andi. r9,r5,2 addis r9,r2,13 addi r9,r9,3152 -ld r8,0(r9) +stdu r1,-128(r1) +ld r0,0(r9) bne 0x104c9160 <._Z19tsubst_template_argP9tree_nodeS0_iS0_+160> -std r31,-8(r1) +std r31,120(r1) nop addi r31,r2,22820 -cmpld r7,r8 -stdu r1,-128(r1) +cmpld r7,r0 lwa r9,0(r31) addi r10,r9,1 stw r10,0(r31) beq 0x104c914x <._Z19tsubst_template_argP9tree_nodeS0_iS0_+> mflr r0 li r7,1 std r0,144(r1) bl 0x1049f300 <._Z11tsubst_exprP9tree_nodeS0_iS0_b.part.0> ld r0,144(r1) lwz r9,0(r31) -mr r8,r3 mtlr r0 addi r9,r9,-1 extsw r9,r9 -addi r1,r1,128 stw r9,0(r31) -mr r3,r8 -ld r31,-8(r1) +ld r31,120(r1) +mr r3,r0 +addi r1,r1,128 blr Optimized dump of the problematic function: tsubst_template_arg (union tree_node * t, union tree_node * args, tsubst_flags_t complain, union tree_node * in_decl) { union tree_node * r; short unsigned int _1; int _2; tree_code_class _3; union tree_node * pretmp_14; int _15; int c_inhibit_evaluation_warnings.2997_16; int _17; int pretmp_18; union tree_node * _19; union tree_node * _21; int prephitmp_27; int _30; union tree_node * _34; <bb 2> [local count: 1073741823]: if (t_6(D) == 0B) goto <bb 8>; [30.00%] else goto <bb 3>; [70.00%] <bb 3> [local count: 751619280]: _1 = t_6(D)->base.code; _2 = (int) _1; _3 = tree_code_type[_2]; if (_3 == 2) goto <bb 4>; [20.24%] else goto <bb 5>; [79.76%] <bb 4> [local count: 152127741]: r_12 = tsubst (t_6(D), args_9(D), complain_8(D), in_decl_10(D)); [tail call] goto <bb 8>; [100.00%] <bb 5> [local count: 599491539]: _15 = complain_8(D) & 2; pretmp_14 = global_trees[0]; if (_15 == 0) goto <bb 6>; [50.00%] else goto <bb 9>; [50.00%] <bb 6> [local count: 299745769]: c_inhibit_evaluation_warnings.2997_16 = c_inhibit_evaluation_warnings; _17 = c_inhibit_evaluation_warnings.2997_16 + 1; c_inhibit_evaluation_warnings = _17; if (t_6(D) == pretmp_14) goto <bb 7>; [30.95%] else goto <bb 10>; [69.05%] <bb 7> [local count: 299745769]: # _21 = PHI <_34(10), pretmp_14(6)> # prephitmp_27 = PHI <_30(10), c_inhibit_evaluation_warnings.2997_16(6)> c_inhibit_evaluation_warnings = prephitmp_27; <bb 8> [local count: 1073741824]: # r_5 = PHI <t_6(D)(2), r_12(4), _21(7), _19(11), pretmp_14(9)> return r_5; <bb 9> [local count: 299745770]: if (t_6(D) == pretmp_14) goto <bb 8>; [30.95%] else goto <bb 11>; [69.05%] <bb 10> [local count: 206974454]: _34 = _Z11tsubst_exprP9tree_nodeS0_iS0_b.part.0 (t_6(D), args_9(D), complain_8(D), in_decl_10(D), 1); pretmp_18 = c_inhibit_evaluation_warnings; _30 = pretmp_18 + -1; goto <bb 7>; [100.00%] <bb 11> [local count: 206974454]: _19 = _Z11tsubst_exprP9tree_nodeS0_iS0_b.part.0 (t_6(D), args_9(D), complain_8(D), in_decl_10(D), 1); [tail call] goto <bb 8>; [100.00%] }