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-07-13 Richard Sandiford <richard.sandif...@linaro.org> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@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. Index: gcc/tree.h =================================================================== --- gcc/tree.h 2017-06-30 12:50:37.494697187 +0100 +++ gcc/tree.h 2017-07-13 09:18:24.776086502 +0100 @@ -1852,6 +1852,8 @@ #define TYPE_MODE_RAW(NODE) (TYPE_CHECK #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)) Index: gcc/builtins.c =================================================================== --- gcc/builtins.c 2017-07-13 09:18:21.522430235 +0100 +++ gcc/builtins.c 2017-07-13 09:18:24.772086898 +0100 @@ -5365,7 +5365,8 @@ expand_builtin_adjust_descriptor (tree e 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; @@ -5376,7 +5377,7 @@ expand_builtin_signbit (tree exp, rtx ta 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); Index: gcc/fold-const.c =================================================================== --- gcc/fold-const.c 2017-06-30 12:50:37.496697095 +0100 +++ gcc/fold-const.c 2017-07-13 09:18:24.774086700 +0100 @@ -2040,7 +2040,8 @@ fold_convert_const_real_from_fixed (tree 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); @@ -7145,7 +7146,7 @@ native_encode_fixed (const_tree expr, un 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; @@ -7390,7 +7391,7 @@ native_interpret_fixed (tree type, const 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 Index: gcc/hsa-brig.c =================================================================== --- gcc/hsa-brig.c 2017-06-07 07:42:16.638117371 +0100 +++ gcc/hsa-brig.c 2017-07-13 09:18:24.774086700 +0100 @@ -910,7 +910,7 @@ emit_immediate_scalar_to_buffer (tree va "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]; Index: gcc/tree-vrp.c =================================================================== --- gcc/tree-vrp.c 2017-07-13 09:18:22.943276979 +0100 +++ gcc/tree-vrp.c 2017-07-13 09:18:24.776086502 +0100 @@ -10089,7 +10089,8 @@ simplify_float_conversion_using_ranges ( { 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; Index: gcc/cp/mangle.c =================================================================== --- gcc/cp/mangle.c 2017-07-02 09:32:32.533745269 +0100 +++ gcc/cp/mangle.c 2017-07-13 09:18:24.773086799 +0100 @@ -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)); Index: gcc/fortran/target-memory.c =================================================================== --- gcc/fortran/target-memory.c 2017-02-23 19:54:15.000000000 +0000 +++ gcc/fortran/target-memory.c 2017-07-13 09:18:24.774086700 +0100 @@ -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))); } Index: gcc/objc/objc-encoding.c =================================================================== --- gcc/objc/objc-encoding.c 2017-07-13 09:18:19.145691430 +0100 +++ gcc/objc/objc-encoding.c 2017-07-13 09:18:24.775086601 +0100 @@ -664,7 +664,7 @@ encode_type (tree type, int curtype, int { 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;