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

2014-11-20 Thread Jan Hubicka
 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.

OK,
thanks!
Honza

 diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c
 index 452f2d2..a746c49 100644
 --- a/gcc/ipa-polymorphic-call.c
 +++ b/gcc/ipa-polymorphic-call.c
 @@ -112,7 +112,7 @@ possible_placement_new (tree type, tree expected_type,
 || !tree_fits_shwi_p (TYPE_SIZE (type))
 || (cur_offset
 + (expected_type ? tree_to_uhwi (TYPE_SIZE (expected_type))
 -  : GET_MODE_BITSIZE (Pmode))
 +  : POINTER_SIZE)
 = tree_to_uhwi (TYPE_SIZE (type);
  }
  
 @@ -155,7 +155,7 @@ ipa_polymorphic_call_context::restrict_to_inner_class 
 (tree otr_type,
HOST_WIDE_INT cur_offset = offset;
bool speculative = false;
bool size_unknown = false;
 -  unsigned HOST_WIDE_INT otr_type_size = GET_MODE_BITSIZE (Pmode);
 +  unsigned HOST_WIDE_INT otr_type_size = POINTER_SIZE;
  
/* Update OUTER_TYPE to match EXPECTED_TYPE if it is not set.  */
if (!outer_type)
 @@ -316,7 +316,7 @@ ipa_polymorphic_call_context::restrict_to_inner_class 
 (tree otr_type,
   
 if (pos = (unsigned HOST_WIDE_INT)cur_offset
  (pos + size) = (unsigned HOST_WIDE_INT)cur_offset
 -  + GET_MODE_BITSIZE (Pmode)
 +  + POINTER_SIZE
  (!otr_type
 || !TYPE_SIZE (TREE_TYPE (fld))
 || !tree_fits_shwi_p (TYPE_SIZE (TREE_TYPE (fld)))
 @@ -1243,7 +1243,7 @@ extr_type_from_vtbl_ptr_store (gimple stmt, struct 
 type_change_info *tci,
 print_generic_expr (dump_file, tci-instance, TDF_SLIM);
 fprintf (dump_file,  with offset %i\n, (int)tci-offset);
   }
 -   return tci-offset  GET_MODE_BITSIZE (Pmode) ? error_mark_node : 
 NULL_TREE;
 +   return tci-offset  POINTER_SIZE ? error_mark_node : NULL_TREE;
   }
if (offset != tci-offset
 || size != POINTER_SIZE
 @@ -1252,9 +1252,9 @@ extr_type_from_vtbl_ptr_store (gimple stmt, struct 
 type_change_info *tci,
 if (dump_file)
   fprintf (dump_file, wrong offset %i!=%i or size %i\n,
(int)offset, (int)tci-offset, (int)size);
 -   return offset + GET_MODE_BITSIZE (Pmode) = tci-offset
 +   return offset + POINTER_SIZE = tci-offset
|| (max_size != -1
 -   tci-offset + GET_MODE_BITSIZE (Pmode)  offset + 
 max_size)
 +   tci-offset + POINTER_SIZE  offset + max_size)
? error_mark_node : NULL;
   }
  }



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

2014-11-19 Thread Andrew Pinski
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.
diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c
index 452f2d2..a746c49 100644
--- a/gcc/ipa-polymorphic-call.c
+++ b/gcc/ipa-polymorphic-call.c
@@ -112,7 +112,7 @@ possible_placement_new (tree type, tree expected_type,
  || !tree_fits_shwi_p (TYPE_SIZE (type))
  || (cur_offset
  + (expected_type ? tree_to_uhwi (TYPE_SIZE (expected_type))
-: GET_MODE_BITSIZE (Pmode))
+: POINTER_SIZE)
  = tree_to_uhwi (TYPE_SIZE (type);
 }
 
@@ -155,7 +155,7 @@ ipa_polymorphic_call_context::restrict_to_inner_class (tree 
otr_type,
   HOST_WIDE_INT cur_offset = offset;
   bool speculative = false;
   bool size_unknown = false;
-  unsigned HOST_WIDE_INT otr_type_size = GET_MODE_BITSIZE (Pmode);
+  unsigned HOST_WIDE_INT otr_type_size = POINTER_SIZE;
 
   /* Update OUTER_TYPE to match EXPECTED_TYPE if it is not set.  */
   if (!outer_type)
@@ -316,7 +316,7 @@ ipa_polymorphic_call_context::restrict_to_inner_class (tree 
otr_type,

  if (pos = (unsigned HOST_WIDE_INT)cur_offset
   (pos + size) = (unsigned HOST_WIDE_INT)cur_offset
-+ GET_MODE_BITSIZE (Pmode)
++ POINTER_SIZE
   (!otr_type
  || !TYPE_SIZE (TREE_TYPE (fld))
  || !tree_fits_shwi_p (TYPE_SIZE (TREE_TYPE (fld)))
@@ -1243,7 +1243,7 @@ extr_type_from_vtbl_ptr_store (gimple stmt, struct 
type_change_info *tci,
  print_generic_expr (dump_file, tci-instance, TDF_SLIM);
  fprintf (dump_file,  with offset %i\n, (int)tci-offset);
}
- return tci-offset  GET_MODE_BITSIZE (Pmode) ? error_mark_node : 
NULL_TREE;
+ return tci-offset  POINTER_SIZE ? error_mark_node : NULL_TREE;
}
   if (offset != tci-offset
  || size != POINTER_SIZE
@@ -1252,9 +1252,9 @@ extr_type_from_vtbl_ptr_store (gimple stmt, struct 
type_change_info *tci,
  if (dump_file)
fprintf (dump_file, wrong offset %i!=%i or size %i\n,
 (int)offset, (int)tci-offset, (int)size);
- return offset + GET_MODE_BITSIZE (Pmode) = tci-offset
+ return offset + POINTER_SIZE = tci-offset
 || (max_size != -1
- tci-offset + GET_MODE_BITSIZE (Pmode)  offset + 
max_size)
+ tci-offset + POINTER_SIZE  offset + max_size)
 ? error_mark_node : NULL;
}
 }


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

2014-11-19 Thread H.J. Lu
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?


-- 
H.J.


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

2014-11-19 Thread Andrew Pinski
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.

Thanks,
Andrew Pinski



 --
 H.J.


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

2014-11-19 Thread H.J. Lu
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?

-- 
H.J.


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

2014-11-19 Thread Andrew Pinski
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.

Thanks,
Andrew


 --
 H.J.


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

2014-11-19 Thread H.J. Lu
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?


-- 
H.J.


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

2014-11-19 Thread Andrew Pinski
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  

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

2014-11-19 Thread H.J. Lu
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: 

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

2014-11-19 Thread Andrew Pinski
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
 

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

2014-11-19 Thread H.J. Lu
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