Commit c3496067 by Richard Sandiford Committed by Richard Sandiford

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
parent 1ea85365
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> 2017-08-21 Richard Biener <rguenther@suse.de>
* debug.h (struct gcc_debug_hooks): Add die_ref_for_decl and * debug.h (struct gcc_debug_hooks): Add die_ref_for_decl and
......
...@@ -2494,45 +2494,6 @@ min_align_of_type (tree type) ...@@ -2494,45 +2494,6 @@ min_align_of_type (tree type)
} }
return align / BITS_PER_UNIT; 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. */ /* Create and return a type for signed integers of PRECISION bits. */
......
...@@ -114,7 +114,4 @@ extern void relayout_decl (tree); ...@@ -114,7 +114,4 @@ extern void relayout_decl (tree);
belongs to a function parameter. */ belongs to a function parameter. */
extern tree variable_size (tree); 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 #endif // GCC_STOR_LAYOUT_H
...@@ -64,6 +64,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -64,6 +64,8 @@ along with GCC; see the file COPYING3. If not see
#include "selftest.h" #include "selftest.h"
#include "stringpool.h" #include "stringpool.h"
#include "attribs.h" #include "attribs.h"
#include "rtl.h"
#include "regs.h"
/* Tree code classes. */ /* Tree code classes. */
...@@ -12610,9 +12612,47 @@ element_mode (const_tree t) ...@@ -12610,9 +12612,47 @@ element_mode (const_tree t)
t = TREE_TYPE (t); t = TREE_TYPE (t);
return TYPE_MODE (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). */ TV. TV should be the more specified variant (i.e. the main variant). */
static bool static bool
......
...@@ -1852,7 +1852,8 @@ extern void protected_set_expr_location (tree, location_t); ...@@ -1852,7 +1852,8 @@ extern void protected_set_expr_location (tree, location_t);
#define SET_TYPE_MODE(NODE, MODE) \ #define SET_TYPE_MODE(NODE, MODE) \
(TYPE_CHECK (NODE)->type_common.mode = (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 /* 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 compare the type for equality with another type. If two types are
......
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