[9/77] Add SCALAR_FLOAT_TYPE_MODE

This patch adds a macro that extracts the TYPE_MODE and forcibly
converts it to a scalar_float_mode.  The forcible conversion
includes a gcc_checking_assert that the mode is a SCALAR_FLOAT_MODE_P.

This becomes important as more static type checking is added by
later patches.  It has the additional benefit of bypassing the
VECTOR_TYPE_P (...) ? vector_type_mode (...) : ... condition
in TYPE_MODE; in release builds the new macro is a simple
field access.

2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/
	* tree.h (SCALAR_FLOAT_TYPE_MODE): New macro.
	* builtins.c (expand_builtin_signbit): Use it instead of TYPE_MODE.
	* fold-const.c (fold_convert_const_real_from_fixed): Likewise.
	(native_encode_real): Likewise.
	(native_interpret_real): Likewise.
	* hsa-brig.c (emit_immediate_scalar_to_buffer): Likewise.
	* tree-vrp.c (simplify_float_conversion_using_ranges): Likewise.

gcc/cp/
	* mangle.c (write_real_cst): Use SCALAR_FLOAT_TYPE_MODE
	instead of TYPE_MODE.

gcc/fortran/
	* target-memory.c (size_float): Use SCALAR_FLOAT_TYPE_MODE
	instead of TYPE_MODE.

gcc/objc/
	* objc-encoding.c (encode_type): Use SCALAR_FLOAT_TYPE_MODE
	instead of TYPE_MODE.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>

From-SVN: r251460
This commit is contained in:
Richard Sandiford 2017-08-30 11:09:27 +00:00 committed by Richard Sandiford
parent 3205ab28e6
commit b5f2d801b1
12 changed files with 48 additions and 10 deletions

View File

@ -1,3 +1,15 @@
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* tree.h (SCALAR_FLOAT_TYPE_MODE): New macro.
* builtins.c (expand_builtin_signbit): Use it instead of TYPE_MODE.
* fold-const.c (fold_convert_const_real_from_fixed): Likewise.
(native_encode_real): Likewise.
(native_interpret_real): Likewise.
* hsa-brig.c (emit_immediate_scalar_to_buffer): Likewise.
* tree-vrp.c (simplify_float_conversion_using_ranges): Likewise.
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>

View File

@ -5301,7 +5301,8 @@ static rtx
expand_builtin_signbit (tree exp, rtx target)
{
const struct real_format *fmt;
machine_mode fmode, imode, rmode;
scalar_float_mode fmode;
machine_mode imode, rmode;
tree arg;
int word, bitpos;
enum insn_code icode;
@ -5312,7 +5313,7 @@ expand_builtin_signbit (tree exp, rtx target)
return NULL_RTX;
arg = CALL_EXPR_ARG (exp, 0);
fmode = TYPE_MODE (TREE_TYPE (arg));
fmode = SCALAR_FLOAT_TYPE_MODE (TREE_TYPE (arg));
rmode = TYPE_MODE (TREE_TYPE (exp));
fmt = REAL_MODE_FORMAT (fmode);

View File

@ -1,3 +1,10 @@
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* mangle.c (write_real_cst): Use SCALAR_FLOAT_TYPE_MODE
instead of TYPE_MODE.
2017-08-29 Jason Merrill <jason@redhat.com>
PR c++/81236 - ICE with template-id in generic lambda

View File

@ -1788,7 +1788,7 @@ write_real_cst (const tree value)
int i, limit, dir;
tree type = TREE_TYPE (value);
int words = GET_MODE_BITSIZE (TYPE_MODE (type)) / 32;
int words = GET_MODE_BITSIZE (SCALAR_FLOAT_TYPE_MODE (type)) / 32;
real_to_target (target_real, &TREE_REAL_CST (value),
TYPE_MODE (type));

View File

@ -2032,7 +2032,8 @@ fold_convert_const_real_from_fixed (tree type, const_tree arg1)
REAL_VALUE_TYPE value;
tree t;
real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1));
real_convert_from_fixed (&value, SCALAR_FLOAT_TYPE_MODE (type),
&TREE_FIXED_CST (arg1));
t = build_real (type, value);
TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
@ -7057,7 +7058,7 @@ static int
native_encode_real (const_tree expr, unsigned char *ptr, int len, int off)
{
tree type = TREE_TYPE (expr);
int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
int total_bytes = GET_MODE_SIZE (SCALAR_FLOAT_TYPE_MODE (type));
int byte, offset, word, words, bitpos;
unsigned char value;
@ -7302,7 +7303,7 @@ native_interpret_fixed (tree type, const unsigned char *ptr, int len)
static tree
native_interpret_real (tree type, const unsigned char *ptr, int len)
{
machine_mode mode = TYPE_MODE (type);
scalar_float_mode mode = SCALAR_FLOAT_TYPE_MODE (type);
int total_bytes = GET_MODE_SIZE (mode);
unsigned char value;
/* There are always 32 bits in each long, no matter the size of

View File

@ -1,3 +1,10 @@
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* target-memory.c (size_float): Use SCALAR_FLOAT_TYPE_MODE
instead of TYPE_MODE.
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>

View File

@ -46,7 +46,7 @@ size_integer (int kind)
static size_t
size_float (int kind)
{
return GET_MODE_SIZE (TYPE_MODE (gfc_get_real_type (kind)));;
return GET_MODE_SIZE (SCALAR_FLOAT_TYPE_MODE (gfc_get_real_type (kind)));
}

View File

@ -910,7 +910,7 @@ emit_immediate_scalar_to_buffer (tree value, char *data, unsigned need_len)
"operands");
return 2;
}
unsigned int_len = GET_MODE_SIZE (TYPE_MODE (type));
unsigned int_len = GET_MODE_SIZE (SCALAR_FLOAT_TYPE_MODE (type));
/* There are always 32 bits in each long, no matter the size of
the hosts long. */
long tmp[6];

View File

@ -1,3 +1,10 @@
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* objc-encoding.c (encode_type): Use SCALAR_FLOAT_TYPE_MODE
instead of TYPE_MODE.
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>

View File

@ -664,7 +664,7 @@ encode_type (tree type, int curtype, int format)
{
char c;
/* Floating point types. */
switch (GET_MODE_BITSIZE (TYPE_MODE (type)))
switch (GET_MODE_BITSIZE (SCALAR_FLOAT_TYPE_MODE (type)))
{
case 32: c = 'f'; break;
case 64: c = 'd'; break;

View File

@ -10094,7 +10094,8 @@ simplify_float_conversion_using_ranges (gimple_stmt_iterator *gsi,
{
tree rhs1 = gimple_assign_rhs1 (stmt);
value_range *vr = get_value_range (rhs1);
machine_mode fltmode = TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt)));
scalar_float_mode fltmode
= SCALAR_FLOAT_TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt)));
machine_mode mode;
tree tem;
gassign *conv;

View File

@ -1849,6 +1849,8 @@ extern void protected_set_expr_location (tree, location_t);
#define TYPE_MODE(NODE) \
(VECTOR_TYPE_P (TYPE_CHECK (NODE)) \
? vector_type_mode (NODE) : (NODE)->type_common.mode)
#define SCALAR_FLOAT_TYPE_MODE(NODE) \
(as_a <scalar_float_mode> (TYPE_CHECK (NODE)->type_common.mode))
#define SET_TYPE_MODE(NODE, MODE) \
(TYPE_CHECK (NODE)->type_common.mode = (MODE))