Hi,
As Jakub reminded me, I introduced OEP_MATCH_SIDE_EFFECTS for cases like
ICF or tail merging where we merge accesses from different code paths.
By default operand_equal_p is designed for accesses from one code path
where we do not want to merge two side effects.

Since compare_ao_refs is currently used only in ICF, we should use it.
If in future it is used in other contextes, perhaps we need a parameter
controlling it, but for now I think adding OEP_MATCH_SIDE_EFFECTS is
good way to go.

This enables merging of volatile accesses in Firefox (we check that the
other access is also volatile).

With this on libxul build we get:

    571 libxul.so.wpa.076i.icf:  false returned: 'compare_ao_refs failed 
(dependence clique difference)' in compare_operand at 
../../gcc/ipa-icf-gimple.c:373
    676 libxul.so.wpa.076i.icf:  false returned: 'compare_ao_refs failed 
(semantic difference)' in compare_operand at ../../gcc/ipa-icf-gimple.c:361
    676 libxul.so.wpa.076i.icf:  false returned: 'METHOD_TYPE and FUNCTION_TYPE 
mismatch' in equals_wpa at ../../gcc/ipa-icf.c:674
    707 libxul.so.wpa.076i.icf:  false returned: 'operand_equal_p failed' in 
compare_operand at ../../gcc/ipa-icf-gimple.c:381

Which is very low.  I will still analyze the remaining 707
operand_equal_p failures.  Some of them are deffects how we match
parameters:
_9 = Schedule (this_3(D), aManifestURI_4(D), aDocumentURI_5(D), 
aLoadingPrincipal_6(D), 0B, aWindow_2(D), 0B, aUpdate_7(D));
_9 = Schedule (this_2(D), aManifestURI_3(D), aDocumentURI_4(D), 
aLoadingPrincipal_5(D), 0B, 0B, aProfileDir_6(D), aUpdate_7(D));

Since we do not hash anyting ofr SSA_NAME see it as Schedule (0,0) in
bot cases.  I am testing fix.

Bootstrapped/regtested x86_64-linux, OK?

Honza

        * tree-ssa-alias.c (ao_compare::compare_ao_refs,
        ao_compare::hash_ao_ref): Use OEP_MATCH_SIDE_EFFECTS.
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 5ebbb087285..311ce66892b 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -3985,11 +3985,12 @@ ao_compare::compare_ao_refs (ao_ref *ref1, ao_ref *ref2,
        return SEMANTICS;
 
       /* Now we can compare the address of actual memory access.  */
-      if (!operand_equal_p (r1, r2, OEP_ADDRESS_OF))
+      if (!operand_equal_p (r1, r2, OEP_ADDRESS_OF | OEP_MATCH_SIDE_EFFECTS))
        return SEMANTICS;
     }
   /* For constant accesses we get more matches by comparing offset only.  */
-  else if (!operand_equal_p (base1, base2, OEP_ADDRESS_OF))
+  else if (!operand_equal_p (base1, base2,
+                            OEP_ADDRESS_OF | OEP_MATCH_SIDE_EFFECTS))
     return SEMANTICS;
 
   /* We can't simply use get_object_alignment_1 on the full
@@ -4197,11 +4198,11 @@ ao_compare::hash_ao_ref (ao_ref *ref, bool 
lto_streaming_safe, bool tbaa,
          r = TREE_OPERAND (r, 0);
        }
       hash_operand (TYPE_SIZE (TREE_TYPE (ref->ref)), hstate, 0);
-      hash_operand (r, hstate, OEP_ADDRESS_OF);
+      hash_operand (r, hstate, OEP_ADDRESS_OF | OEP_MATCH_SIDE_EFFECTS);
     }
   else
     {
-      hash_operand (tbase, hstate, OEP_ADDRESS_OF);
+      hash_operand (tbase, hstate, OEP_ADDRESS_OF | OEP_MATCH_SIDE_EFFECTS);
       hstate.add_poly_int (ref->offset);
       hstate.add_poly_int (ref->size);
       hstate.add_poly_int (ref->max_size);

Reply via email to