From b5f2d801b10c25ef32a80c03d6df8668920a593c Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 30 Aug 2017 11:09:27 +0000 Subject: [PATCH] [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 Alan Hayward David Sherwood 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 Co-Authored-By: David Sherwood From-SVN: r251460 --- gcc/ChangeLog | 12 ++++++++++++ gcc/builtins.c | 5 +++-- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/mangle.c | 2 +- gcc/fold-const.c | 7 ++++--- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/target-memory.c | 2 +- gcc/hsa-brig.c | 2 +- gcc/objc/ChangeLog | 7 +++++++ gcc/objc/objc-encoding.c | 2 +- gcc/tree-vrp.c | 3 ++- gcc/tree.h | 2 ++ 12 files changed, 48 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 736902bd82a..5ca560ee2b1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2017-08-30 Richard Sandiford + Alan Hayward + David Sherwood + + * 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 Alan Hayward David Sherwood diff --git a/gcc/builtins.c b/gcc/builtins.c index 2f361bfde4b..4cb1d37ddfd 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -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); diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8532f57e91a..fc6231c6659 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2017-08-30 Richard Sandiford + Alan Hayward + David Sherwood + + * mangle.c (write_real_cst): Use SCALAR_FLOAT_TYPE_MODE + instead of TYPE_MODE. + 2017-08-29 Jason Merrill PR c++/81236 - ICE with template-id in generic lambda diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index ce7c0c51f0a..15f442133e6 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -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)); diff --git a/gcc/fold-const.c b/gcc/fold-const.c index de60f681514..27f4f4eb59f 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index fe2d80214a5..6baf74f27bb 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2017-08-30 Richard Sandiford + Alan Hayward + David Sherwood + + * target-memory.c (size_float): Use SCALAR_FLOAT_TYPE_MODE + instead of TYPE_MODE. + 2017-08-30 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/fortran/target-memory.c b/gcc/fortran/target-memory.c index d239cf114e1..1c8de1c59aa 100644 --- a/gcc/fortran/target-memory.c +++ b/gcc/fortran/target-memory.c @@ -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))); } diff --git a/gcc/hsa-brig.c b/gcc/hsa-brig.c index 0f6cac57776..d15ce261ed2 100644 --- a/gcc/hsa-brig.c +++ b/gcc/hsa-brig.c @@ -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]; diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index 0e59ebf65da..8270c92e91e 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,10 @@ +2017-08-30 Richard Sandiford + Alan Hayward + David Sherwood + + * objc-encoding.c (encode_type): Use SCALAR_FLOAT_TYPE_MODE + instead of TYPE_MODE. + 2017-08-30 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/objc/objc-encoding.c b/gcc/objc/objc-encoding.c index fa15c315f1f..bd59a29265e 100644 --- a/gcc/objc/objc-encoding.c +++ b/gcc/objc/objc-encoding.c @@ -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; diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 268969700b6..4da6a2b3863 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -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; diff --git a/gcc/tree.h b/gcc/tree.h index c855a4ccb5d..47dfa38b045 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -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 (TYPE_CHECK (NODE)->type_common.mode)) #define SET_TYPE_MODE(NODE, MODE) \ (TYPE_CHECK (NODE)->type_common.mode = (MODE)) -- 2.30.2