]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
path solver: Solve PHI imports first for ranges.
authorAldy Hernandez <aldyh@redhat.com>
Fri, 12 Nov 2021 15:08:01 +0000 (16:08 +0100)
committerAldy Hernandez <aldyh@redhat.com>
Fri, 12 Nov 2021 19:42:56 +0000 (20:42 +0100)
PHIs must be resolved first while solving ranges in a block,
regardless of where they appear in the import bitmap.  We went through
a similar exercise for the relational code, but missed these.

Tested on x86-64 & ppc64le Linux.

gcc/ChangeLog:

PR tree-optimization/103202
* gimple-range-path.cc
(path_range_query::compute_ranges_in_block): Solve PHI imports first.

gcc/gimple-range-path.cc

index b9aceaf2565aaa844dd56de35b1a574153798c86..71b290434cb5aef8366687d3bb10a1d871682c7b 100644 (file)
@@ -365,12 +365,23 @@ path_range_query::compute_ranges_in_block (basic_block bb)
        clear_cache (name);
     }
 
-  // Solve imports defined in this block.
+  // Solve imports defined in this block, starting with the PHIs...
+  for (gphi_iterator iter = gsi_start_phis (bb); !gsi_end_p (iter);
+       gsi_next (&iter))
+    {
+      gphi *phi = iter.phi ();
+      tree name = gimple_phi_result (phi);
+
+      if (import_p (name) && range_defined_in_block (r, name, bb))
+       set_cache (r, name);
+    }
+  // ...and then the rest of the imports.
   EXECUTE_IF_SET_IN_BITMAP (m_imports, 0, i, bi)
     {
       tree name = ssa_name (i);
 
-      if (range_defined_in_block (r, name, bb))
+      if (gimple_code (SSA_NAME_DEF_STMT (name)) != GIMPLE_PHI
+         && range_defined_in_block (r, name, bb))
        set_cache (r, name);
     }