mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-09 03:00:27 +08:00
tree.c: (obj_type_ref_class): Move to...
* tree.c: (obj_type_ref_class): Move to... * ipa-devirt.c (obj_type_ref_class): Move to here; lookup main odr type. (get_odr_type): Compensate for type simplification. * g++.dg/ipa/devirt-30.C: Add dg-do. * g++.dg/lto/devirt-1_0.C: New testcase. * g++.dg/lto/devirt-2_0.C: New testcase. * g++.dg/lto/devirt-3_0.C: New testcase. * g++.dg/lto/devirt-4_0.C: New testcase. * g++.dg/lto/devirt-5_0.C: New testcase. * g++.dg/lto/devirt-6_0.C: New testcase. * g++.dg/lto/devirt-13_0.C: New testcase. * g++.dg/lto/devirt-14_0.C: New testcase. * g++.dg/lto/devirt-19_0.C: New testcase. * g++.dg/lto/devirt-22_0.C: New testcase. * g++.dg/lto/devirt-23_0.C: New testcase. * g++.dg/lto/devirt-30_0.C: New testcase. * g++.dg/lto/devirt-34_0.C: New testcase. From-SVN: r267359
This commit is contained in:
parent
b5e1a72454
commit
4611c03d2b
@ -1985,6 +1985,30 @@ add_type_duplicate (odr_type val, tree type)
|
||||
return build_bases;
|
||||
}
|
||||
|
||||
/* REF is OBJ_TYPE_REF, return the class the ref corresponds to. */
|
||||
|
||||
tree
|
||||
obj_type_ref_class (const_tree ref)
|
||||
{
|
||||
gcc_checking_assert (TREE_CODE (ref) == OBJ_TYPE_REF);
|
||||
ref = TREE_TYPE (ref);
|
||||
gcc_checking_assert (TREE_CODE (ref) == POINTER_TYPE);
|
||||
ref = TREE_TYPE (ref);
|
||||
/* We look for type THIS points to. ObjC also builds
|
||||
OBJ_TYPE_REF with non-method calls, Their first parameter
|
||||
ID however also corresponds to class type. */
|
||||
gcc_checking_assert (TREE_CODE (ref) == METHOD_TYPE
|
||||
|| TREE_CODE (ref) == FUNCTION_TYPE);
|
||||
ref = TREE_VALUE (TYPE_ARG_TYPES (ref));
|
||||
gcc_checking_assert (TREE_CODE (ref) == POINTER_TYPE);
|
||||
tree ret = TREE_TYPE (ref);
|
||||
if (!in_lto_p)
|
||||
ret = TYPE_CANONICAL (ret);
|
||||
else
|
||||
ret = get_odr_type (ret)->type;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Get ODR type hash entry for TYPE. If INSERT is true, create
|
||||
possibly new entry. */
|
||||
|
||||
@ -2000,6 +2024,8 @@ get_odr_type (tree type, bool insert)
|
||||
int base_id = -1;
|
||||
|
||||
type = TYPE_MAIN_VARIANT (type);
|
||||
if (!in_lto_p)
|
||||
type = TYPE_CANONICAL (type);
|
||||
|
||||
gcc_checking_assert (can_be_name_hashed_p (type)
|
||||
|| can_be_vtable_hashed_p (type));
|
||||
|
@ -1,3 +1,20 @@
|
||||
2018-12-21 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* g++.dg/ipa/devirt-30.C: Add dg-do.
|
||||
* g++.dg/lto/devirt-1_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-2_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-3_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-4_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-5_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-6_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-13_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-14_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-19_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-22_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-23_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-30_0.C: New testcase.
|
||||
* g++.dg/lto/devirt-34_0.C: New testcase.
|
||||
|
||||
2018-12-26 Steven G . Kargl <kargl@gcc.gnu.org>
|
||||
|
||||
PR fortran/85798
|
||||
|
@ -1,4 +1,5 @@
|
||||
// PR c++/58678
|
||||
// { dg-do compile }
|
||||
// { dg-options "-O3 -fdump-ipa-devirt" }
|
||||
|
||||
// We shouldn't speculatively devirtualize to ~B because B is an abstract
|
||||
|
5
gcc/testsuite/g++.dg/lto/devirt-13_0.C
Normal file
5
gcc/testsuite/g++.dg/lto/devirt-13_0.C
Normal file
@ -0,0 +1,5 @@
|
||||
/* { dg-lto-do run } */
|
||||
/* Call to foo should be devirtualized because there are no derived types of A. */
|
||||
/* { dg-lto-options "-O2 -flto -fdump-tree-ssa" } */
|
||||
#include "../ipa/devirt-13.C"
|
||||
/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "ssa"} } */
|
4
gcc/testsuite/g++.dg/lto/devirt-14_0.C
Normal file
4
gcc/testsuite/g++.dg/lto/devirt-14_0.C
Normal file
@ -0,0 +1,4 @@
|
||||
/* { dg-lto-do run } */
|
||||
/* { dg-lto-options "-O2 -fdump-tree-ssa" } */
|
||||
#include "../ipa/devirt-14.C"
|
||||
/* { dg-final { scan-tree-dump-not "A.*foo" "ssa"} } */
|
5
gcc/testsuite/g++.dg/lto/devirt-19_0.C
Normal file
5
gcc/testsuite/g++.dg/lto/devirt-19_0.C
Normal file
@ -0,0 +1,5 @@
|
||||
/* { dg-lto-do link } */
|
||||
/* { dg-lto-options { "-O2 -fdump-ipa-cp -Wno-return-type -flto -r -nostdlib" } } */
|
||||
/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
|
||||
#include "../ipa/devirt-19.C"
|
||||
/* { dg-final { scan-wpa-ipa-dump-times "Discovered a virtual call to a known target" 1 "cp" } } */
|
4
gcc/testsuite/g++.dg/lto/devirt-1_0.C
Normal file
4
gcc/testsuite/g++.dg/lto/devirt-1_0.C
Normal file
@ -0,0 +1,4 @@
|
||||
/* { dg-lto-do run } */
|
||||
/* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto" } } */
|
||||
#include "../ipa/devirt-1.C"
|
||||
/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo" "cp" } } */
|
5
gcc/testsuite/g++.dg/lto/devirt-22_0.C
Normal file
5
gcc/testsuite/g++.dg/lto/devirt-22_0.C
Normal file
@ -0,0 +1,5 @@
|
||||
/* { dg-lto-do link } */
|
||||
/* { dg-lto-options { "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp -flto -r -nostdlib" } } */
|
||||
/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
|
||||
#include "../ipa/devirt-22.C"
|
||||
/* { dg-final { scan-wpa-ipa-dump-times "Discovered a virtual call to a known target" 2 "cp" } } */
|
4
gcc/testsuite/g++.dg/lto/devirt-23_0.C
Normal file
4
gcc/testsuite/g++.dg/lto/devirt-23_0.C
Normal file
@ -0,0 +1,4 @@
|
||||
/* { dg-lto-do run } */
|
||||
/* { dg-lto-options { "-O3 -fno-early-inlining -fno-ipa-sra -flto -fno-devirtualize-speculatively" } } */
|
||||
#include "../ipa/devirt-23.C"
|
||||
/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to" "cp" { xfail *-*-* } } } */
|
4
gcc/testsuite/g++.dg/lto/devirt-2_0.C
Normal file
4
gcc/testsuite/g++.dg/lto/devirt-2_0.C
Normal file
@ -0,0 +1,4 @@
|
||||
/* { dg-lto-do run } */
|
||||
/* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto" } } */
|
||||
#include "../ipa/devirt-2.C"
|
||||
/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo" "cp" } } */
|
5
gcc/testsuite/g++.dg/lto/devirt-30_0.C
Normal file
5
gcc/testsuite/g++.dg/lto/devirt-30_0.C
Normal file
@ -0,0 +1,5 @@
|
||||
/* { dg-lto-do link } */
|
||||
/* { dg-lto-options { "-O3 -fdump-ipa-devirt -flto -r -nostdlib" } } */
|
||||
/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
|
||||
#include "../ipa/devirt-30.C"
|
||||
// { dg-final { scan-wpa-ipa-dump-not "Speculatively devirtualizing" "devirt" } }
|
6
gcc/testsuite/g++.dg/lto/devirt-34_0.C
Normal file
6
gcc/testsuite/g++.dg/lto/devirt-34_0.C
Normal file
@ -0,0 +1,6 @@
|
||||
/* { dg-lto-do link } */
|
||||
/* { dg-lto-options { "-O2 -fdump-ipa-devirt -flto -r -nostdlib" } } */
|
||||
/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
|
||||
#include "../ipa/devirt-34.C"
|
||||
/* { dg-final { scan-wpa-ipa-dump "Speculative targets" "devirt" } } */
|
||||
/* { dg-final { scan-wpa-ipa-dump "1 speculatively devirtualized" "devirt" } } */
|
4
gcc/testsuite/g++.dg/lto/devirt-3_0.C
Normal file
4
gcc/testsuite/g++.dg/lto/devirt-3_0.C
Normal file
@ -0,0 +1,4 @@
|
||||
/* { dg-lto-do run } */
|
||||
/* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto" } } */
|
||||
#include "../ipa/devirt-3.C"
|
||||
/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo" "cp" } } */
|
4
gcc/testsuite/g++.dg/lto/devirt-4_0.C
Normal file
4
gcc/testsuite/g++.dg/lto/devirt-4_0.C
Normal file
@ -0,0 +1,4 @@
|
||||
/* { dg-lto-do run } */
|
||||
/* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto" } } */
|
||||
#include "../ipa/devirt-4.C"
|
||||
/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo" "cp" } } */
|
4
gcc/testsuite/g++.dg/lto/devirt-5_0.C
Normal file
4
gcc/testsuite/g++.dg/lto/devirt-5_0.C
Normal file
@ -0,0 +1,4 @@
|
||||
/* { dg-lto-do run } */
|
||||
/* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto" } } */
|
||||
#include "../ipa/devirt-5.C"
|
||||
/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo" "cp" } } */
|
3
gcc/testsuite/g++.dg/lto/devirt-6_0.C
Normal file
3
gcc/testsuite/g++.dg/lto/devirt-6_0.C
Normal file
@ -0,0 +1,3 @@
|
||||
/* { dg-lto-do run } */
|
||||
/* { dg-lto-options { "-O3 -flto" } } */
|
||||
#include "../ipa/devirt-6.C"
|
19
gcc/tree.c
19
gcc/tree.c
@ -12838,25 +12838,6 @@ virtual_method_call_p (const_tree target)
|
||||
return true;
|
||||
}
|
||||
|
||||
/* REF is OBJ_TYPE_REF, return the class the ref corresponds to. */
|
||||
|
||||
tree
|
||||
obj_type_ref_class (const_tree ref)
|
||||
{
|
||||
gcc_checking_assert (TREE_CODE (ref) == OBJ_TYPE_REF);
|
||||
ref = TREE_TYPE (ref);
|
||||
gcc_checking_assert (TREE_CODE (ref) == POINTER_TYPE);
|
||||
ref = TREE_TYPE (ref);
|
||||
/* We look for type THIS points to. ObjC also builds
|
||||
OBJ_TYPE_REF with non-method calls, Their first parameter
|
||||
ID however also corresponds to class type. */
|
||||
gcc_checking_assert (TREE_CODE (ref) == METHOD_TYPE
|
||||
|| TREE_CODE (ref) == FUNCTION_TYPE);
|
||||
ref = TREE_VALUE (TYPE_ARG_TYPES (ref));
|
||||
gcc_checking_assert (TREE_CODE (ref) == POINTER_TYPE);
|
||||
return TREE_TYPE (ref);
|
||||
}
|
||||
|
||||
/* Lookup sub-BINFO of BINFO of TYPE at offset POS. */
|
||||
|
||||
static tree
|
||||
|
Loading…
x
Reference in New Issue
Block a user