]> gcc.gnu.org Git - gcc.git/commitdiff
tree-optimization/105679 - disable backward threading of unlikely entry
authorRichard Biener <rguenther@suse.de>
Fri, 29 Jul 2022 08:40:34 +0000 (10:40 +0200)
committerRichard Biener <rguenther@suse.de>
Fri, 29 Jul 2022 10:05:35 +0000 (12:05 +0200)
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.

gcc/tree-ssa-threadbackward.cc

index 3519aca84cd4ec412048b748f4b8bd33020026ab..90f5331c2657ce0b09a517226cc7b5e8a5bdfc84 100644 (file)
@@ -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)
     {
This page took 0.054907 seconds and 5 git commands to generate.