Commit 9cb9b937 by Jan Hubicka Committed by Jan Hubicka

lto.c (hash_canonical_type): Use tree_code_for_canonical_type_merging.


	* lto.c (hash_canonical_type): Use tree_code_for_canonical_type_merging.

	* tree.h (tree_code_for_canonical_type_merging): New function.
	* tree.c (gimple_canonical_types_compatible_p): Use
	tree_code_for_canonical_type_merging..
	* gcc.dg/lto/c-compatible-types_0.c: New testcase.
	* gcc.dg/lto/c-compatible-types_1.c: New testcase.

From-SVN: r224135
parent 19cd26a6
2015-06-04 Jan Hubicka <hubicka@ucw.cz>
* tree.h (tree_code_for_canonical_type_merging): New function.
* tree.c (gimple_canonical_types_compatible_p): Use
tree_code_for_canonical_type_merging..
2015-06-04 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> 2015-06-04 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
PR c++/66192 PR c++/66192
......
2015-06-04 Jan Hubicka <hubicka@ucw.cz>
* lto.c (hash_canonical_type): Use tree_code_for_canonical_type_merging.
2015-06-03 Jan Hubicka <hubicka@ucw.cz> 2015-06-03 Jan Hubicka <hubicka@ucw.cz>
* lto.c (iterative_hash_canonical_type, * lto.c (iterative_hash_canonical_type,
......
...@@ -319,7 +319,7 @@ hash_canonical_type (tree type) ...@@ -319,7 +319,7 @@ hash_canonical_type (tree type)
smaller sets; when searching for existing matching types to merge, smaller sets; when searching for existing matching types to merge,
only existing types having the same features as the new type will be only existing types having the same features as the new type will be
checked. */ checked. */
hstate.add_int (TREE_CODE (type)); hstate.add_int (tree_code_for_canonical_type_merging (TREE_CODE (type)));
hstate.add_int (TYPE_MODE (type)); hstate.add_int (TYPE_MODE (type));
/* Incorporate common features of numerical types. */ /* Incorporate common features of numerical types. */
......
2015-06-04 Jan Hubicka <hubicka@ucw.cz>
* gcc.dg/lto/c-compatible-types_0.c: New testcase.
* gcc.dg/lto/c-compatible-types_1.c: New testcase.
2015-06-03 Jan Hubicka <hubicka@ucw.cz>
* lto.c (iterative_hash_canonical_type,
gimple_register_canonical_type): only hash main variants of types
2015-06-04 Sandra Loosemore <sandra@codesourcery.com> 2015-06-04 Sandra Loosemore <sandra@codesourcery.com>
* gcc.target/aarch64/advsimd-intrinsics/advsimd-intrinsics.exp: * gcc.target/aarch64/advsimd-intrinsics/advsimd-intrinsics.exp:
......
/* { dg-do run } */
/* { dg-options "-O3" } */
/* { dg-skip-if "require -fno-short-enums to work" {target short_enums} } */
/* By C standard Each enumerated type shall be compatible with char, a signed
integer, type, or an unsigned integer type. The choice of type is
implementation-defined. Check that enum and unsigned int match. */
unsigned int a;
unsigned int *b;
void t();
void reset ()
{
asm("":"=r"(a):"0"(0));
}
int
main()
{
asm("":"=r"(a):"0"(1));
asm("":"=r"(b):"0"(&a));
t();
return 0;
}
enum a {test1, test2};
enum a a;
enum a *b;
void reset (void);
void
t()
{
if (a != test2)
__builtin_abort ();
if (*b != test2)
__builtin_abort ();
reset ();
if (a != test1)
__builtin_abort ();
if (*b != test1)
__builtin_abort ();
}
...@@ -12930,7 +12930,8 @@ gimple_canonical_types_compatible_p (const_tree t1, const_tree t2, ...@@ -12930,7 +12930,8 @@ gimple_canonical_types_compatible_p (const_tree t1, const_tree t2,
return TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2); return TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2);
/* Can't be the same type if the types don't have the same code. */ /* Can't be the same type if the types don't have the same code. */
if (TREE_CODE (t1) != TREE_CODE (t2)) if (tree_code_for_canonical_type_merging (TREE_CODE (t1))
!= tree_code_for_canonical_type_merging (TREE_CODE (t2)))
return false; return false;
/* Qualifiers do not matter for canonical type comparison purposes. */ /* Qualifiers do not matter for canonical type comparison purposes. */
......
...@@ -4598,6 +4598,27 @@ extern int tree_map_base_marked_p (const void *); ...@@ -4598,6 +4598,27 @@ extern int tree_map_base_marked_p (const void *);
extern void DEBUG_FUNCTION verify_type (const_tree t); extern void DEBUG_FUNCTION verify_type (const_tree t);
extern bool gimple_canonical_types_compatible_p (const_tree, const_tree, extern bool gimple_canonical_types_compatible_p (const_tree, const_tree,
bool trust_type_canonical = true); bool trust_type_canonical = true);
/* Return simplified tree code of type that is used for canonical type merging. */
inline enum tree_code
tree_code_for_canonical_type_merging (enum tree_code code)
{
/* By C standard, each enumerated type shall be compatible with char,
a signed integer, or an unsigned integer. The choice of type is
implementation defined (in our case it depends on -fshort-enum).
For this reason we make no distinction between ENUMERAL_TYPE and INTEGER
type and compare only by their signedness and precision. */
if (code == ENUMERAL_TYPE)
return INTEGER_TYPE;
/* To allow inter-operability between languages having references and
C, we consider reference types and pointers alike. Note that this is
not strictly necessary for C-Fortran 2008 interoperability because
Fortran define C_PTR type that needs to be compatible with C pointers
and we handle this one as ptr_type_node. */
if (code == REFERENCE_TYPE)
return POINTER_TYPE;
return code;
}
#define tree_map_eq tree_map_base_eq #define tree_map_eq tree_map_base_eq
extern unsigned int tree_map_hash (const void *); extern unsigned int tree_map_hash (const void *);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment