This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH/IPA] Fix ipa-polymorphic-call when size of Pmode is not the size of pointers in user code
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Andrew Pinski <pinskia at gmail dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 19 Nov 2014 18:01:33 -0800
- Subject: Re: [PATCH/IPA] Fix ipa-polymorphic-call when size of Pmode is not the size of pointers in user code
- Authentication-results: sourceware.org; auth=none
- References: <CA+=Sn1=zo+6_8o-Rg6LEFAod1M-91hpPLfGvhuTvv-f00RJHBA at mail dot gmail dot com> <CAMe9rOo4cceHbfCdO_yTr+3y4Y4nnbXE2apMWRG9yYTmXYAz0w at mail dot gmail dot com> <CA+=Sn1=t1pdonZm+nsOgtwObiDsJjU+d7=N7LKMVKt38T+Nbyw at mail dot gmail dot com> <CAMe9rOrP6JzWn=DtJEeyW1VhTasA5_6Kz-C4MWVkdFKbPQKDfQ at mail dot gmail dot com> <CA+=Sn1ksfSgnHxZyAycMeMCUogOPj3sKLPPqtHXuErpEqqG-=w at mail dot gmail dot com> <CAMe9rOpostgGcF+Wk+KC4oPjqvgn1+Pavhi9PM2NS7h4RFjr8g at mail dot gmail dot com> <CA+=Sn1kh=67_wK6xKUsBt3Px_agSFtQyWipnHDtAu0-VLUF43Q at mail dot gmail dot com> <CAMe9rOpsBgLqgR5NVnRFnDL35pndG2Q1n_4RcmzX+SWx3aPAPA at mail dot gmail dot com> <CA+=Sn1mgB0DugrALBhPCJBxq74N_X8qx6fx0Wm5yPXb9O1KUtA at mail dot gmail dot com>
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.