]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Hash operands of PHI in ipa-icf
authorJan Hubicka <jh@suse.cz>
Thu, 28 Mar 2024 12:24:54 +0000 (13:24 +0100)
committerJan Hubicka <jh@suse.cz>
Thu, 28 Mar 2024 12:24:54 +0000 (13:24 +0100)
This patch fixes cache colision on function whose body differs only by constants
at PHI operands.  As for

if (test)
  a = cst1;
else
  a = cst2;

gcc/ChangeLog:

PR middle-end/113907
* ipa-icf.cc (sem_function::init): Hash PHI operands
(sem_function::compare_phi_node): Add argument about preserving order

gcc/ipa-icf.cc

index 120d854498820368bf46f39410ced041d054bba5..e84922c3ef87cee61c370c78fd38d57ba18cb272 100644 (file)
@@ -1387,6 +1387,23 @@ sem_function::init (ipa_icf_gimple::func_checker *checker)
          cfg_checksum = iterative_hash_host_wide_int (e->flags,
                         cfg_checksum);
 
+       /* TODO: We should be able to match PHIs with different order of
+          parameters.  This needs to be also updated in
+          sem_function::compare_phi_node.  */
+       gphi_iterator si;
+       for (si = gsi_start_nonvirtual_phis (bb); !gsi_end_p (si);
+            gsi_next_nonvirtual_phi (&si))
+         {
+           hstate.add_int (GIMPLE_PHI);
+           gphi *phi = si.phi ();
+           m_checker->hash_operand (gimple_phi_result (phi), hstate, 0,
+                                    func_checker::OP_NORMAL);
+           hstate.add_int (gimple_phi_num_args (phi));
+           for (unsigned int i = 0; i < gimple_phi_num_args (phi); i++)
+             m_checker->hash_operand (gimple_phi_arg_def (phi, i),
+                                      hstate, 0, func_checker::OP_NORMAL);
+         }
+
        for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
             gsi_next (&gsi))
          {
@@ -1579,6 +1596,8 @@ sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
       if (size1 != size2)
        return return_false ();
 
+      /* TODO: We should be able to match PHIs with different order of
+        parameters.  This needs to be also updated in sem_function::init.  */
       for (i = 0; i < size1; ++i)
        {
          t1 = gimple_phi_arg (phi1, i)->def;