> > +/* Verifies for given GIMPLEs S1 and S2 that
> > +   goto statements are semantically equivalent.  */
> > +
> > +bool
> > +func_checker::compare_gimple_goto (gimple g1, gimple g2)
> > +{
> > +  tree dest1, dest2;
> > +
> > +  dest1 = gimple_goto_dest (g1);
> > +  dest2 = gimple_goto_dest (g2);
> > +
> > +  if (TREE_CODE (dest1) != TREE_CODE (dest2) || TREE_CODE (dest1) != 
> > SSA_NAME)
> > +    return false;
> > +
> > +  return compare_operand (dest1, dest2);
> > 
> > You probably need to care only about indirect gotos, the direct ones are 
> > checked by
> > CFG compare.  So is the condtional jump.
> 
> It looks that this code is visited quite rare.

Hmm, perhaps it is called only for indirect calls, because all others are not 
represented as statements.
> 
> > +
> > +/* Verifies for given GIMPLEs S1 and S2 that ASM statements are equivalent.
> > +   For the beginning, the pass only supports equality for
> > +   '__asm__ __volatile__ ("", "", "", "memory")'.  */
> > +
> > +bool
> > +func_checker::compare_gimple_asm (gimple g1, gimple g2)
> > +{
> > +  if (gimple_asm_volatile_p (g1) != gimple_asm_volatile_p (g2))
> > +    return false;
> > +
> > +  if (gimple_asm_ninputs (g1) || gimple_asm_ninputs (g2))
> > +    return false;
> > +
> > +  if (gimple_asm_noutputs (g1) || gimple_asm_noutputs (g2))
> > +    return false;
> > +
> > +  if (gimple_asm_nlabels (g1) || gimple_asm_nlabels (g2))
> > +    return false;
> > +
> > +  if (gimple_asm_nclobbers (g1) != gimple_asm_nclobbers (g2))
> > +    return false;
> > +
> > +  for (unsigned i = 0; i < gimple_asm_nclobbers (g1); i++)
> > +    {
> > +      tree clobber1 = TREE_VALUE (gimple_asm_clobber_op (g1, i));
> > +      tree clobber2 = TREE_VALUE (gimple_asm_clobber_op (g2, i));
> > +
> > +      if (!operand_equal_p (clobber1, clobber2, OEP_ONLY_CONST))
> > +   return false;
> > +    }
> > +
> > 
> > Even asm statements with no inputs or outputs can differ by the actual
> > asm statement. Compare it too.
> > 
> > Comparing inputs/outputs/labels should be very easy to do.
> > 
> > Compare all gimple_asm_n* for equivalency.
> 
> This makes fully sense, but I don't understand what kind of operands do you 
> mean?

You can look some other code dealing with gimple asm statements.  You can just 
compare
gimple_op for 0.... gimple_num_ops and be ready to deal with TREE_LIST as 
described
bellow. 

Honza
> 
> > At the end walk operands and watch the case they are TREE_LIST.
> > THen compare TREE_VALUE (op) of the list for operand_equal_p
> > and TREE_VALUE (TREE_PURPOSE (op)) for equivalency
> > (those are the constraints)
> > 
> > If they are not (clobbers are not, those are just strings), operand_equal_p
> > should do.
> > 
> > +  return true;
> > +}
> > +
> > +} // ipa_icf namespace
> > 
> > Otherwise I think ipa-gimple-icf is quite fine now.
> > Please send updated version and I think it can go to mainline before the 
> > actual ipa-icf.
> 
> I renamed both files and put them to a newly created namespace ipa_icf_gimple.
> 
> Thank you,
> Martin

Reply via email to