> > +/* 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