This patch uses scalar_mode in a few miscellaneous places: - Previous patches mean mode_to_vector can take a scalar_mode without further changes.
- Implicit promotion is limited to scalar types (affects promote_mode and sdbout_parms) 2017-07-13 Richard Sandiford <richard.sandif...@linaro.org> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> gcc/ * machmode.h (mode_for_vector): Take a scalar_mode instead of a machine_mode. * stor-layout.c (mode_for_vector): Likewise. * explow.c (promote_mode): Use as_a <scalar_mode>. * sdbout.c (sdbout_parms): Use is_a <scalar_mode>. Index: gcc/machmode.h =================================================================== --- gcc/machmode.h 2017-07-13 09:18:56.812392104 +0100 +++ gcc/machmode.h 2017-07-13 09:18:59.187223319 +0100 @@ -651,7 +651,7 @@ extern machine_mode bitwise_mode_for_mod /* Return a mode that is suitable for representing a vector, or BLKmode on failure. */ -extern machine_mode mode_for_vector (machine_mode, unsigned); +extern machine_mode mode_for_vector (scalar_mode, unsigned); /* A class for iterating through possible bitfield modes. */ class bit_field_mode_iterator Index: gcc/stor-layout.c =================================================================== --- gcc/stor-layout.c 2017-07-13 09:18:53.998596742 +0100 +++ gcc/stor-layout.c 2017-07-13 09:18:59.187223319 +0100 @@ -478,7 +478,7 @@ bitwise_type_for_mode (machine_mode mode is no suitable mode. */ machine_mode -mode_for_vector (machine_mode innermode, unsigned nunits) +mode_for_vector (scalar_mode innermode, unsigned nunits) { machine_mode mode; Index: gcc/explow.c =================================================================== --- gcc/explow.c 2017-07-13 09:18:54.682546579 +0100 +++ gcc/explow.c 2017-07-13 09:18:59.186223389 +0100 @@ -787,6 +787,7 @@ promote_mode (const_tree type ATTRIBUTE_ #ifdef PROMOTE_MODE enum tree_code code; int unsignedp; + scalar_mode smode; #endif /* For libcalls this is invoked without TYPE from the backends @@ -806,9 +807,11 @@ promote_mode (const_tree type ATTRIBUTE_ { case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: case REAL_TYPE: case OFFSET_TYPE: case FIXED_POINT_TYPE: - PROMOTE_MODE (mode, unsignedp, type); + /* Values of these types always have scalar mode. */ + smode = as_a <scalar_mode> (mode); + PROMOTE_MODE (smode, unsignedp, type); *punsignedp = unsignedp; - return mode; + return smode; #ifdef POINTERS_EXTEND_UNSIGNED case REFERENCE_TYPE: Index: gcc/sdbout.c =================================================================== --- gcc/sdbout.c 2017-02-23 19:54:15.000000000 +0000 +++ gcc/sdbout.c 2017-07-13 09:18:59.187223319 +0100 @@ -1279,11 +1279,15 @@ sdbout_parms (tree parms) the parm with the variable's declared type, and adjust the address if the least significant bytes (which we are using) are not the first ones. */ + scalar_mode from_mode, to_mode; if (BYTES_BIG_ENDIAN - && TREE_TYPE (parms) != DECL_ARG_TYPE (parms)) - current_sym_value += - (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms))) - - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms)))); + && TREE_TYPE (parms) != DECL_ARG_TYPE (parms) + && is_a <scalar_mode> (TYPE_MODE (DECL_ARG_TYPE (parms)), + &from_mode) + && is_a <scalar_mode> (GET_MODE (DECL_RTL (parms)), + &to_mode)) + current_sym_value += (GET_MODE_SIZE (from_mode) + - GET_MODE_SIZE (to_mode)); if (MEM_P (DECL_RTL (parms)) && GET_CODE (XEXP (DECL_RTL (parms), 0)) == PLUS