On Wed, Nov 19, 2014 at 5:55 PM, Andrew Pinski <pins...@gmail.com> wrote: > On Wed, Nov 19, 2014 at 5:53 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >> On Wed, Nov 19, 2014 at 5:39 PM, Andrew Pinski <pins...@gmail.com> wrote: >>> 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 >>> >> >> I saw > > Yes and can you try my patch too?
Yes, it fixes those failures. -- H.J.