https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61757
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |law at gcc dot gnu.org --- Comment #26 from Richard Biener <rguenth at gcc dot gnu.org> --- DOM first rotates the loop by threading the entry over the first part of the conditional, producing if (i + 1 < n && q == a[i + 1].p) { ++i; do { if (q != a[i].p) break; ++i; if (i >= n) break; } while (1); the 2nd DOM pass then tries to complete the rotate but manages to record two threadings that are incompatible: Threaded jump 6 --> 12 to 13 Jump threading proved probability of edge 12->4 too small (it is 5114, should be 10000). Threaded jump 7 --> 12 to 14 the 2nd one over the loop entry would be ok, completing the rotate. But the first one is odd - and I can't see why we register it: Optimizing block #6 1>>> COND 1 = n_4(D) ge_expr i_12 1>>> COND 1 = n_4(D) ne_expr i_12 1>>> COND 1 = n_4(D) gt_expr i_12 1>>> COND 0 = n_4(D) le_expr i_12 Optimizing statement pretmp_11 = a[i_12].p; LKUP STMT pretmp_11 = a[i_12].p pretmp_11 = a[i_12].p; 2>>> STMT pretmp_11 = a[i_12].p pretmp_11 = a[i_12].p; Registering jump thread: (6, 12) incoming edge; (12, 4) normal; <<<< STMT pretmp_11 = a[i_12].p pretmp_11 = a[i_12].p; <<<< COND 0 = n_4(D) le_expr i_12 <<<< COND 1 = n_4(D) gt_expr i_12 <<<< COND 1 = n_4(D) ne_expr i_12 <<<< COND 1 = n_4(D) ge_expr i_12 bb6 is just <bb 6>: pretmp_11 = a[i_12].p; and its single predecessor <bb 4>: i_12 = i_9 + 1; if (n_4(D) > i_12) goto <bb 6>; else goto <bb 5>; with the record_equality change we now record q_8(D) == prephitmp_16 instead of the other way around: Optimizing block #4 0>>> COPY q_8(D) = prephitmp_16 1>>> COND 1 = q_8(D) le_expr prephitmp_16 1>>> COND 1 = q_8(D) ge_expr prephitmp_16 1>>> COND 1 = q_8(D) eq_expr prephitmp_16 1>>> COND 0 = q_8(D) ne_expr prephitmp_16 but when threading over the backedge this doesn't get invalidated. So this canonicalization happens to be a correctness issue (by accident? Jeff?)