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);
>> +}
>>
>

Reply via email to