2014-10-29 17:01 GMT+03:00 Martin Liška <mli...@suse.cz>: > On 10/29/2014 02:45 PM, Ilya Enkovich wrote: >> >> On 29 Oct 10:34, Richard Biener wrote: >>> >>> On Tue, Oct 28, 2014 at 5:14 PM, Ilya Enkovich <enkovich....@gmail.com> >>> wrote: >>>> >>>> Hi, >>>> >>>> This patch fixes PR63664 and PR63574. Problem is in NULL types for >>>> labels not handled by ICF properly. I assume it is OK for labels to have >>>> NULL type and added check into ICF rather then fixed label generation. >>>> >>>> Bootstrapped and checked on linux-x86_64. OK for trunk? >>> >>> >>> Instead it shouldn't be called for labels instead. >>> >>> Richard. >>> >> >> Here is a version which doesn't compare types for labels. Is is OK? > > > Hello. > > I've been just testing a patch, where the pass does not call compare_operand > for gimple labels. > As the pass creates mapping between labels and basic blocks, such comparison > will not be necessary.
OK. That would be better. Thanks, Ilya > > Thanks, > Martin > > >> >> Bootstrapped and checked on linux-x86_64. >> >> Thanks, >> Ilya >> -- >> gcc/ >> >> 2014-10-29 Ilya Enkovich <ilya.enkov...@intel.com> >> >> PR ipa/63664 >> PR bootstrap/63574 >> * ipa-icf-gimple.c (func_checker::compatible_types_p): Assert for >> null >> args. >> (func_checker::compare_operand): Don't compare types for labels. >> >> gcc/testsuite/ >> >> 2014-10-29 Ilya Enkovich <ilya.enkov...@intel.com> >> >> PR ipa/63664 >> * gcc.dg/ipa/pr63664.C: New. >> >> >> diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c >> index 1369b74..094e8ab 100644 >> --- a/gcc/ipa-icf-gimple.c >> +++ b/gcc/ipa-icf-gimple.c >> @@ -169,6 +169,9 @@ bool func_checker::compatible_types_p (tree t1, tree >> t2, >> bool compare_polymorphic, >> bool first_argument) >> { >> + gcc_assert (t1); >> + gcc_assert (t2); >> + >> if (TREE_CODE (t1) != TREE_CODE (t2)) >> return return_false_with_msg ("different tree types"); >> >> @@ -214,11 +217,15 @@ func_checker::compare_operand (tree t1, tree t2) >> else if (!t1 || !t2) >> return false; >> >> - tree tt1 = TREE_TYPE (t1); >> - tree tt2 = TREE_TYPE (t2); >> + if (TREE_CODE (t1) != LABEL_DECL >> + && TREE_CODE (t2) != LABEL_DECL) >> + { >> + tree tt1 = TREE_TYPE (t1); >> + tree tt2 = TREE_TYPE (t2); >> >> - if (!func_checker::compatible_types_p (tt1, tt2)) >> - return false; >> + if (!func_checker::compatible_types_p (tt1, tt2)) >> + return false; >> + } >> >> base1 = get_addr_base_and_unit_offset (t1, &offset1); >> base2 = get_addr_base_and_unit_offset (t2, &offset2); >> diff --git a/gcc/testsuite/gcc.dg/ipa/pr63664.C >> b/gcc/testsuite/gcc.dg/ipa/pr63664.C >> new file mode 100644 >> index 0000000..31d96d4 >> --- /dev/null >> +++ b/gcc/testsuite/gcc.dg/ipa/pr63664.C >> @@ -0,0 +1,43 @@ >> +/* { dg-do compile } */ >> +/* { dg-options "-O2" } */ >> + >> +class test { >> + public: >> + test (int val, int *p) >> + { >> + int_val = *p; >> + bool_val = (val != int_val); >> + } >> + >> + ~test () >> + { >> + if (!bool_val) >> + return; >> + } >> + >> + int get_int_val () const { return int_val; } >> + >> + private: >> + bool bool_val; >> + int int_val; >> +}; >> + >> +static int __attribute__ ((noinline)) >> +f1 (int i, int *p) >> +{ >> + test obj (i, p); >> + return obj.get_int_val (); >> +} >> + >> +static int __attribute__ ((noinline)) >> +f2 (int i, int *p) >> +{ >> + test obj (i, p); >> + return obj.get_int_val (); >> +} >> + >> +int >> +f (int i, int *p) >> +{ >> + return f1 (i, p) + f2 (i, p); >> +} >> >