On Wed, Nov 19, 2014 at 5:37 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Wed, Nov 19, 2014 at 5:36 PM, Andrew Pinski <pins...@gmail.com> wrote:
>> On Wed, Nov 19, 2014 at 5:35 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
>>> On Wed, Nov 19, 2014 at 5:23 PM, Andrew Pinski <pins...@gmail.com> wrote:
>>>> On Wed, Nov 19, 2014 at 5:11 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
>>>>> On Wed, Nov 19, 2014 at 4:54 PM, Andrew Pinski <pins...@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


>
>
> --
> H.J.

Reply via email to