When I submitted the back port to allow complex __float128 to be created on the PowerPC to the GCC 6.2 branch, Richard Biener suggested a simpler way to set the complex type: https://gcc.gnu.org/ml/gcc-patches/2016-06/msg01114.html
This patch implements this change for the trunk. I have a companion patch for 6.2 once this goes into the trunk. I bootstrapped the compiler and did a make check with no regressions on a big endian Power 7 system and a little endian Power 8 system. Is it ok to go into the trunk? [gcc] 2016-06-21 Michael Meissner <meiss...@linux.vnet.ibm.com> * stor-layout.c (layout_type): Move setting complex MODE to layout_type, instead of setting it ahead of time by the caller. * tree.c (build_complex_type): Likewise. [gcc/fortran] 2016-06-21 Michael Meissner <meiss...@linux.vnet.ibm.com> * trans-types.c (gfc_build_complex_type): Move setting complex MODE to layout_type, instead of setting it ahead of time by the caller. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.vnet.ibm.com, phone: +1 (978) 899-4797
Index: gcc/stor-layout.c =================================================================== --- gcc/stor-layout.c (revision 237612) +++ gcc/stor-layout.c (working copy) @@ -2146,12 +2146,8 @@ layout_type (tree type) case COMPLEX_TYPE: TYPE_UNSIGNED (type) = TYPE_UNSIGNED (TREE_TYPE (type)); - - /* build_complex_type and fortran's gfc_build_complex_type have set the - expected mode to allow having multiple complex types for multiple - floating point types that have the same size such as the PowerPC with - __ibm128 and __float128. */ - gcc_assert (TYPE_MODE (type) != VOIDmode); + SET_TYPE_MODE (type, + GET_MODE_COMPLEX_MODE (TYPE_MODE (TREE_TYPE (type)))); TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type))); TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE (type))); Index: gcc/tree.c =================================================================== --- gcc/tree.c (revision 237612) +++ gcc/tree.c (working copy) @@ -8783,7 +8783,6 @@ build_complex_type (tree component_type) t = make_node (COMPLEX_TYPE); TREE_TYPE (t) = TYPE_MAIN_VARIANT (component_type); - SET_TYPE_MODE (t, GET_MODE_COMPLEX_MODE (TYPE_MODE (component_type))); /* If we already have such a type, use the old one. */ hstate.add_object (TYPE_HASH (component_type)); Index: gcc/fortran/trans-types.c =================================================================== --- gcc/fortran/trans-types.c (revision 237613) +++ gcc/fortran/trans-types.c (working copy) @@ -828,7 +828,6 @@ gfc_build_complex_type (tree scalar_type new_type = make_node (COMPLEX_TYPE); TREE_TYPE (new_type) = scalar_type; - SET_TYPE_MODE (new_type, GET_MODE_COMPLEX_MODE (TYPE_MODE (scalar_type))); layout_type (new_type); return new_type; }