This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH/IPA] Fix ipa-polymorphic-call when size of Pmode is not the size of pointers in user code


On Wed, Nov 19, 2014 at 5:55 PM, Andrew Pinski <pinskia@gmail.com> wrote:
> On Wed, Nov 19, 2014 at 5:53 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Wed, Nov 19, 2014 at 5:39 PM, Andrew Pinski <pinskia@gmail.com> wrote:
>>> On Wed, Nov 19, 2014 at 5:37 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>>> On Wed, Nov 19, 2014 at 5:36 PM, Andrew Pinski <pinskia@gmail.com> wrote:
>>>>> On Wed, Nov 19, 2014 at 5:35 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>>>>> On Wed, Nov 19, 2014 at 5:23 PM, Andrew Pinski <pinskia@gmail.com> wrote:
>>>>>>> On Wed, Nov 19, 2014 at 5:11 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>>>>>>> On Wed, Nov 19, 2014 at 4:54 PM, Andrew Pinski <pinskia@gmail.com> wrote:
>>>>>>>>> Hi,
>>>>>>>>>   For ILP32 on AARCH64, we have ptr_mode != Pmode (we have ptr_mode
>>>>>>>>> being SImode while Pmode is DImode and POINTER_SIZE is 32).  This
>>>>>>>>> breaks ipa-polymorphic-call assumption that Pmode is the correct mode
>>>>>>>>> for pointers.  Right now before this patch we get many testcase
>>>>>>>>> failures in the C++ testsuite due to this.  Some of the tests fail due
>>>>>>>>> to the wrong devirtualization happening (using the base class rather
>>>>>>>>> the current class).
>>>>>>>>>
>>>>>>>>> This patch fixes the issue by using POINTER_SIZE in place of
>>>>>>>>> GET_MODE_BITSIZE (Pmode) all over the file.
>>>>>>>>>
>>>>>>>>> OK?  Bootstrapped and tested on x86_64 and cross built and tested for
>>>>>>>>> aarch64-elf with no regressions.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Andrew Pinski
>>>>>>>>>
>>>>>>>>> ChangeLog:
>>>>>>>>> ipa/63981
>>>>>>>>> * ipa-polymorphic-call.c (possible_placement_new):
>>>>>>>>> Use POINTER_SIZE instead of GET_MODE_BITSIZE (Pmode).
>>>>>>>>> (ipa_polymorphic_call_context::restrict_to_inner_class): Likewise.
>>>>>>>>> (extr_type_from_vtbl_ptr_store): Likewise.
>>>>>>>>
>>>>>>>> Does Pmode affect class layout?
>>>>>>>
>>>>>>> No only POINTER_SIZE.  ILP32 is one of the few ABIs where Pmode !=
>>>>>>> ptr_mode (sizeof(ptr_mode) == POINTER_SIZE always).
>>>>>>>
>>>>>>> x32 has a similar issue with -maddress-mode=long but the default for
>>>>>>> x32 is -maddress-mode=short.
>>>>>>
>>>>>> Pmode shouldn't change class layout, which is determined by ptr_mode.
>>>>>> You can mix  object files compiled by -maddress-mode=long with
>>>>>> -maddress-mode=short.  Do those tests fail with -maddress-mode=long
>>>>>> under x32?
>>>>>
>>>>>
>>>>> I suspect they do fail with -maddress-mode=long but I did not try as I
>>>>> don't have x32 testing setup right now.
>>>>>
>>>>
>>>> Which one may fail with -maddress-mode=long?
>>>
>>> The full list of the failures can be found in
>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63982 and
>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63981 and below:
>>>
>>> FAIL: g++.dg/ipa/devirt-10.C  -std=gnu++98  scan-ipa-dump-times cp
>>> "Discovered a virtual call to a known target" 2
>>> FAIL: g++.dg/ipa/devirt-10.C  -std=gnu++11  scan-ipa-dump-times cp
>>> "Discovered a virtual call to a known target" 2
>>> FAIL: g++.dg/ipa/devirt-10.C  -std=gnu++14  scan-ipa-dump-times cp
>>> "Discovered a virtual call to a known target" 2
>>> FAIL: g++.dg/ipa/devirt-34.C  -std=gnu++98  scan-ipa-dump devirt
>>> "Speculative targets"
>>> FAIL: g++.dg/ipa/devirt-34.C  -std=gnu++98  scan-ipa-dump devirt "1
>>> speculatively devirtualized"
>>> FAIL: g++.dg/ipa/devirt-34.C  -std=gnu++11  scan-ipa-dump devirt
>>> "Speculative targets"
>>> FAIL: g++.dg/ipa/devirt-34.C  -std=gnu++11  scan-ipa-dump devirt "1
>>> speculatively devirtualized"
>>> FAIL: g++.dg/ipa/devirt-34.C  -std=gnu++14  scan-ipa-dump devirt
>>> "Speculative targets"
>>> FAIL: g++.dg/ipa/devirt-34.C  -std=gnu++14  scan-ipa-dump devirt "1
>>> speculatively devirtualized"
>>> FAIL: g++.dg/ipa/devirt-35.C  -std=gnu++98 (internal compiler error)
>>> FAIL: g++.dg/ipa/devirt-35.C  -std=gnu++98 (test for excess errors)
>>> FAIL: g++.dg/ipa/devirt-35.C  -std=gnu++98  scan-tree-dump fre1
>>> "converting indirect call to function virtual int B::t"
>>> FAIL: g++.dg/ipa/devirt-35.C  -std=gnu++11 (internal compiler error)
>>> FAIL: g++.dg/ipa/devirt-35.C  -std=gnu++11 (test for excess errors)
>>> FAIL: g++.dg/ipa/devirt-35.C  -std=gnu++11  scan-tree-dump fre1
>>> "converting indirect call to function virtual int B::t"
>>> FAIL: g++.dg/ipa/devirt-35.C  -std=gnu++14 (internal compiler error)
>>> FAIL: g++.dg/ipa/devirt-35.C  -std=gnu++14 (test for excess errors)
>>> FAIL: g++.dg/ipa/devirt-35.C  -std=gnu++14  scan-tree-dump fre1
>>> "converting indirect call to function virtual int B::t"
>>> FAIL: g++.dg/ipa/devirt-36.C  -std=gnu++98 (internal compiler error)
>>> FAIL: g++.dg/ipa/devirt-36.C  -std=gnu++98 (test for excess errors)
>>> FAIL: g++.dg/ipa/devirt-36.C  -std=gnu++98  scan-tree-dump fre1
>>> "converting indirect call to function virtual int B::t"
>>> FAIL: g++.dg/ipa/devirt-36.C  -std=gnu++11 (internal compiler error)
>>> FAIL: g++.dg/ipa/devirt-36.C  -std=gnu++11 (test for excess errors)
>>> FAIL: g++.dg/ipa/devirt-36.C  -std=gnu++11  scan-tree-dump fre1
>>> "converting indirect call to function virtual int B::t"
>>> FAIL: g++.dg/ipa/devirt-36.C  -std=gnu++14 (internal compiler error)
>>> FAIL: g++.dg/ipa/devirt-36.C  -std=gnu++14 (test for excess errors)
>>> FAIL: g++.dg/ipa/devirt-36.C  -std=gnu++14  scan-tree-dump fre1
>>> "converting indirect call to function virtual int B::t"
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++98  scan-tree-dump fre2 "No
>>> dynamic type change found."
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++98  scan-tree-dump fre2
>>> "Checking vtbl store:"
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++98  scan-tree-dump fre2
>>> "Function call may change dynamic type:extcall"
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++98  scan-tree-dump fre2
>>> "converting indirect call to function virtual void"
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++11  scan-tree-dump fre2 "No
>>> dynamic type change found."
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++11  scan-tree-dump fre2
>>> "Checking vtbl store:"
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++11  scan-tree-dump fre2
>>> "Function call may change dynamic type:extcall"
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++11  scan-tree-dump fre2
>>> "converting indirect call to function virtual void"
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++14  scan-tree-dump fre2 "No
>>> dynamic type change found."
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++14  scan-tree-dump fre2
>>> "Checking vtbl store:"
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++14  scan-tree-dump fre2
>>> "Function call may change dynamic type:extcall"
>>> FAIL: g++.dg/ipa/devirt-37.C  -std=gnu++14  scan-tree-dump fre2
>>> "converting indirect call to function virtual void"
>>> FAIL: g++.dg/ipa/devirt-41.C  -std=gnu++98  scan-ipa-dump inline
>>> "Second type is base of first"
>>> FAIL: g++.dg/ipa/devirt-41.C  -std=gnu++11  scan-ipa-dump inline
>>> "Second type is base of first"
>>> FAIL: g++.dg/ipa/devirt-41.C  -std=gnu++14  scan-ipa-dump inline
>>> "Second type is base of first"
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++98  scan-ipa-dump-times inline
>>> "First type is base of second" 3
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++98  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target" 2
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++98  scan-tree-dump-times
>>> optimized "return 2" 3
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++98  scan-tree-dump-not
>>> optimized "OBJ_TYPE_REF"
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++11  scan-ipa-dump-times inline
>>> "First type is base of second" 3
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++11  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target" 2
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++11  scan-tree-dump-times
>>> optimized "return 2" 3
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++11  scan-tree-dump-not
>>> optimized "OBJ_TYPE_REF"
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++14  scan-ipa-dump-times inline
>>> "First type is base of second" 3
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++14  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target" 2
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++14  scan-tree-dump-times
>>> optimized "return 2" 3
>>> FAIL: g++.dg/ipa/devirt-42.C  -std=gnu++14  scan-tree-dump-not
>>> optimized "OBJ_TYPE_REF"
>>> FAIL: g++.dg/ipa/devirt-44.C  -std=gnu++98  scan-ipa-dump inline
>>> "Second type is base of first"
>>> FAIL: g++.dg/ipa/devirt-44.C  -std=gnu++98  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*B::foo" 1
>>> FAIL: g++.dg/ipa/devirt-44.C  -std=gnu++11  scan-ipa-dump inline
>>> "Second type is base of first"
>>> FAIL: g++.dg/ipa/devirt-44.C  -std=gnu++11  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*B::foo" 1
>>> FAIL: g++.dg/ipa/devirt-44.C  -std=gnu++14  scan-ipa-dump inline
>>> "Second type is base of first"
>>> FAIL: g++.dg/ipa/devirt-44.C  -std=gnu++14  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*B::foo" 1
>>> FAIL: g++.dg/ipa/devirt-45.C  -std=gnu++98  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*B::foo" 1
>>> FAIL: g++.dg/ipa/devirt-45.C  -std=gnu++11  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*B::foo" 1
>>> FAIL: g++.dg/ipa/devirt-45.C  -std=gnu++14  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*B::foo" 1
>>> FAIL: g++.dg/ipa/devirt-46.C  -std=gnu++98  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*B::foo" 1
>>> FAIL: g++.dg/ipa/devirt-46.C  -std=gnu++11  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*B::foo" 1
>>> FAIL: g++.dg/ipa/devirt-46.C  -std=gnu++14  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*B::foo" 1
>>> FAIL: g++.dg/ipa/devirt-47.C  -std=gnu++98  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*C::_ZTh" 1
>>> FAIL: g++.dg/ipa/devirt-47.C  -std=gnu++11  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*C::_ZTh" 1
>>> FAIL: g++.dg/ipa/devirt-47.C  -std=gnu++14  scan-ipa-dump-times inline
>>> "Discovered a virtual call to a known target[^\\n]*C::_ZTh" 1
>>> FAIL: g++.dg/ipa/devirt-9.C  -std=gnu++98  scan-ipa-dump-not
>>> whole-program "OBJ_TYPE_REF"
>>> FAIL: g++.dg/ipa/devirt-9.C  -std=gnu++11  scan-ipa-dump-not
>>> whole-program "OBJ_TYPE_REF"
>>> FAIL: g++.dg/ipa/devirt-9.C  -std=gnu++14  scan-ipa-dump-not
>>> whole-program "OBJ_TYPE_REF"
>>> FAIL: g++.dg/ipa/devirt-g-1.C  -std=gnu++98  scan-tree-dump-times
>>> optimized "OBJ_TYPE_REF" 0
>>> FAIL: g++.dg/ipa/devirt-g-1.C  -std=gnu++11  scan-tree-dump-times
>>> optimized "OBJ_TYPE_REF" 0
>>> FAIL: g++.dg/ipa/devirt-g-1.C  -std=gnu++14  scan-tree-dump-times
>>> optimized "OBJ_TYPE_REF" 0
>>> FAIL: g++.dg/ipa/pr60600.C  -std=gnu++98  scan-ipa-dump cp "Type
>>> inconsistent devirtualization"
>>> FAIL: g++.dg/ipa/pr60600.C  -std=gnu++11  scan-ipa-dump cp "Type
>>> inconsistent devirtualization"
>>> FAIL: g++.dg/ipa/pr60600.C  -std=gnu++14  scan-ipa-dump cp "Type
>>> inconsistent devirtualization"
>>> FAIL: g++.dg/opt/pr36185.C  -std=gnu++98 execution test
>>> FAIL: g++.dg/opt/pr36185.C  -std=gnu++11 execution test
>>> FAIL: g++.dg/opt/pr36185.C  -std=gnu++14 execution test
>>> FAIL: g++.dg/tree-ssa/20040317-1.C  -std=gnu++98 execution test
>>> FAIL: g++.dg/tree-ssa/20040317-1.C  -std=gnu++11 execution test
>>> FAIL: g++.dg/tree-ssa/20040317-1.C  -std=gnu++14 execution test
>>> FAIL: g++.dg/torture/covariant-1.C   -O2  execution test
>>> FAIL: g++.dg/torture/covariant-1.C   -O3 -fomit-frame-pointer  execution test
>>> FAIL: g++.dg/torture/covariant-1.C   -O3 -g  execution test
>>> FAIL: g++.dg/torture/covariant-1.C   -Os  execution test
>>> FAIL: g++.dg/torture/covariant-1.C   -O2 -flto -fno-use-linker-plugin
>>> -flto-partition=none  execution test
>>> FAIL: g++.dg/torture/covariant-1.C   -O2 -flto -fuse-linker-plugin
>>> -fno-fat-lto-objects  execution test
>>>
>>>
>>> Thanks,
>>> Andrew
>>>
>>
>> I saw
>
> Yes and can you try my patch too?

Yes, it fixes those failures.

-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]