Move vector_type_mode to tree.c
...so that it's possible to use TYPE_MODE in tree.h. 2017-08-21 Richard Sandiford <richard.sandiford@linaro.org> gcc/ * stor-layout.h (vector_type_mode): Move to... * tree.h (vector_type_mode): ...here. * stor-layout.c (vector_type_mode): Move to... * tree.c (vector_type_mode): ...here. Include rtl.h and regs.h. From-SVN: r251221
This commit is contained in:
parent
1ea85365b4
commit
c349606774
@ -1,3 +1,10 @@
|
||||
2017-08-21 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
|
||||
* stor-layout.h (vector_type_mode): Move to...
|
||||
* tree.h (vector_type_mode): ...here.
|
||||
* stor-layout.c (vector_type_mode): Move to...
|
||||
* tree.c (vector_type_mode): ...here. Include rtl.h and regs.h.
|
||||
|
||||
2017-08-21 Richard Biener <rguenther@suse.de>
|
||||
|
||||
* debug.h (struct gcc_debug_hooks): Add die_ref_for_decl and
|
||||
|
@ -2494,45 +2494,6 @@ min_align_of_type (tree type)
|
||||
}
|
||||
return align / BITS_PER_UNIT;
|
||||
}
|
||||
|
||||
/* Vector types need to re-check the target flags each time we report
|
||||
the machine mode. We need to do this because attribute target can
|
||||
change the result of vector_mode_supported_p and have_regs_of_mode
|
||||
on a per-function basis. Thus the TYPE_MODE of a VECTOR_TYPE can
|
||||
change on a per-function basis. */
|
||||
/* ??? Possibly a better solution is to run through all the types
|
||||
referenced by a function and re-compute the TYPE_MODE once, rather
|
||||
than make the TYPE_MODE macro call a function. */
|
||||
|
||||
machine_mode
|
||||
vector_type_mode (const_tree t)
|
||||
{
|
||||
machine_mode mode;
|
||||
|
||||
gcc_assert (TREE_CODE (t) == VECTOR_TYPE);
|
||||
|
||||
mode = t->type_common.mode;
|
||||
if (VECTOR_MODE_P (mode)
|
||||
&& (!targetm.vector_mode_supported_p (mode)
|
||||
|| !have_regs_of_mode[mode]))
|
||||
{
|
||||
machine_mode innermode = TREE_TYPE (t)->type_common.mode;
|
||||
|
||||
/* For integers, try mapping it to a same-sized scalar mode. */
|
||||
if (GET_MODE_CLASS (innermode) == MODE_INT)
|
||||
{
|
||||
mode = mode_for_size (TYPE_VECTOR_SUBPARTS (t)
|
||||
* GET_MODE_BITSIZE (innermode), MODE_INT, 0);
|
||||
|
||||
if (mode != VOIDmode && have_regs_of_mode[mode])
|
||||
return mode;
|
||||
}
|
||||
|
||||
return BLKmode;
|
||||
}
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
/* Create and return a type for signed integers of PRECISION bits. */
|
||||
|
||||
|
@ -114,7 +114,4 @@ extern void relayout_decl (tree);
|
||||
belongs to a function parameter. */
|
||||
extern tree variable_size (tree);
|
||||
|
||||
/* Vector types need to check target flags to determine type. */
|
||||
extern machine_mode vector_type_mode (const_tree);
|
||||
|
||||
#endif // GCC_STOR_LAYOUT_H
|
||||
|
44
gcc/tree.c
44
gcc/tree.c
@ -64,6 +64,8 @@ along with GCC; see the file COPYING3. If not see
|
||||
#include "selftest.h"
|
||||
#include "stringpool.h"
|
||||
#include "attribs.h"
|
||||
#include "rtl.h"
|
||||
#include "regs.h"
|
||||
|
||||
/* Tree code classes. */
|
||||
|
||||
@ -12610,9 +12612,47 @@ element_mode (const_tree t)
|
||||
t = TREE_TYPE (t);
|
||||
return TYPE_MODE (t);
|
||||
}
|
||||
|
||||
|
||||
/* Veirfy that basic properties of T match TV and thus T can be a variant of
|
||||
/* Vector types need to re-check the target flags each time we report
|
||||
the machine mode. We need to do this because attribute target can
|
||||
change the result of vector_mode_supported_p and have_regs_of_mode
|
||||
on a per-function basis. Thus the TYPE_MODE of a VECTOR_TYPE can
|
||||
change on a per-function basis. */
|
||||
/* ??? Possibly a better solution is to run through all the types
|
||||
referenced by a function and re-compute the TYPE_MODE once, rather
|
||||
than make the TYPE_MODE macro call a function. */
|
||||
|
||||
machine_mode
|
||||
vector_type_mode (const_tree t)
|
||||
{
|
||||
machine_mode mode;
|
||||
|
||||
gcc_assert (TREE_CODE (t) == VECTOR_TYPE);
|
||||
|
||||
mode = t->type_common.mode;
|
||||
if (VECTOR_MODE_P (mode)
|
||||
&& (!targetm.vector_mode_supported_p (mode)
|
||||
|| !have_regs_of_mode[mode]))
|
||||
{
|
||||
machine_mode innermode = TREE_TYPE (t)->type_common.mode;
|
||||
|
||||
/* For integers, try mapping it to a same-sized scalar mode. */
|
||||
if (GET_MODE_CLASS (innermode) == MODE_INT)
|
||||
{
|
||||
mode = mode_for_size (TYPE_VECTOR_SUBPARTS (t)
|
||||
* GET_MODE_BITSIZE (innermode), MODE_INT, 0);
|
||||
|
||||
if (mode != VOIDmode && have_regs_of_mode[mode])
|
||||
return mode;
|
||||
}
|
||||
|
||||
return BLKmode;
|
||||
}
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
/* Verify that basic properties of T match TV and thus T can be a variant of
|
||||
TV. TV should be the more specified variant (i.e. the main variant). */
|
||||
|
||||
static bool
|
||||
|
@ -1852,7 +1852,8 @@ extern void protected_set_expr_location (tree, location_t);
|
||||
#define SET_TYPE_MODE(NODE, MODE) \
|
||||
(TYPE_CHECK (NODE)->type_common.mode = (MODE))
|
||||
|
||||
extern machine_mode element_mode (const_tree t);
|
||||
extern machine_mode element_mode (const_tree);
|
||||
extern machine_mode vector_type_mode (const_tree);
|
||||
|
||||
/* The "canonical" type for this type node, which is used by frontends to
|
||||
compare the type for equality with another type. If two types are
|
||||
|
Loading…
Reference in New Issue
Block a user