tree-optimization/105679 - disable backward threading of unlikely entry
The following makes the backward threader reject threads whose entry edge is probably never executed according to the profile. That in particular, for the testcase, avoids threading the irq == 1 check on the path where irq > 31, thereby avoiding spurious -Warray-bounds diagnostics if (irq_1(D) > 31) goto <bb 3>; [0.00%] else goto <bb 4>; [100.00%] ;; basic block 3, loop depth 0, count 0 (precise), probably never executed _2 = (unsigned long) irq_1(D); __builtin___ubsan_handle_shift_out_of_bounds (&*.Lubsan_data0, 1, _2); _3 = 1 << irq_1(D); mask_4 = (u32) _3; entry = instance_5(D)->array[irq_1(D)]; capture (mask_4); if (level_6(D) != 0) goto <bb 7>; [34.00%] else goto <bb 5>; [66.00%] ;; basic block 5, loop depth 0, count 708669600 (estimated locally), maybe hot if (irq_1(D) == 1) goto <bb 7>; [20.97%] else goto <bb 6>; [79.03%] PR tree-optimization/105679 * tree-ssa-threadbackward.cc (back_threader_profitability::profitable_path_p): Avoid threading when the entry edge is probably never executed.
This commit is contained in:
parent
b5f5d1b36e
commit
49ba4fdeb6
1 changed files with 9 additions and 0 deletions
|
@ -777,6 +777,15 @@ back_threader_profitability::profitable_path_p (const vec<basic_block> &m_path,
|
|||
"exceeds PARAM_MAX_FSM_THREAD_PATH_INSNS.\n");
|
||||
return false;
|
||||
}
|
||||
edge entry = find_edge (m_path[m_path.length () - 1],
|
||||
m_path[m_path.length () - 2]);
|
||||
if (probably_never_executed_edge_p (cfun, entry))
|
||||
{
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
fprintf (dump_file, " FAIL: Jump-thread path not considered: "
|
||||
"path entry is probably never executed.\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (!m_speed_p && n_insns > 1)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue