https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103270
--- Comment #3 from luoxhu at gcc dot gnu.org --- The profile count is correct but something wrong with edge probability, and it turns out that r12-4526 exposes a long-existing issue in profile_estimate:predict_extra_loop_exits, when searching extra exit edges for inner loop, it goes out and find a edge belongs to *outer loop*, setting that edge with predict value 33%, then predict_loops won't reset that edge for outer loop. I drafted a patch to ignore EDGE_DFS_BACK edges when iterating in predict_extra_loop_exits, then inner loop becomes hot again. diff base/pr103270.c.047t.profile_estimate patched/pr103270.c.047t.profile_estimate -U15 Predictions for bb 5 1 edges in bb 5 predicted to even probabilities Predictions for bb 6 - first match heuristics: 33.00% - combined heuristics: 33.00% + first match heuristics: 91.67% + combined heuristics: 91.67% opcode values nonequal (on trees) heuristics of edge 6->11 (ignored): 66.00% - extra loop exit heuristics of edge 6->11: 33.00% + loop iterations heuristics of edge 6->7: 8.33% Predictions for bb 11 1 edges in bb 11 predicted to even probabilities Predictions for bb 7 1 edges in bb 7 predicted to even probabilitie … - <bb 2> [local count: 88915474]: + <bb 2> [local count: 6029625]: goto <bb 8>; [100.00%] - <bb 3> [local count: 354334800]: + <bb 3> [local count: 536870913]: _1 = *i_19(D); _2 = a_4 & c_6; _3 = _1 + _2; *i_19(D) = _3; - <bb 4> [local count: 708669601]: + <bb 4> [local count: 1073741824]: # c_6 = PHI <c_7(11), b_5(3)> # d_8 = PHI <0(11), 1(3)> if (d_8 == 0) goto <bb 3>; [50.00%] else goto <bb 5>; [50.00%] - <bb 5> [local count: 354334800]: + <bb 5> [local count: 536870913]: # c_21 = PHI <c_6(4)> b_18 = b_5 + -1; - <bb 6> [local count: 1073741824]: + <bb 6> [local count: 585656064]: # b_5 = PHI <0(10), b_18(5)> # c_7 = PHI <0(10), c_21(5)> if (b_5 != -11) - goto <bb 11>; [33.00%] + goto <bb 11>; [91.67%] else - goto <bb 7>; [67.00%] + goto <bb 7>; [8.33%] - <bb 11> [local count: 354334800]: + <bb 11> [local count: 536870913]: goto <bb 4>; [100.00%] - <bb 7> [local count: 719407024]: + <bb 7> [local count: 48785151]: a_16 = a_4 + 1; - <bb 8> [local count: 808322498]: + <bb 8> [local count: 54814777]: # a_4 = PHI <a_12(D)(2), a_16(7)> if (a_4 <= 4) goto <bb 10>; [89.00%] else goto <bb 9>; [11.00%] - <bb 10> [local count: 719407024]: + <bb 10> [local count: 48785151]: goto <bb 6>; [100.00%] - <bb 9> [local count: 88915474]: + <bb 9> [local count: 6029625]: return;