diff mbox series

Don't query the frontend for unsupported types

Message ID 87shfhzgwc.fsf@linaro.org
State New
Headers show
Series Don't query the frontend for unsupported types | expand

Commit Message

Richard Sandiford Sept. 20, 2017, 12:36 p.m. UTC
When forcing a constant of mode MODE into memory, force_const_mem
asks the frontend to provide the type associated with that mode.
In principle type_for_mode is allowed to return null, and although
one use site correctly handled that, the other didn't.

I think there's agreement that it's bogus to use type_for_mode for
this kind of thing, since it forces frontends to handle types that
don't exist in that language.  See e.g. http://gcc.gnu.org/PR46805
where the Go frontend was forced to handle vector types even though
Go doesn't have vector types.

Also, the frontends use code like:

  else if (VECTOR_MODE_P (mode))
    {
      machine_mode inner_mode = GET_MODE_INNER (mode);
      tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);
      if (inner_type != NULL_TREE)
        return build_vector_type_for_mode (inner_type, mode);
    }

and there's no guarantee that every vector mode M used by backend
rtl has an associated vector type whose TYPE_MODE is M.  I think
really the type_for_mode hook should only return trees that _do_ have
the requested TYPE_MODE, but PR46805 linked above shows that this is
likely to have too many knock-on consequences.  It doesn't make sense
for force_const_mem to ask about vector modes that aren't valid for
vector types, so this patch handles the condition there instead.

This is needed for SVE multi-register modes, which are modelled as
vector modes but are not usable as vector types.

Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linus-gnu.
OK to install?

Richard


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

gcc/
	* varasm.c (force_const_mem): Don't ask the front end about
	vector modes that are not supported as vector types by the target.

Comments

Richard Biener Sept. 20, 2017, 3:05 p.m. UTC | #1
On September 20, 2017 2:36:03 PM GMT+02:00, Richard Sandiford <richard.sandiford@linaro.org> wrote:
>When forcing a constant of mode MODE into memory, force_const_mem

>asks the frontend to provide the type associated with that mode.

>In principle type_for_mode is allowed to return null, and although

>one use site correctly handled that, the other didn't.

>

>I think there's agreement that it's bogus to use type_for_mode for

>this kind of thing, since it forces frontends to handle types that

>don't exist in that language.  See e.g. http://gcc.gnu.org/PR46805

>where the Go frontend was forced to handle vector types even though

>Go doesn't have vector types.

>

>Also, the frontends use code like:

>

>  else if (VECTOR_MODE_P (mode))

>    {

>      machine_mode inner_mode = GET_MODE_INNER (mode);

>      tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);

>      if (inner_type != NULL_TREE)

>        return build_vector_type_for_mode (inner_type, mode);

>    }

>

>and there's no guarantee that every vector mode M used by backend

>rtl has an associated vector type whose TYPE_MODE is M.  I think

>really the type_for_mode hook should only return trees that _do_ have

>the requested TYPE_MODE, but PR46805 linked above shows that this is

>likely to have too many knock-on consequences.  It doesn't make sense

>for force_const_mem to ask about vector modes that aren't valid for

>vector types, so this patch handles the condition there instead.

>

>This is needed for SVE multi-register modes, which are modelled as

>vector modes but are not usable as vector types.

>

>Tested on aarch64-linux-gnu, x86_64-linux-gnu and

>powerpc64le-linus-gnu.

>OK to install?


I think we should get rid of the use entirely. 

Richard. 

>Richard

>

>

>2017-09-20  Richard Sandiford  <richard.sandiford@linaro.org>

>	    Alan Hayward  <alan.hayward@arm.com>

>	    David Sherwood  <david.sherwood@arm.com>

>

>gcc/

>	* varasm.c (force_const_mem): Don't ask the front end about

>	vector modes that are not supported as vector types by the target.

>

>Index: gcc/varasm.c

>===================================================================

>--- gcc/varasm.c	2017-09-12 14:28:56.402824780 +0100

>+++ gcc/varasm.c	2017-09-20 13:33:15.942547232 +0100

>@@ -3785,10 +3785,17 @@ force_const_mem (machine_mode mode, rtx

>   desc = ggc_alloc<constant_descriptor_rtx> ();

>   *slot = desc;

> 

>+  tree type = NULL_TREE;

>+  if (mode != VOIDmode

>+      /* Don't ask the frontend about vector modes if there cannot be

>a

>+	 VECTOR_TYPE whose TYPE_MODE is MODE.  */

>+      && (!VECTOR_MODE_P (mode)

>+	  || targetm.vector_mode_supported_p (mode)))

>+    type = lang_hooks.types.type_for_mode (mode, 0);

>+

>   /* Align the location counter as required by EXP's data type.  */

>   align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);

> 

>-  tree type = lang_hooks.types.type_for_mode (mode, 0);

>   if (type != NULL_TREE)

>     align = CONSTANT_ALIGNMENT (make_tree (type, x), align);

> 

>@@ -3832,7 +3839,8 @@ force_const_mem (machine_mode mode, rtx

> 

>   /* Construct the MEM.  */

>   desc->mem = def = gen_const_mem (mode, symbol);

>-  set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0),

>1);

>+  if (type)

>+    set_mem_attributes (def, type, 1);

>   set_mem_align (def, align);

> 

>   /* If we're dropping a label to the constant pool, make sure we
Richard Sandiford Sept. 21, 2017, 12:56 p.m. UTC | #2
Richard Biener <richard.guenther@gmail.com> writes:
> On September 20, 2017 2:36:03 PM GMT+02:00, Richard Sandiford

> <richard.sandiford@linaro.org> wrote:

>>When forcing a constant of mode MODE into memory, force_const_mem

>>asks the frontend to provide the type associated with that mode.

>>In principle type_for_mode is allowed to return null, and although

>>one use site correctly handled that, the other didn't.

>>

>>I think there's agreement that it's bogus to use type_for_mode for

>>this kind of thing, since it forces frontends to handle types that

>>don't exist in that language.  See e.g. http://gcc.gnu.org/PR46805

>>where the Go frontend was forced to handle vector types even though

>>Go doesn't have vector types.

>>

>>Also, the frontends use code like:

>>

>>  else if (VECTOR_MODE_P (mode))

>>    {

>>      machine_mode inner_mode = GET_MODE_INNER (mode);

>>      tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);

>>      if (inner_type != NULL_TREE)

>>        return build_vector_type_for_mode (inner_type, mode);

>>    }

>>

>>and there's no guarantee that every vector mode M used by backend

>>rtl has an associated vector type whose TYPE_MODE is M.  I think

>>really the type_for_mode hook should only return trees that _do_ have

>>the requested TYPE_MODE, but PR46805 linked above shows that this is

>>likely to have too many knock-on consequences.  It doesn't make sense

>>for force_const_mem to ask about vector modes that aren't valid for

>>vector types, so this patch handles the condition there instead.

>>

>>This is needed for SVE multi-register modes, which are modelled as

>>vector modes but are not usable as vector types.

>>

>>Tested on aarch64-linux-gnu, x86_64-linux-gnu and

>>powerpc64le-linus-gnu.

>>OK to install?

>

> I think we should get rid of the use entirely.


I first read this as not using type_for_mode at all in force_const_mem,
which sounded like a good thing :-)  I tried it overnight on the usual
at-least-one-target-per-CPU set and diffing the before and after
assembly for the testsuite.  And it looks like i686 relies on this
to get an alignment of 16 rather than 4 for XFmode constants:
GET_MODE_ALIGNMENT (XFmode) == 32 (as requested by i386-modes.def),
but i386's CONSTANT_ALIGNMENT increases it to 128 for static constants.

But now I wonder if you meant we should just get rid of:

  set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);

and keep the other call to type_for_mode, as below.

Thanks,
Richard


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

gcc/
	* varasm.c (force_const_mem): Don't ask the front end about
	vector modes that are not supported as vector types by the target.
	Remove call to set_mem_attributes.

Index: gcc/varasm.c
===================================================================
--- gcc/varasm.c	2017-09-21 11:17:14.726201207 +0100
+++ gcc/varasm.c	2017-09-21 13:54:22.209159021 +0100
@@ -3785,10 +3785,17 @@ force_const_mem (machine_mode mode, rtx
   desc = ggc_alloc<constant_descriptor_rtx> ();
   *slot = desc;
 
+  tree type = NULL_TREE;
+  if (mode != VOIDmode
+      /* Don't ask the frontend about vector modes if there cannot be a
+	 VECTOR_TYPE whose TYPE_MODE is MODE.  */
+      && (!VECTOR_MODE_P (mode)
+	  || targetm.vector_mode_supported_p (mode)))
+    type = lang_hooks.types.type_for_mode (mode, 0);
+
   /* Align the location counter as required by EXP's data type.  */
   align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
 
-  tree type = lang_hooks.types.type_for_mode (mode, 0);
   if (type != NULL_TREE)
     align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
 
@@ -3832,7 +3839,6 @@ force_const_mem (machine_mode mode, rtx
 
   /* Construct the MEM.  */
   desc->mem = def = gen_const_mem (mode, symbol);
-  set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
   set_mem_align (def, align);
 
   /* If we're dropping a label to the constant pool, make sure we
Richard Biener Sept. 21, 2017, 3:03 p.m. UTC | #3
On Thu, Sep 21, 2017 at 2:56 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> Richard Biener <richard.guenther@gmail.com> writes:

>> On September 20, 2017 2:36:03 PM GMT+02:00, Richard Sandiford

>> <richard.sandiford@linaro.org> wrote:

>>>When forcing a constant of mode MODE into memory, force_const_mem

>>>asks the frontend to provide the type associated with that mode.

>>>In principle type_for_mode is allowed to return null, and although

>>>one use site correctly handled that, the other didn't.

>>>

>>>I think there's agreement that it's bogus to use type_for_mode for

>>>this kind of thing, since it forces frontends to handle types that

>>>don't exist in that language.  See e.g. http://gcc.gnu.org/PR46805

>>>where the Go frontend was forced to handle vector types even though

>>>Go doesn't have vector types.

>>>

>>>Also, the frontends use code like:

>>>

>>>  else if (VECTOR_MODE_P (mode))

>>>    {

>>>      machine_mode inner_mode = GET_MODE_INNER (mode);

>>>      tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);

>>>      if (inner_type != NULL_TREE)

>>>        return build_vector_type_for_mode (inner_type, mode);

>>>    }

>>>

>>>and there's no guarantee that every vector mode M used by backend

>>>rtl has an associated vector type whose TYPE_MODE is M.  I think

>>>really the type_for_mode hook should only return trees that _do_ have

>>>the requested TYPE_MODE, but PR46805 linked above shows that this is

>>>likely to have too many knock-on consequences.  It doesn't make sense

>>>for force_const_mem to ask about vector modes that aren't valid for

>>>vector types, so this patch handles the condition there instead.

>>>

>>>This is needed for SVE multi-register modes, which are modelled as

>>>vector modes but are not usable as vector types.

>>>

>>>Tested on aarch64-linux-gnu, x86_64-linux-gnu and

>>>powerpc64le-linus-gnu.

>>>OK to install?

>>

>> I think we should get rid of the use entirely.

>

> I first read this as not using type_for_mode at all in force_const_mem,

> which sounded like a good thing :-)


That's what I meant ;)  A mode doesn't really have a type...

  I tried it overnight on the usual
> at-least-one-target-per-CPU set and diffing the before and after

> assembly for the testsuite.  And it looks like i686 relies on this

> to get an alignment of 16 rather than 4 for XFmode constants:

> GET_MODE_ALIGNMENT (XFmode) == 32 (as requested by i386-modes.def),

> but i386's CONSTANT_ALIGNMENT increases it to 128 for static constants.


Then the issue is that CONSTANT_ALIGNMENT takes a tree and not a mode...
even worse than type_for_mode is a use of make_tree!  Incidentially
ix86_constant_alignment _does_ look at the mode in the end...

> But now I wonder if you meant we should just get rid of:

>

>   set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);

>

> and keep the other call to type_for_mode, as below.


Well, that one is easy to remove indeed.  I think assigning an alias-set
based on the mode of a constant is bogus anyway.

Richard.

> Thanks,

> Richard

>

>

> 2017-09-21  Richard Sandiford  <richard.sandiford@linaro.org>

>             Alan Hayward  <alan.hayward@arm.com>

>             David Sherwood  <david.sherwood@arm.com>

>

> gcc/

>         * varasm.c (force_const_mem): Don't ask the front end about

>         vector modes that are not supported as vector types by the target.

>         Remove call to set_mem_attributes.

>

> Index: gcc/varasm.c

> ===================================================================

> --- gcc/varasm.c        2017-09-21 11:17:14.726201207 +0100

> +++ gcc/varasm.c        2017-09-21 13:54:22.209159021 +0100

> @@ -3785,10 +3785,17 @@ force_const_mem (machine_mode mode, rtx

>    desc = ggc_alloc<constant_descriptor_rtx> ();

>    *slot = desc;

>

> +  tree type = NULL_TREE;

> +  if (mode != VOIDmode

> +      /* Don't ask the frontend about vector modes if there cannot be a

> +        VECTOR_TYPE whose TYPE_MODE is MODE.  */

> +      && (!VECTOR_MODE_P (mode)

> +         || targetm.vector_mode_supported_p (mode)))

> +    type = lang_hooks.types.type_for_mode (mode, 0);

> +

>    /* Align the location counter as required by EXP's data type.  */

>    align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);

>

> -  tree type = lang_hooks.types.type_for_mode (mode, 0);

>    if (type != NULL_TREE)

>      align = CONSTANT_ALIGNMENT (make_tree (type, x), align);

>

> @@ -3832,7 +3839,6 @@ force_const_mem (machine_mode mode, rtx

>

>    /* Construct the MEM.  */

>    desc->mem = def = gen_const_mem (mode, symbol);

> -  set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);

>    set_mem_align (def, align);

>

>    /* If we're dropping a label to the constant pool, make sure we
Richard Sandiford Sept. 22, 2017, 4:42 p.m. UTC | #4
Richard Biener <richard.guenther@gmail.com> writes:
> On Thu, Sep 21, 2017 at 2:56 PM, Richard Sandiford

> <richard.sandiford@linaro.org> wrote:

>> Richard Biener <richard.guenther@gmail.com> writes:

>>> On September 20, 2017 2:36:03 PM GMT+02:00, Richard Sandiford

>>> <richard.sandiford@linaro.org> wrote:

>>>>When forcing a constant of mode MODE into memory, force_const_mem

>>>>asks the frontend to provide the type associated with that mode.

>>>>In principle type_for_mode is allowed to return null, and although

>>>>one use site correctly handled that, the other didn't.

>>>>

>>>>I think there's agreement that it's bogus to use type_for_mode for

>>>>this kind of thing, since it forces frontends to handle types that

>>>>don't exist in that language.  See e.g. http://gcc.gnu.org/PR46805

>>>>where the Go frontend was forced to handle vector types even though

>>>>Go doesn't have vector types.

>>>>

>>>>Also, the frontends use code like:

>>>>

>>>>  else if (VECTOR_MODE_P (mode))

>>>>    {

>>>>      machine_mode inner_mode = GET_MODE_INNER (mode);

>>>>      tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);

>>>>      if (inner_type != NULL_TREE)

>>>>        return build_vector_type_for_mode (inner_type, mode);

>>>>    }

>>>>

>>>>and there's no guarantee that every vector mode M used by backend

>>>>rtl has an associated vector type whose TYPE_MODE is M.  I think

>>>>really the type_for_mode hook should only return trees that _do_ have

>>>>the requested TYPE_MODE, but PR46805 linked above shows that this is

>>>>likely to have too many knock-on consequences.  It doesn't make sense

>>>>for force_const_mem to ask about vector modes that aren't valid for

>>>>vector types, so this patch handles the condition there instead.

>>>>

>>>>This is needed for SVE multi-register modes, which are modelled as

>>>>vector modes but are not usable as vector types.

>>>>

>>>>Tested on aarch64-linux-gnu, x86_64-linux-gnu and

>>>>powerpc64le-linus-gnu.

>>>>OK to install?

>>>

>>> I think we should get rid of the use entirely.

>>

>> I first read this as not using type_for_mode at all in force_const_mem,

>> which sounded like a good thing :-)

>

> That's what I meant ;)  A mode doesn't really have a type...

>

>   I tried it overnight on the usual

>> at-least-one-target-per-CPU set and diffing the before and after

>> assembly for the testsuite.  And it looks like i686 relies on this

>> to get an alignment of 16 rather than 4 for XFmode constants:

>> GET_MODE_ALIGNMENT (XFmode) == 32 (as requested by i386-modes.def),

>> but i386's CONSTANT_ALIGNMENT increases it to 128 for static constants.

>

> Then the issue is that CONSTANT_ALIGNMENT takes a tree and not a mode...

> even worse than type_for_mode is a use of make_tree!  Incidentially

> ix86_constant_alignment _does_ look at the mode in the end...


OK, I guess this means another target hook conversion.  The patch
below converts CONSTANT_ALIGNMENT with its current interface.
The definition:

  #define CONSTANT_ALIGNMENT(EXP, ALIGN) \
    (TREE_CODE (EXP) == STRING_CST \
     && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

was very common, so the patch adds a canned definition for that,
called constant_alignment_word_strings.  Some ports had a variation
that used a port-local FASTEST_ALIGNMENT instead of BITS_PER_WORD;
the patch uses constant_alignment_word_strings if FASTEST_ALIGNMENT
was always BITS_PER_WORD and a port-local hook function otherwise.

Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.
Also tested by comparing the testsuite assembly output on at least one
target per CPU directory.  I don't think this comes under Jeff's
preapproval due to the constant_alignment_word_strings thing, so:
OK to install?

If so, then I'll follow up with a separate hook for rtl modes, which
varasm, default_constant_alignment and constant_alignment_word_strings
can all use.

Thanks,
Richard


2017-09-22  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
	* target.def (constant_alignment): New hook.
	* defaults.h (CONSTANT_ALIGNMENT): Delete.
	* doc/tm.texi.in (CONSTANT_ALIGNMENT): Replace with...
	(TARGET_CONSTANT_ALIGNMENT): ...this new hook.
	* doc/tm.texi: Regenerate.
	* targhooks.h (default_constant_alignment): Declare.
	(constant_alignment_word_strings): Likewise.
	* targhooks.c (default_constant_alignment): New function.
	(constant_alignment_word_strings): Likewise.
	* builtins.c (get_object_alignment_2): Use targetm.constant_alignment
	instead of CONSTANT_ALIGNMENT.
	* varasm.c (align_variable, get_variable_align, build_constant_desc)
	(force_const_mem): Likewise.
	* config/aarch64/aarch64.h (CONSTANT_ALIGNMENT): Delete.
	* config/aarch64/aarch64.c (aarch64_constant_alignment): New function.
	(aarch64_classify_address): Call it instead of CONSTANT_ALIGNMENT.
	(TARGET_CONSTANT_ALIGNMENT): Redefine.
	* config/alpha/alpha.h (CONSTANT_ALIGNMENT): Delete commented-out
	definition.
	* config/arc/arc.h (CONSTANT_ALIGNMENT): Delete.
	* config/arc/arc.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/arm/arm.h (CONSTANT_ALIGNMENT_FACTOR): Delete.
	(CONSTANT_ALIGNMENT): Likewise.
	* config/arm/arm.c (TARGET_CONSTANT_ALIGNMENT): Redefine.
	(arm_constant_alignment): New function.
	* config/bfin/bfin.h (CONSTANT_ALIGNMENT): Delete.
	* config/bfin/bfin.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/cr16/cr16.h (CONSTANT_ALIGNMENT): Delete.
	* config/cr16/cr16.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/cris/cris.h (CONSTANT_ALIGNMENT): Delete.
	* config/cris/cris.c (TARGET_CONSTANT_ALIGNMENT): Redefine.
	(cris_constant_alignment): New function.
	* config/epiphany/epiphany.h (CONSTANT_ALIGNMENT): Delete.
	* config/epiphany/epiphany.c (TARGET_CONSTANT_ALIGNMENT): Redefine.
	(epiphany_constant_alignment): New function.
	* config/fr30/fr30.h (CONSTANT_ALIGNMENT): Delete.
	* config/fr30/fr30.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/frv/frv.h (CONSTANT_ALIGNMENT): Delete.
	* config/frv/frv.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/ft32/ft32.h (CONSTANT_ALIGNMENT): Delete.
	* config/ft32/ft32.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/i386/i386.h (CONSTANT_ALIGNMENT): Delete.
	* config/i386/i386-protos.h (ix86_constant_alignment): Delete.
	* config/i386/i386.c (ix86_constant_alignment): Make static.
	Use the same interface as the target hook.
	(TARGET_CONSTANT_ALIGNMENT): Redefine.
	* config/ia64/ia64.h (CONSTANT_ALIGNMENT): Delete.
	* config/ia64/ia64.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/iq2000/iq2000.h (CONSTANT_ALIGNMENT): Delete.
	* config/iq2000/iq2000.c (iq2000_constant_alignment): New function.
	(TARGET_CONSTANT_ALIGNMENT): Redefine.
	* config/lm32/lm32.h (CONSTANT_ALIGNMENT): Delete.
	* config/lm32/lm32.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/m32r/m32r.h (CONSTANT_ALIGNMENT): Delete.
	* config/m32r/m32r.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/mcore/mcore.h (CONSTANT_ALIGNMENT): Delete.
	* config/mcore/mcore.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/microblaze/microblaze.h (CONSTANT_ALIGNMENT): Delete.
	* config/microblaze/microblaze.c (microblaze_constant_alignment):
	New function.
	(TARGET_CONSTANT_ALIGNMENT): Redefine.
	* config/mips/mips.h (CONSTANT_ALIGNMENT): Delete.
	* config/mips/mips.c (mips_constant_alignment): New function.
	(TARGET_CONSTANT_ALIGNMENT): Redefine.
	* config/mmix/mmix.h (CONSTANT_ALIGNMENT): Delete.
	* config/mmix/mmix-protos.h (mmix_constant_alignment): Delete.
	* config/mmix/mmix.c (TARGET_CONSTANT_ALIGNMENT): Redefine.
	(mmix_constant_alignment): Make static.  Use the same interface
	as the target hook.
	* config/moxie/moxie.h (CONSTANT_ALIGNMENT): Delete.
	* config/moxie/moxie.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/nios2/nios2.h (CONSTANT_ALIGNMENT): Delete.
	* config/nios2/nios2.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/pa/pa.h (CONSTANT_ALIGNMENT): Delete.
	* config/pa/pa.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/powerpcspe/powerpcspe.h (CONSTANT_ALIGNMENT): Delete.
	* config/powerpcspe/powerpcspe.c (TARGET_CONSTANT_ALIGNMENT): Redefine.
	(rs6000_constant_alignment): New function.
	* config/riscv/riscv.h (CONSTANT_ALIGNMENT): Delete.
	* config/riscv/riscv.c (riscv_constant_alignment): New function.
	(TARGET_CONSTANT_ALIGNMENT): Redefine.
	* config/rs6000/rs6000.h (CONSTANT_ALIGNMENT): Delete.
	* config/rs6000/rs6000.c (TARGET_CONSTANT_ALIGNMENT): Redefine.
	(rs6000_constant_alignment): New function.
	* config/s390/s390.h (CONSTANT_ALIGNMENT): Delete.
	* config/s390/s390.c (s390_constant_alignment): New function.
	(TARGET_CONSTANT_ALIGNMENT): Redefine.
	* config/sh/sh.h (CONSTANT_ALIGNMENT): Delete.
	* config/sh/sh.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/sparc/sparc.h (CONSTANT_ALIGNMENT): Delete.
	* config/sparc/sparc.c (TARGET_CONSTANT_ALIGNMENT): Redefine.
	(sparc_constant_alignment): New function.
	* config/spu/spu.h (CONSTANT_ALIGNMENT): Delete.
	* config/spu/spu.c (spu_constant_alignment): New function.
	(TARGET_CONSTANT_ALIGNMENT): Redefine.
	* config/stormy16/stormy16.h (CONSTANT_ALIGNMENT): Delete.
	* config/stormy16/stormy16.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/tilegx/tilegx.h (CONSTANT_ALIGNMENT): Delete.
	* config/tilegx/tilegx.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/tilepro/tilepro.h (CONSTANT_ALIGNMENT): Delete.
	* config/tilepro/tilepro.c (TARGET_CONSTANT_ALIGNMENT): Redefine to
	constant_alignment_word_strings.
	* config/visium/visium.h (CONSTANT_ALIGNMENT): Delete.
	* config/visium/visium.c (TARGET_CONSTANT_ALIGNMENT): Redefine.
	(visium_constant_alignment): New function.
	* config/xtensa/xtensa.h (CONSTANT_ALIGNMENT): Delete.
	* config/xtensa/xtensa.c (TARGET_CONSTANT_ALIGNMENT): Redefine.
	(xtensa_constant_alignment): New function.
	* system.h (CONSTANT_ALIGNMENT): Poison.

Index: gcc/target.def
===================================================================
--- gcc/target.def	2017-09-22 17:31:56.428954480 +0100
+++ gcc/target.def	2017-09-22 17:37:26.791614385 +0100
@@ -3335,6 +3335,21 @@ HOOK_VECTOR_END (addr_space)
 #undef HOOK_PREFIX
 #define HOOK_PREFIX "TARGET_"
 
+DEFHOOK
+(constant_alignment,
+ "This hook returns the alignment in bits of a constant that is being\n\
+placed in memory.  @var{constant} is the constant and @var{basic_align}\n\
+is the alignment that the object would ordinarily have.\n\
+\n\
+The default definition just returns @var{basic_align}.\n\
+\n\
+The typical use of this hook is to increase alignment for string\n\
+constants to be word aligned so that @code{strcpy} calls that copy\n\
+constants can be done inline.  The function\n\
+@code{constant_alignment_word_strings} provides such a definition.",
+ HOST_WIDE_INT, (const_tree constant, HOST_WIDE_INT basic_align),
+ default_constant_alignment)
+
 /* True if MODE is valid for the target.  By "valid", we mean able to
    be manipulated in non-trivial ways.  In particular, this means all
    the arithmetic is supported.  */
Index: gcc/defaults.h
===================================================================
--- gcc/defaults.h	2017-09-12 14:27:14.524325620 +0100
+++ gcc/defaults.h	2017-09-22 17:37:26.788614385 +0100
@@ -1265,10 +1265,6 @@ #define WORD_REGISTER_OPERATIONS 0
 #define LOAD_EXTEND_OP(M) UNKNOWN
 #endif
 
-#ifndef CONSTANT_ALIGNMENT
-#define CONSTANT_ALIGNMENT(EXP, ALIGN) ALIGN
-#endif
-
 #ifndef INITIAL_FRAME_ADDRESS_RTX
 #define INITIAL_FRAME_ADDRESS_RTX NULL
 #endif
Index: gcc/doc/tm.texi.in
===================================================================
--- gcc/doc/tm.texi.in	2017-09-22 17:31:36.934389276 +0100
+++ gcc/doc/tm.texi.in	2017-09-22 17:37:26.790614385 +0100
@@ -1050,19 +1050,7 @@ must be aligned to 16 byte boundaries.
 If this macro is not defined, then @var{basic-align} is used.
 @end defmac
 
-@defmac CONSTANT_ALIGNMENT (@var{constant}, @var{basic-align})
-If defined, a C expression to compute the alignment given to a constant
-that is being placed in memory.  @var{constant} is the constant and
-@var{basic-align} is the alignment that the object would ordinarily
-have.  The value of this macro is used instead of that alignment to
-align the object.
-
-The default definition just returns @var{basic-align}.
-
-The typical use of this macro is to increase alignment for string
-constants to be word aligned so that @code{strcpy} calls that copy
-constants can be done inline.
-@end defmac
+@hook TARGET_CONSTANT_ALIGNMENT
 
 @defmac LOCAL_ALIGNMENT (@var{type}, @var{basic-align})
 If defined, a C expression to compute the alignment for a variable in
Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi	2017-09-22 17:31:56.428006577 +0100
+++ gcc/doc/tm.texi	2017-09-22 17:37:26.789614385 +0100
@@ -1102,19 +1102,18 @@ must be aligned to 16 byte boundaries.
 If this macro is not defined, then @var{basic-align} is used.
 @end defmac
 
-@defmac CONSTANT_ALIGNMENT (@var{constant}, @var{basic-align})
-If defined, a C expression to compute the alignment given to a constant
-that is being placed in memory.  @var{constant} is the constant and
-@var{basic-align} is the alignment that the object would ordinarily
-have.  The value of this macro is used instead of that alignment to
-align the object.
+@deftypefn {Target Hook} HOST_WIDE_INT TARGET_CONSTANT_ALIGNMENT (const_tree @var{constant}, HOST_WIDE_INT @var{basic_align})
+This hook returns the alignment in bits of a constant that is being
+placed in memory.  @var{constant} is the constant and @var{basic_align}
+is the alignment that the object would ordinarily have.
 
-The default definition just returns @var{basic-align}.
+The default definition just returns @var{basic_align}.
 
-The typical use of this macro is to increase alignment for string
+The typical use of this hook is to increase alignment for string
 constants to be word aligned so that @code{strcpy} calls that copy
-constants can be done inline.
-@end defmac
+constants can be done inline.  The function
+@code{constant_alignment_word_strings} provides such a definition.
+@end deftypefn
 
 @defmac LOCAL_ALIGNMENT (@var{type}, @var{basic-align})
 If defined, a C expression to compute the alignment for a variable in
Index: gcc/targhooks.h
===================================================================
--- gcc/targhooks.h	2017-09-22 17:31:36.935337179 +0100
+++ gcc/targhooks.h	2017-09-22 17:37:26.791614385 +0100
@@ -93,6 +93,9 @@ extern int default_builtin_vectorization
 
 extern tree default_builtin_reciprocal (tree);
 
+extern HOST_WIDE_INT default_constant_alignment (const_tree, HOST_WIDE_INT);
+extern HOST_WIDE_INT constant_alignment_word_strings (const_tree,
+						      HOST_WIDE_INT);
 extern HOST_WIDE_INT default_vector_alignment (const_tree);
 
 extern HOST_WIDE_INT default_preferred_vector_alignment (const_tree);
Index: gcc/targhooks.c
===================================================================
--- gcc/targhooks.c	2017-09-22 17:31:36.935337179 +0100
+++ gcc/targhooks.c	2017-09-22 17:37:26.791614385 +0100
@@ -1165,6 +1165,25 @@ tree default_mangle_decl_assembler_name
    return id;
 }
 
+/* The default implementation of TARGET_CONSTANT_ALIGNMENT.  */
+
+HOST_WIDE_INT
+default_constant_alignment (const_tree, HOST_WIDE_INT align)
+{
+  return align;
+}
+
+/* An implementation of TARGET_CONSTANT_ALIGNMENT that aligns strings
+   to at least BITS_PER_WORD but otherwise makes no changes.  */
+
+HOST_WIDE_INT
+constant_alignment_word_strings (const_tree exp, HOST_WIDE_INT align)
+{
+  if (TREE_CODE (exp) == STRING_CST)
+    return MAX (align, BITS_PER_WORD);
+  return align;
+}
+
 /* Default to natural alignment for vector types.  */
 HOST_WIDE_INT
 default_vector_alignment (const_tree type)
Index: gcc/builtins.c
===================================================================
--- gcc/builtins.c	2017-09-05 20:56:49.744887619 +0100
+++ gcc/builtins.c	2017-09-22 17:37:26.746614388 +0100
@@ -283,7 +283,7 @@ get_object_alignment_2 (tree exp, unsign
       exp = DECL_INITIAL (exp);
       align = TYPE_ALIGN (TREE_TYPE (exp));
       if (CONSTANT_CLASS_P (exp))
-	align = (unsigned) CONSTANT_ALIGNMENT (exp, align);
+	align = targetm.constant_alignment (exp, align);
 
       known_alignment = true;
     }
@@ -359,7 +359,7 @@ get_object_alignment_2 (tree exp, unsign
          wrapped inside a CONST_DECL.  */
       align = TYPE_ALIGN (TREE_TYPE (exp));
       if (CONSTANT_CLASS_P (exp))
-	align = (unsigned) CONSTANT_ALIGNMENT (exp, align);
+	align = targetm.constant_alignment (exp, align);
 
       known_alignment = true;
     }
Index: gcc/varasm.c
===================================================================
--- gcc/varasm.c	2017-09-21 22:34:52.782138953 +0100
+++ gcc/varasm.c	2017-09-22 17:37:26.792614385 +0100
@@ -1055,7 +1055,7 @@ align_variable (tree decl, bool dont_out
 	      && (in_lto_p || DECL_INITIAL (decl) != error_mark_node))
 	    {
 	      unsigned int const_align
-		= CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
+		= targetm.constant_alignment (DECL_INITIAL (decl), align);
 	      /* Don't increase alignment too much for TLS variables - TLS
 		 space is too precious.  */
 	      if (! DECL_THREAD_LOCAL_P (decl) || const_align <= BITS_PER_WORD)
@@ -1106,8 +1106,8 @@ get_variable_align (tree decl)
 	     to mark offlined constructors.  */
 	  && (in_lto_p || DECL_INITIAL (decl) != error_mark_node))
 	{
-	  unsigned int const_align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl),
-							 align);
+	  unsigned int const_align
+	    = targetm.constant_alignment (DECL_INITIAL (decl), align);
 	  /* Don't increase alignment too much for TLS variables - TLS space
 	     is too precious.  */
 	  if (! DECL_THREAD_LOCAL_P (decl) || const_align <= BITS_PER_WORD)
@@ -3326,12 +3326,10 @@ build_constant_desc (tree exp)
      Instead we set the flag that will be recognized in make_decl_rtl.  */
   DECL_IN_CONSTANT_POOL (decl) = 1;
   DECL_INITIAL (decl) = desc->value;
-  /* ??? CONSTANT_ALIGNMENT hasn't been updated for vector types on most
-     architectures so use DATA_ALIGNMENT as well, except for strings.  */
+  /* ??? targetm.constant_alignment hasn't been updated for vector types on
+     most architectures so use DATA_ALIGNMENT as well, except for strings.  */
   if (TREE_CODE (exp) == STRING_CST)
-    {
-      SET_DECL_ALIGN (decl, CONSTANT_ALIGNMENT (exp, DECL_ALIGN (decl)));
-    }
+    SET_DECL_ALIGN (decl, targetm.constant_alignment (exp, DECL_ALIGN (decl)));
   else
     align_variable (decl, 0);
 
@@ -3790,7 +3788,7 @@ force_const_mem (machine_mode mode, rtx
 
   tree type = lang_hooks.types.type_for_mode (mode, 0);
   if (type != NULL_TREE)
-    align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
+    align = targetm.constant_alignment (make_tree (type, x), align);
 
   pool->offset += (align / BITS_PER_UNIT) - 1;
   pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
Index: gcc/config/aarch64/aarch64.h
===================================================================
--- gcc/config/aarch64/aarch64.h	2017-09-21 22:35:16.977238356 +0100
+++ gcc/config/aarch64/aarch64.h	2017-09-22 17:37:26.747614388 +0100
@@ -90,14 +90,6 @@ #define LONG_DOUBLE_TYPE_SIZE	128
    port.  */
 #define TARGET_PTRMEMFUNC_VBIT_LOCATION ptrmemfunc_vbit_in_delta
 
-/* Make strings word-aligned so that strcpy from constants will be
-   faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)		\
-  ((TREE_CODE (EXP) == STRING_CST		\
-    && !optimize_size				\
-    && (ALIGN) < BITS_PER_WORD)			\
-   ? BITS_PER_WORD : ALIGN)
-
 /* Align definitions of arrays, unions and structures so that
    initializations and copies can be made more efficient.  This is not
    ABI-changing, so it only affects places where we can see the
Index: gcc/config/aarch64/aarch64.c
===================================================================
--- gcc/config/aarch64/aarch64.c	2017-09-22 17:35:22.483794044 +0100
+++ gcc/config/aarch64/aarch64.c	2017-09-22 17:37:26.747614388 +0100
@@ -1142,6 +1142,17 @@ aarch64_hard_regno_caller_save_mode (uns
     return choose_hard_reg_mode (regno, nregs, false);
 }
 
+/* Implement TARGET_CONSTANT_ALIGNMENT.  Make strings word-aligned so
+   that strcpy from constants will be faster.  */
+
+static HOST_WIDE_INT
+aarch64_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  if (TREE_CODE (exp) == STRING_CST && !optimize_size)
+    return MAX (align, BITS_PER_WORD);
+  return align;
+}
+
 /* Return true if calls to DECL should be treated as
    long-calls (ie called via a register).  */
 static bool
@@ -4622,7 +4633,7 @@ aarch64_classify_address (struct aarch64
 		{
 		  tree exp = SYMBOL_REF_DECL (sym);
 		  align = TYPE_ALIGN (TREE_TYPE (exp));
-		  align = CONSTANT_ALIGNMENT (exp, align);
+		  align = aarch64_constant_alignment (exp, align);
 		}
 	      else if (SYMBOL_REF_DECL (sym))
 		align = DECL_ALIGN (SYMBOL_REF_DECL (sym));
@@ -15687,6 +15698,9 @@ #define TARGET_MODES_TIEABLE_P aarch64_m
 #define TARGET_HARD_REGNO_CALL_PART_CLOBBERED \
   aarch64_hard_regno_call_part_clobbered
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT aarch64_constant_alignment
+
 #if CHECKING_P
 #undef TARGET_RUN_TARGET_SELFTESTS
 #define TARGET_RUN_TARGET_SELFTESTS selftest::aarch64_run_selftests
Index: gcc/config/alpha/alpha.h
===================================================================
--- gcc/config/alpha/alpha.h	2017-09-15 14:47:33.167333414 +0100
+++ gcc/config/alpha/alpha.h	2017-09-22 17:37:26.748614388 +0100
@@ -289,7 +289,6 @@ #define MINIMUM_ATOMIC_ALIGNMENT ((unsig
 /* ??? Only if block-move stuff knows about different source/destination
    alignment.  */
 #if 0
-#define CONSTANT_ALIGNMENT(EXP, ALIGN) MAX ((ALIGN), BITS_PER_WORD)
 #define DATA_ALIGNMENT(EXP, ALIGN) MAX ((ALIGN), BITS_PER_WORD)
 #endif
 
Index: gcc/config/arc/arc.h
===================================================================
--- gcc/config/arc/arc.h	2017-09-15 14:47:33.167333414 +0100
+++ gcc/config/arc/arc.h	2017-09-22 17:37:26.749614388 +0100
@@ -271,13 +271,6 @@ #define BIGGEST_ALIGNMENT 32
 /* The best alignment to use in cases where we have a choice.  */
 #define FASTEST_ALIGNMENT 32
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  ((TREE_CODE (EXP) == STRING_CST	\
-    && (ALIGN) < FASTEST_ALIGNMENT)	\
-   ? FASTEST_ALIGNMENT : (ALIGN))
-
-
 /* Make arrays of chars word-aligned for the same reasons.  */
 #define LOCAL_ALIGNMENT(TYPE, ALIGN)             \
   (TREE_CODE (TYPE) == ARRAY_TYPE               \
Index: gcc/config/arc/arc.c
===================================================================
--- gcc/config/arc/arc.c	2017-09-12 14:29:25.225531070 +0100
+++ gcc/config/arc/arc.c	2017-09-22 17:37:26.749614388 +0100
@@ -10657,6 +10657,9 @@ arc_use_anchors_for_symbol_p (const_rtx
 #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
 #define TARGET_USE_ANCHORS_FOR_SYMBOL_P arc_use_anchors_for_symbol_p
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-arc.h"
Index: gcc/config/arm/arm.h
===================================================================
--- gcc/config/arm/arm.h	2017-09-22 17:22:08.191305805 +0100
+++ gcc/config/arm/arm.h	2017-09-22 17:37:26.752614387 +0100
@@ -592,15 +592,6 @@ #define MALLOC_ABI_ALIGNMENT  BIGGEST_AL
 #define BIGGEST_FIELD_ALIGNMENT 64
 #endif
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT_FACTOR (TARGET_THUMB || ! arm_tune_xscale ? 1 : 2)
-
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)				\
-   ((TREE_CODE (EXP) == STRING_CST				\
-     && !optimize_size						\
-     && (ALIGN) < BITS_PER_WORD * CONSTANT_ALIGNMENT_FACTOR)	\
-    ? BITS_PER_WORD * CONSTANT_ALIGNMENT_FACTOR : (ALIGN))
-
 /* Align definitions of arrays, unions and structures so that
    initializations and copies can be made more efficient.  This is not
    ABI-changing, so it only affects places where we can see the
Index: gcc/config/arm/arm.c
===================================================================
--- gcc/config/arm/arm.c	2017-09-22 17:35:22.486794044 +0100
+++ gcc/config/arm/arm.c	2017-09-22 17:37:26.751614388 +0100
@@ -316,6 +316,7 @@ static opt_scalar_float_mode arm_floatn_
 static unsigned int arm_hard_regno_nregs (unsigned int, machine_mode);
 static bool arm_hard_regno_mode_ok (unsigned int, machine_mode);
 static bool arm_modes_tieable_p (machine_mode, machine_mode);
+static HOST_WIDE_INT arm_constant_alignment (const_tree, HOST_WIDE_INT);
 
 /* Table of machine attributes.  */
 static const struct attribute_spec arm_attribute_table[] =
@@ -795,6 +796,9 @@ #define TARGET_MODES_TIEABLE_P arm_modes
 
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS arm_can_change_mode_class
+
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT arm_constant_alignment
 
 /* Obstack for minipool constant handling.  */
 static struct obstack minipool_obstack;
@@ -31276,6 +31280,18 @@ arm_can_change_mode_class (machine_mode
   return true;
 }
 
+/* Implement TARGET_CONSTANT_ALIGNMENT.  Make strings word-aligned so
+   strcpy from constants will be faster.  */
+
+static HOST_WIDE_INT
+arm_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  unsigned int factor = (TARGET_THUMB || ! arm_tune_xscale ? 1 : 2);
+  if (TREE_CODE (exp) == STRING_CST && !optimize_size)
+    return MAX (align, BITS_PER_WORD * factor);
+  return align;
+}
+
 #if CHECKING_P
 namespace selftest {
 
Index: gcc/config/bfin/bfin.h
===================================================================
--- gcc/config/bfin/bfin.h	2017-09-15 14:47:33.168333307 +0100
+++ gcc/config/bfin/bfin.h	2017-09-22 17:37:26.753614387 +0100
@@ -321,11 +321,6 @@ #define ACCUMULATE_OUTGOING_ARGS 1
 
 #define LOCAL_ALIGNMENT(TYPE, ALIGN) bfin_local_alignment ((TYPE), (ALIGN))
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  (TREE_CODE (EXP) == STRING_CST        \
-   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))    
-
 #define TRAMPOLINE_SIZE (TARGET_FDPIC ? 30 : 18)
 
 /* Definitions for register eliminations.
Index: gcc/config/bfin/bfin.c
===================================================================
--- gcc/config/bfin/bfin.c	2017-09-12 14:29:25.228530938 +0100
+++ gcc/config/bfin/bfin.c	2017-09-22 17:37:26.752614387 +0100
@@ -5882,4 +5882,7 @@ #define TARGET_HARD_REGNO_MODE_OK bfin_h
 #undef TARGET_MODES_TIEABLE_P
 #define TARGET_MODES_TIEABLE_P bfin_modes_tieable_p
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
Index: gcc/config/cr16/cr16.h
===================================================================
--- gcc/config/cr16/cr16.h	2017-09-15 14:47:33.168333307 +0100
+++ gcc/config/cr16/cr16.h	2017-09-22 17:37:26.753614387 +0100
@@ -114,11 +114,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)
      && ((ALIGN) < BITS_PER_WORD))               \
      ? (BITS_PER_WORD) : (ALIGN))
 
-/* In CR16 strings are word-aligned; strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(CONSTANT, ALIGN)                            \
-  (((TREE_CODE (CONSTANT) == STRING_CST) && ((ALIGN) < BITS_PER_WORD)) \
-     ? (BITS_PER_WORD) : (ALIGN))
-
 #define STRICT_ALIGNMENT 0
 
 #define PCC_BITFIELD_TYPE_MATTERS 1
Index: gcc/config/cr16/cr16.c
===================================================================
--- gcc/config/cr16/cr16.c	2017-09-12 14:29:25.229530894 +0100
+++ gcc/config/cr16/cr16.c	2017-09-22 17:37:26.753614387 +0100
@@ -200,6 +200,9 @@ #define TARGET_REGISTER_MOVE_COST 	cr16_
 #undef TARGET_MEMORY_MOVE_COST
 #define TARGET_MEMORY_MOVE_COST 	cr16_memory_move_cost
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT	constant_alignment_word_strings
+
 /* Table of machine attributes.  */
 static const struct attribute_spec cr16_attribute_table[] = {
   /* ISRs have special prologue and epilogue requirements.  */
Index: gcc/config/cris/cris.h
===================================================================
--- gcc/config/cris/cris.h	2017-09-15 14:47:33.169333199 +0100
+++ gcc/config/cris/cris.h	2017-09-22 17:37:26.754614387 +0100
@@ -368,17 +368,6 @@ #define DATA_ALIGNMENT(TYPE, BASIC_ALIGN
      ? (BASIC_ALIGN < 32 ? 32 : BASIC_ALIGN)			\
      : (BASIC_ALIGN < 16 ? 16 : BASIC_ALIGN)) : BASIC_ALIGN)
 
-/* Note that CONSTANT_ALIGNMENT has the effect of making gcc believe that
-   ALL references to constant stuff (in code segment, like strings) has
-   this alignment.  That is a rather rushed assumption.  Luckily we do not
-   care about the "alignment" operand to builtin memcpy (only place where
-   it counts), so it doesn't affect any bad spots.  */
-#define CONSTANT_ALIGNMENT(CONSTANT, BASIC_ALIGN)		\
- (TARGET_CONST_ALIGN						\
-  ? (TARGET_ALIGN_BY_32						\
-     ? (BASIC_ALIGN < 32 ? 32 : BASIC_ALIGN)			\
-     : (BASIC_ALIGN < 16 ? 16 : BASIC_ALIGN)) : BASIC_ALIGN)
-
 /* FIXME: Define LOCAL_ALIGNMENT for word and dword or arrays and
    structures (if -mstack-align=), and check that it is good.  */
 
Index: gcc/config/cris/cris.c
===================================================================
--- gcc/config/cris/cris.c	2017-09-12 14:29:25.229530894 +0100
+++ gcc/config/cris/cris.c	2017-09-22 17:37:26.754614387 +0100
@@ -165,6 +165,7 @@ static bool cris_function_value_regno_p
 static void cris_file_end (void);
 static unsigned int cris_hard_regno_nregs (unsigned int, machine_mode);
 static bool cris_hard_regno_mode_ok (unsigned int, machine_mode);
+static HOST_WIDE_INT cris_constant_alignment (const_tree, HOST_WIDE_INT);
 
 /* This is the parsed result of the "-max-stack-stackframe=" option.  If
    it (still) is zero, then there was no such option given.  */
@@ -287,6 +288,9 @@ #define TARGET_HARD_REGNO_NREGS cris_har
 #undef TARGET_HARD_REGNO_MODE_OK
 #define TARGET_HARD_REGNO_MODE_OK cris_hard_regno_mode_ok
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT cris_constant_alignment
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Helper for cris_load_multiple_op and cris_ret_movem_op.  */
@@ -4325,6 +4329,23 @@ cris_hard_regno_mode_ok (unsigned int re
 	      || (regno != CRIS_MOF_REGNUM && regno != CRIS_ACR_REGNUM)));
 }
 
+/* Implement TARGET_CONSTANT_ALIGNMENT.  Note that this hook has the
+   effect of making gcc believe that ALL references to constant stuff
+   (in code segment, like strings) have this alignment.  That is a rather
+   rushed assumption.  Luckily we do not care about the "alignment"
+   operand to builtin memcpy (only place where it counts), so it doesn't
+   affect any bad spots.  */
+
+static HOST_WIDE_INT
+cris_constant_alignment (const_tree, HOST_WIDE_INT basic_align)
+{
+  if (!TARGET_CONST_ALIGN)
+    return basic_align;
+  if (TARGET_ALIGN_BY_32)
+    return MAX (basic_align, 32);
+  return MAX (basic_align, 16);
+}
+
 #if 0
 /* Various small functions to replace macros.  Only called from a
    debugger.  They might collide with gcc functions or system functions,
Index: gcc/config/epiphany/epiphany.h
===================================================================
--- gcc/config/epiphany/epiphany.h	2017-09-15 14:47:33.169333199 +0100
+++ gcc/config/epiphany/epiphany.h	2017-09-22 17:37:26.754614387 +0100
@@ -147,12 +147,6 @@ #define FASTEST_ALIGNMENT 64
 
 #define MALLOC_ABI_ALIGNMENT BIGGEST_ALIGNMENT
 
-/* Make strings dword-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  ((TREE_CODE (EXP) == STRING_CST	\
-    && (ALIGN) < FASTEST_ALIGNMENT)	\
-   ? FASTEST_ALIGNMENT : (ALIGN))
-
 /* Make arrays of chars dword-aligned for the same reasons.
    Also, align arrays of SImode items.  */
 #define DATA_ALIGNMENT(TYPE, ALIGN)		\
Index: gcc/config/epiphany/epiphany.c
===================================================================
--- gcc/config/epiphany/epiphany.c	2017-09-04 11:49:42.897500726 +0100
+++ gcc/config/epiphany/epiphany.c	2017-09-22 17:37:26.754614387 +0100
@@ -173,6 +173,9 @@ #define TARGET_ASM_ALIGNED_SI_OP "\t.wor
 
 #undef TARGET_HARD_REGNO_MODE_OK
 #define TARGET_HARD_REGNO_MODE_OK epiphany_hard_regno_mode_ok
+
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT epiphany_constant_alignment
 
 bool
 epiphany_is_interrupt_p (tree decl)
@@ -3014,4 +3017,15 @@ epiphany_start_function (FILE *file, con
   ASM_OUTPUT_FUNCTION_LABEL (file, name, decl);
 }
 
+
+/* Implement TARGET_CONSTANT_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+epiphany_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  if (TREE_CODE (exp) == STRING_CST)
+    return MAX (align, FASTEST_ALIGNMENT);
+  return align;
+}
+
 struct gcc_target targetm = TARGET_INITIALIZER;
Index: gcc/config/fr30/fr30.h
===================================================================
--- gcc/config/fr30/fr30.h	2017-09-15 14:47:33.169333199 +0100
+++ gcc/config/fr30/fr30.h	2017-09-22 17:37:26.755614387 +0100
@@ -88,10 +88,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)		\
    && TYPE_MODE (TREE_TYPE (TYPE)) == QImode	\
    && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
 
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  (TREE_CODE (EXP) == STRING_CST	\
-   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
-
 #define STRICT_ALIGNMENT 1
 
 #define PCC_BITFIELD_TYPE_MATTERS 1
Index: gcc/config/fr30/fr30.c
===================================================================
--- gcc/config/fr30/fr30.c	2017-08-10 14:36:08.721447283 +0100
+++ gcc/config/fr30/fr30.c	2017-09-22 17:37:26.754614387 +0100
@@ -190,6 +190,9 @@ #define TARGET_ASM_TRAMPOLINE_TEMPLATE f
 #undef TARGET_TRAMPOLINE_INIT
 #define TARGET_TRAMPOLINE_INIT fr30_trampoline_init
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 
Index: gcc/config/frv/frv.h
===================================================================
--- gcc/config/frv/frv.h	2017-09-15 14:47:33.169333199 +0100
+++ gcc/config/frv/frv.h	2017-09-22 17:37:26.756614387 +0100
@@ -351,20 +351,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)		\
    && TYPE_MODE (TREE_TYPE (TYPE)) == QImode	\
    && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
 
-/* If defined, a C expression to compute the alignment given to a constant that
-   is being placed in memory.  CONSTANT is the constant and ALIGN is the
-   alignment that the object would ordinarily have.  The value of this macro is
-   used instead of that alignment to align the object.
-
-   If this macro is not defined, then ALIGN is used.
-
-   The typical use of this macro is to increase alignment for string constants
-   to be word aligned so that `strcpy' calls that copy constants can be done
-   inline.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  (TREE_CODE (EXP) == STRING_CST	\
-   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
-
 /* Define this macro to be the value 1 if instructions will fail to work if
    given data not on the nominal alignment.  If instructions will merely go
    slower in that case, define this macro as 0.  */
Index: gcc/config/frv/frv.c
===================================================================
--- gcc/config/frv/frv.c	2017-09-12 14:29:25.231530806 +0100
+++ gcc/config/frv/frv.c	2017-09-22 17:37:26.756614387 +0100
@@ -523,6 +523,8 @@ #define TARGET_HARD_REGNO_NREGS frv_hard
 #define TARGET_HARD_REGNO_MODE_OK frv_hard_regno_mode_ok
 #undef TARGET_MODES_TIEABLE_P
 #define TARGET_MODES_TIEABLE_P frv_modes_tieable_p
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
 
 struct gcc_target targetm = TARGET_INITIALIZER;
 
Index: gcc/config/ft32/ft32.h
===================================================================
--- gcc/config/ft32/ft32.h	2017-09-15 14:47:33.169333199 +0100
+++ gcc/config/ft32/ft32.h	2017-09-22 17:37:26.756614387 +0100
@@ -354,12 +354,6 @@ #define PCC_BITFIELD_TYPE_MATTERS
    is GET_MODE_SIZE(DImode).  */
 #define MAX_FIXED_MODE_SIZE 32
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  ((TREE_CODE (EXP) == STRING_CST       \
-    && (ALIGN) < FASTEST_ALIGNMENT)     \
-   ? FASTEST_ALIGNMENT : (ALIGN))
-
 /* Set this nonzero if move instructions will actually fail to work
    when given unaligned data.  */
 #define STRICT_ALIGNMENT 1
Index: gcc/config/ft32/ft32.c
===================================================================
--- gcc/config/ft32/ft32.c	2017-08-30 12:18:46.608141057 +0100
+++ gcc/config/ft32/ft32.c	2017-09-22 17:37:26.756614387 +0100
@@ -940,6 +940,9 @@ ft32_elf_encode_section_info (tree decl,
     }
 }
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-ft32.h"
Index: gcc/config/i386/i386.h
===================================================================
--- gcc/config/i386/i386.h	2017-09-21 11:53:16.598005975 +0100
+++ gcc/config/i386/i386.h	2017-09-22 17:37:26.761614387 +0100
@@ -848,20 +848,6 @@ #define ADJUST_FIELD_ALIGN(FIELD, TYPE,
   x86_field_alignment ((TYPE), (COMPUTED))
 #endif
 
-/* If defined, a C expression to compute the alignment given to a
-   constant that is being placed in memory.  EXP is the constant
-   and ALIGN is the alignment that the object would ordinarily have.
-   The value of this macro is used instead of that alignment to align
-   the object.
-
-   If this macro is not defined, then ALIGN is used.
-
-   The typical use of this macro is to increase alignment for string
-   constants to be word aligned so that `strcpy' calls that copy
-   constants can be done inline.  */
-
-#define CONSTANT_ALIGNMENT(EXP, ALIGN) ix86_constant_alignment ((EXP), (ALIGN))
-
 /* If defined, a C expression to compute the alignment for a static
    variable.  TYPE is the data type, and ALIGN is the alignment that
    the object would ordinarily have.  The value of this macro is used
Index: gcc/config/i386/i386-protos.h
===================================================================
--- gcc/config/i386/i386-protos.h	2017-09-15 13:56:20.266148661 +0100
+++ gcc/config/i386/i386-protos.h	2017-09-22 17:37:26.756614387 +0100
@@ -209,7 +209,6 @@ extern unsigned int ix86_local_alignment
 					  unsigned int);
 extern unsigned int ix86_minimum_alignment (tree, machine_mode,
 					    unsigned int);
-extern int ix86_constant_alignment (tree, int);
 extern tree ix86_handle_shared_attribute (tree *, tree, tree, int, bool *);
 extern tree ix86_handle_selectany_attribute (tree *, tree, tree, int, bool *);
 extern int x86_field_alignment (tree, int);
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c	2017-09-22 17:31:56.418527551 +0100
+++ gcc/config/i386/i386.c	2017-09-22 17:37:26.760614387 +0100
@@ -31555,14 +31555,10 @@ ix86_sched_init_global (FILE *, int, int
 }
 
 
-/* Compute the alignment given to a constant that is being placed in memory.
-   EXP is the constant and ALIGN is the alignment that the object would
-   ordinarily have.
-   The value of this function is used instead of that alignment to align
-   the object.  */
+/* Implement TARGET_CONSTANT_ALIGNMENT.  */
 
-int
-ix86_constant_alignment (tree exp, int align)
+static HOST_WIDE_INT
+ix86_constant_alignment (const_tree exp, HOST_WIDE_INT align)
 {
   if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST
       || TREE_CODE (exp) == INTEGER_CST)
@@ -53601,6 +53597,9 @@ #define TARGET_HARD_REGNO_CALL_PART_CLOB
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS ix86_can_change_mode_class
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT ix86_constant_alignment
+
 #if CHECKING_P
 #undef TARGET_RUN_TARGET_SELFTESTS
 #define TARGET_RUN_TARGET_SELFTESTS selftest::ix86_run_selftests
Index: gcc/config/ia64/ia64.h
===================================================================
--- gcc/config/ia64/ia64.h	2017-09-15 14:47:33.170333092 +0100
+++ gcc/config/ia64/ia64.h	2017-09-22 17:37:26.762614387 +0100
@@ -185,15 +185,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)		\
    && TYPE_MODE (TREE_TYPE (TYPE)) == QImode	\
    && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
 
-/* If defined, a C expression to compute the alignment given to a constant that
-   is being placed in memory.  CONSTANT is the constant and ALIGN is the
-   alignment that the object would ordinarily have.  The value of this macro is
-   used instead of that alignment to align the object.  */
-
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  (TREE_CODE (EXP) == STRING_CST	\
-   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
-
 #define STRICT_ALIGNMENT 1
 
 /* Define this if you wish to imitate the way many other C compilers handle
Index: gcc/config/ia64/ia64.c
===================================================================
--- gcc/config/ia64/ia64.c	2017-09-22 17:31:56.419475454 +0100
+++ gcc/config/ia64/ia64.c	2017-09-22 17:37:26.762614387 +0100
@@ -672,6 +672,9 @@ #define TARGET_MODES_TIEABLE_P ia64_mode
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS ia64_can_change_mode_class
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain
Index: gcc/config/iq2000/iq2000.h
===================================================================
--- gcc/config/iq2000/iq2000.h	2017-09-15 14:47:33.170333092 +0100
+++ gcc/config/iq2000/iq2000.h	2017-09-22 17:37:26.763614387 +0100
@@ -96,10 +96,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)
 	|| TREE_CODE (TYPE) == UNION_TYPE				\
 	|| TREE_CODE (TYPE) == RECORD_TYPE)) ? BITS_PER_WORD : (ALIGN))
 
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)					\
-  ((TREE_CODE (EXP) == STRING_CST  || TREE_CODE (EXP) == CONSTRUCTOR)	\
-   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
-
 #define EMPTY_FIELD_BOUNDARY 32
 
 #define STRUCTURE_SIZE_BOUNDARY 8
Index: gcc/config/iq2000/iq2000.c
===================================================================
--- gcc/config/iq2000/iq2000.c	2017-09-04 11:50:24.548966298 +0100
+++ gcc/config/iq2000/iq2000.c	2017-09-22 17:37:26.762614387 +0100
@@ -180,6 +180,7 @@ static void iq2000_print_operand_address
 static bool iq2000_print_operand_punct_valid_p (unsigned char code);
 static bool iq2000_hard_regno_mode_ok (unsigned int, machine_mode);
 static bool iq2000_modes_tieable_p (machine_mode, machine_mode);
+static HOST_WIDE_INT iq2000_constant_alignment (const_tree, HOST_WIDE_INT);
 
 #undef  TARGET_INIT_BUILTINS
 #define TARGET_INIT_BUILTINS 		iq2000_init_builtins
@@ -264,6 +265,9 @@ #define TARGET_HARD_REGNO_MODE_OK	iq2000
 #undef  TARGET_MODES_TIEABLE_P
 #define TARGET_MODES_TIEABLE_P		iq2000_modes_tieable_p
 
+#undef  TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT	iq2000_constant_alignment
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Return nonzero if we split the address into high and low parts.  */
@@ -3532,4 +3536,14 @@ iq2000_modes_tieable_p (machine_mode mod
 	      || GET_MODE_CLASS (mode2) == MODE_COMPLEX_FLOAT));
 }
 
+/* Implement TARGET_CONSTANT_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+iq2000_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  if (TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)
+    return MAX (align, BITS_PER_WORD);
+  return align;
+}
+
 #include "gt-iq2000.h"
Index: gcc/config/lm32/lm32.h
===================================================================
--- gcc/config/lm32/lm32.h	2017-09-15 14:47:33.171332984 +0100
+++ gcc/config/lm32/lm32.h	2017-09-22 17:37:26.763614387 +0100
@@ -99,11 +99,6 @@ #define STRICT_ALIGNMENT 1
 
 #define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  (TREE_CODE (EXP) == STRING_CST	\
-   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
-
 /* Make arrays and structures word-aligned to allow faster copying etc.  */
 #define DATA_ALIGNMENT(TYPE, ALIGN)					\
   ((((ALIGN) < BITS_PER_WORD)						\
Index: gcc/config/lm32/lm32.c
===================================================================
--- gcc/config/lm32/lm32.c	2017-09-05 20:56:49.753937121 +0100
+++ gcc/config/lm32/lm32.c	2017-09-22 17:37:26.763614387 +0100
@@ -113,6 +113,9 @@ #define TARGET_HARD_REGNO_MODE_OK lm32_h
 #undef TARGET_MODES_TIEABLE_P
 #define TARGET_MODES_TIEABLE_P lm32_modes_tieable_p
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Current frame information calculated by lm32_compute_frame_size.  */
Index: gcc/config/m32r/m32r.h
===================================================================
--- gcc/config/m32r/m32r.h	2017-09-15 14:47:33.171332984 +0100
+++ gcc/config/m32r/m32r.h	2017-09-22 17:37:26.766614387 +0100
@@ -260,12 +260,6 @@ #define BIGGEST_ALIGNMENT 32
 /* The best alignment to use in cases where we have a choice.  */
 #define FASTEST_ALIGNMENT 32
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)	\
-  ((TREE_CODE (EXP) == STRING_CST	\
-    && (ALIGN) < FASTEST_ALIGNMENT)	\
-   ? FASTEST_ALIGNMENT : (ALIGN))
-
 /* Make arrays of chars word-aligned for the same reasons.  */
 #define DATA_ALIGNMENT(TYPE, ALIGN)					\
   (TREE_CODE (TYPE) == ARRAY_TYPE					\
Index: gcc/config/m32r/m32r.c
===================================================================
--- gcc/config/m32r/m32r.c	2017-09-04 11:50:08.518432217 +0100
+++ gcc/config/m32r/m32r.c	2017-09-22 17:37:26.765614387 +0100
@@ -217,6 +217,9 @@ #define TARGET_HARD_REGNO_MODE_OK m32r_h
 #undef TARGET_MODES_TIEABLE_P
 #define TARGET_MODES_TIEABLE_P m32r_modes_tieable_p
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Called by m32r_option_override to initialize various things.  */
Index: gcc/config/mcore/mcore.h
===================================================================
--- gcc/config/mcore/mcore.h	2017-09-15 14:47:33.171332984 +0100
+++ gcc/config/mcore/mcore.h	2017-09-22 17:37:26.766614387 +0100
@@ -148,12 +148,6 @@ #define	PCC_BITFIELD_TYPE_MATTERS	1
    is GET_MODE_SIZE(DImode).  */
 #define MAX_FIXED_MODE_SIZE 32
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  ((TREE_CODE (EXP) == STRING_CST	\
-    && (ALIGN) < FASTEST_ALIGNMENT)	\
-   ? FASTEST_ALIGNMENT : (ALIGN))
-
 /* Make arrays of chars word-aligned for the same reasons.  */
 #define DATA_ALIGNMENT(TYPE, ALIGN)		\
   (TREE_CODE (TYPE) == ARRAY_TYPE		\
Index: gcc/config/mcore/mcore.c
===================================================================
--- gcc/config/mcore/mcore.c	2017-09-04 11:50:08.519332606 +0100
+++ gcc/config/mcore/mcore.c	2017-09-22 17:37:26.766614387 +0100
@@ -248,6 +248,9 @@ #define TARGET_HARD_REGNO_MODE_OK mcore_
 #undef TARGET_MODES_TIEABLE_P
 #define TARGET_MODES_TIEABLE_P mcore_modes_tieable_p
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Adjust the stack and return the number of bytes taken to do it.  */
Index: gcc/config/microblaze/microblaze.h
===================================================================
--- gcc/config/microblaze/microblaze.h	2017-09-15 14:47:33.172332877 +0100
+++ gcc/config/microblaze/microblaze.h	2017-09-22 17:37:26.767614387 +0100
@@ -234,12 +234,6 @@ #define SIZE_TYPE "unsigned int"
 #undef PTRDIFF_TYPE
 #define PTRDIFF_TYPE "int"
 
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)					\
-  ((TREE_CODE (EXP) == STRING_CST  || TREE_CODE (EXP) == CONSTRUCTOR)	\
-   && (ALIGN) < BITS_PER_WORD						\
-	? BITS_PER_WORD							\
-	: (ALIGN))
-
 #define DATA_ALIGNMENT(TYPE, ALIGN)					\
   ((((ALIGN) < BITS_PER_WORD)						\
     && (TREE_CODE (TYPE) == ARRAY_TYPE					\
Index: gcc/config/microblaze/microblaze.c
===================================================================
--- gcc/config/microblaze/microblaze.c	2017-09-05 20:56:49.754842071 +0100
+++ gcc/config/microblaze/microblaze.c	2017-09-22 17:37:26.767614387 +0100
@@ -3800,6 +3800,16 @@ microblaze_machine_dependent_reorg (void
       return;
     }
 }
+
+/* Implement TARGET_CONSTANT_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+microblaze_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  if (TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)
+    return MAX (align, BITS_PER_WORD);
+  return align;
+}
 
 #undef TARGET_ENCODE_SECTION_INFO
 #define TARGET_ENCODE_SECTION_INFO      microblaze_encode_section_info
@@ -3904,6 +3914,9 @@ #define TARGET_HARD_REGNO_MODE_OK microb
 #undef TARGET_MODES_TIEABLE_P
 #define TARGET_MODES_TIEABLE_P microblaze_modes_tieable_p
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT microblaze_constant_alignment
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-microblaze.h"
Index: gcc/config/mips/mips.h
===================================================================
--- gcc/config/mips/mips.h	2017-09-15 14:47:33.174332662 +0100
+++ gcc/config/mips/mips.h	2017-09-22 17:37:26.769614386 +0100
@@ -1636,22 +1636,6 @@ #define STRICT_ALIGNMENT 1
 
 #define PCC_BITFIELD_TYPE_MATTERS 1
 
-/* If defined, a C expression to compute the alignment given to a
-   constant that is being placed in memory.  CONSTANT is the constant
-   and ALIGN is the alignment that the object would ordinarily have.
-   The value of this macro is used instead of that alignment to align
-   the object.
-
-   If this macro is not defined, then ALIGN is used.
-
-   The typical use of this macro is to increase alignment for string
-   constants to be word aligned so that `strcpy' calls that copy
-   constants can be done inline.  */
-
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)					\
-  ((TREE_CODE (EXP) == STRING_CST  || TREE_CODE (EXP) == CONSTRUCTOR)	\
-   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
-
 /* If defined, a C expression to compute the alignment for a static
    variable.  TYPE is the data type, and ALIGN is the alignment that
    the object would ordinarily have.  The value of this macro is used
Index: gcc/config/mips/mips.c
===================================================================
--- gcc/config/mips/mips.c	2017-09-22 17:31:56.421371259 +0100
+++ gcc/config/mips/mips.c	2017-09-22 17:37:26.769614386 +0100
@@ -22336,6 +22336,16 @@ mips_truly_noop_truncation (unsigned int
 {
   return !TARGET_64BIT || inprec <= 32 || outprec > 32;
 }
+
+/* Implement TARGET_CONSTANT_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+mips_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  if (TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)
+    return MAX (align, BITS_PER_WORD);
+  return align;
+}
 
 /* Initialize the GCC target structure.  */
 #undef TARGET_ASM_ALIGNED_HI_OP
@@ -22634,6 +22644,9 @@ #define TARGET_CAN_CHANGE_MODE_CLASS mip
 #undef TARGET_TRULY_NOOP_TRUNCATION
 #define TARGET_TRULY_NOOP_TRUNCATION mips_truly_noop_truncation
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT mips_constant_alignment
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-mips.h"
Index: gcc/config/mmix/mmix.h
===================================================================
--- gcc/config/mmix/mmix.h	2017-09-15 14:47:33.174332662 +0100
+++ gcc/config/mmix/mmix.h	2017-09-22 17:37:26.770614386 +0100
@@ -167,9 +167,6 @@ #define MAX_OFILE_ALIGNMENT (32768 * 8)
 #define DATA_ABI_ALIGNMENT(TYPE, BASIC_ALIGN) \
  mmix_data_alignment (TYPE, BASIC_ALIGN)
 
-#define CONSTANT_ALIGNMENT(CONSTANT, BASIC_ALIGN) \
- mmix_constant_alignment (CONSTANT, BASIC_ALIGN)
-
 #define LOCAL_ALIGNMENT(TYPE, BASIC_ALIGN) \
  mmix_local_alignment (TYPE, BASIC_ALIGN)
 
Index: gcc/config/mmix/mmix-protos.h
===================================================================
--- gcc/config/mmix/mmix-protos.h	2017-02-23 19:54:26.000000000 +0000
+++ gcc/config/mmix/mmix-protos.h	2017-09-22 17:37:26.769614386 +0100
@@ -47,7 +47,6 @@ extern unsigned mmix_dbx_register_number
 extern int mmix_use_simple_return (void);
 extern void mmix_make_decl_one_only (tree);
 extern int mmix_data_alignment (tree, int);
-extern int mmix_constant_alignment (tree, int);
 extern unsigned mmix_local_alignment (tree, unsigned);
 extern void mmix_asm_output_pool_prologue (FILE *, const char *, tree, int);
 extern void mmix_asm_output_aligned_common (FILE *, const char *, int, int);
Index: gcc/config/mmix/mmix.c
===================================================================
--- gcc/config/mmix/mmix.c	2017-08-30 12:08:01.655417455 +0100
+++ gcc/config/mmix/mmix.c	2017-09-22 17:37:26.770614386 +0100
@@ -168,6 +168,7 @@ static void mmix_print_operand (FILE *,
 static void mmix_print_operand_address (FILE *, machine_mode, rtx);
 static bool mmix_print_operand_punct_valid_p (unsigned char);
 static void mmix_conditional_register_usage (void);
+static HOST_WIDE_INT mmix_constant_alignment (const_tree, HOST_WIDE_INT);
 
 /* Target structure macros.  Listed by node.  See `Using and Porting GCC'
    for a general description.  */
@@ -282,6 +283,9 @@ #define TARGET_TRAMPOLINE_INIT mmix_tram
 #undef TARGET_OPTION_OVERRIDE
 #define TARGET_OPTION_OVERRIDE mmix_option_override
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT mmix_constant_alignment
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Functions that are expansions for target macros.
@@ -334,10 +338,10 @@ mmix_data_alignment (tree type ATTRIBUTE
   return basic_align;
 }
 
-/* CONSTANT_ALIGNMENT.  */
+/* Implement tARGET_CONSTANT_ALIGNMENT.  */
 
-int
-mmix_constant_alignment (tree constant ATTRIBUTE_UNUSED, int basic_align)
+static HOST_WIDE_INT
+mmix_constant_alignment (const_tree, HOST_WIDE_INT basic_align)
 {
   if (basic_align < 32)
     return 32;
Index: gcc/config/moxie/moxie.h
===================================================================
--- gcc/config/moxie/moxie.h	2017-09-15 14:47:33.175332555 +0100
+++ gcc/config/moxie/moxie.h	2017-09-22 17:37:26.770614386 +0100
@@ -317,12 +317,6 @@ #define	PCC_BITFIELD_TYPE_MATTERS	1
    is GET_MODE_SIZE(DImode).  */
 #define MAX_FIXED_MODE_SIZE 32
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  ((TREE_CODE (EXP) == STRING_CST	\
-    && (ALIGN) < FASTEST_ALIGNMENT)	\
-   ? FASTEST_ALIGNMENT : (ALIGN))
-
 /* Make arrays of chars word-aligned for the same reasons.  */
 #define DATA_ALIGNMENT(TYPE, ALIGN)		\
   (TREE_CODE (TYPE) == ARRAY_TYPE		\
Index: gcc/config/moxie/moxie.c
===================================================================
--- gcc/config/moxie/moxie.c	2017-08-10 14:36:08.735446777 +0100
+++ gcc/config/moxie/moxie.c	2017-09-22 17:37:26.770614386 +0100
@@ -667,6 +667,9 @@ #define TARGET_PRINT_OPERAND moxie_print
 #undef  TARGET_PRINT_OPERAND_ADDRESS
 #define TARGET_PRINT_OPERAND_ADDRESS moxie_print_operand_address
 
+#undef  TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-moxie.h"
Index: gcc/config/nios2/nios2.h
===================================================================
--- gcc/config/nios2/nios2.h	2017-09-15 14:47:33.175332555 +0100
+++ gcc/config/nios2/nios2.h	2017-09-22 17:37:26.771614386 +0100
@@ -92,10 +92,6 @@ #define STACK_BOUNDARY 32
 #define PREFERRED_STACK_BOUNDARY 32
 #define MAX_FIXED_MODE_SIZE 64
 
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)                          \
-  ((TREE_CODE (EXP) == STRING_CST)                              \
-   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
-
 #define LABEL_ALIGN(LABEL) nios2_label_align (LABEL)
 
 /* Layout of source language data types.  */
Index: gcc/config/nios2/nios2.c
===================================================================
--- gcc/config/nios2/nios2.c	2017-09-04 11:50:24.551667467 +0100
+++ gcc/config/nios2/nios2.c	2017-09-22 17:37:26.771614386 +0100
@@ -5116,6 +5116,9 @@ #define TARGET_ASM_OUTPUT_MI_THUNK nios2
 #undef TARGET_MACHINE_DEPENDENT_REORG
 #define TARGET_MACHINE_DEPENDENT_REORG nios2_reorg
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-nios2.h"
Index: gcc/config/pa/pa.h
===================================================================
--- gcc/config/pa/pa.h	2017-09-15 14:47:33.176332447 +0100
+++ gcc/config/pa/pa.h	2017-09-22 17:37:26.772614386 +0100
@@ -309,11 +309,6 @@ #define BIGGEST_ALIGNMENT (2 * BITS_PER_
    atomic operations.  */
 #define MALLOC_ABI_ALIGNMENT (TARGET_SOM ? 64 : 128)
 
-/* Get around hp-ux assembler bug, and make strcpy of constants fast.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)		\
-  (TREE_CODE (EXP) == STRING_CST		\
-   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
-
 /* Make arrays of chars word-aligned for the same reasons.  */
 #define DATA_ALIGNMENT(TYPE, ALIGN)		\
   (TREE_CODE (TYPE) == ARRAY_TYPE		\
Index: gcc/config/pa/pa.c
===================================================================
--- gcc/config/pa/pa.c	2017-09-15 13:56:20.276148823 +0100
+++ gcc/config/pa/pa.c	2017-09-22 17:37:26.772614386 +0100
@@ -425,6 +425,9 @@ #define TARGET_MODES_TIEABLE_P pa_modes_
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS pa_can_change_mode_class
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Parse the -mfixed-range= option string.  */
Index: gcc/config/powerpcspe/powerpcspe.h
===================================================================
--- gcc/config/powerpcspe/powerpcspe.h	2017-09-15 14:47:33.176332447 +0100
+++ gcc/config/powerpcspe/powerpcspe.h	2017-09-22 17:37:26.775614386 +0100
@@ -978,14 +978,6 @@ enum data_align { align_abi, align_opt,
 #define LOCAL_ALIGNMENT(TYPE, ALIGN)				\
   rs6000_data_alignment (TYPE, ALIGN, align_both)
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)                           \
-  (TREE_CODE (EXP) == STRING_CST	                         \
-   && (STRICT_ALIGNMENT || !optimize_size)                       \
-   && (ALIGN) < BITS_PER_WORD                                    \
-   ? BITS_PER_WORD                                               \
-   : (ALIGN))
-
 /* Make arrays of chars word-aligned for the same reasons.  */
 #define DATA_ALIGNMENT(TYPE, ALIGN) \
   rs6000_data_alignment (TYPE, ALIGN, align_opt)
Index: gcc/config/powerpcspe/powerpcspe.c
===================================================================
--- gcc/config/powerpcspe/powerpcspe.c	2017-09-22 17:31:56.424214967 +0100
+++ gcc/config/powerpcspe/powerpcspe.c	2017-09-22 17:37:26.775614386 +0100
@@ -1984,6 +1984,9 @@ #define TARGET_SLOW_UNALIGNED_ACCESS rs6
 
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS rs6000_can_change_mode_class
+
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT rs6000_constant_alignment
 
 
 /* Processor table.  */
@@ -43752,6 +43755,17 @@ rs6000_optab_supported_p (int op, machin
       return true;
     }
 }
+
+/* Implement TARGET_CONSTANT_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+rs6000_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  if (TREE_CODE (exp) == STRING_CST
+      && (STRICT_ALIGNMENT || !optimize_size))
+    return MAX (align, BITS_PER_WORD);
+  return align;
+}
 
 struct gcc_target targetm = TARGET_INITIALIZER;
 
Index: gcc/config/riscv/riscv.h
===================================================================
--- gcc/config/riscv/riscv.h	2017-09-15 14:47:33.176332447 +0100
+++ gcc/config/riscv/riscv.h	2017-09-22 17:37:26.776614386 +0100
@@ -152,22 +152,6 @@ #define STRICT_ALIGNMENT TARGET_STRICT_A
 
 #define PCC_BITFIELD_TYPE_MATTERS 1
 
-/* If defined, a C expression to compute the alignment given to a
-   constant that is being placed in memory.  CONSTANT is the constant
-   and ALIGN is the alignment that the object would ordinarily have.
-   The value of this macro is used instead of that alignment to align
-   the object.
-
-   If this macro is not defined, then ALIGN is used.
-
-   The typical use of this macro is to increase alignment for string
-   constants to be word aligned so that `strcpy' calls that copy
-   constants can be done inline.  */
-
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)					\
-  ((TREE_CODE (EXP) == STRING_CST  || TREE_CODE (EXP) == CONSTRUCTOR)	\
-   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
-
 /* If defined, a C expression to compute the alignment for a static
    variable.  TYPE is the data type, and ALIGN is the alignment that
    the object would ordinarily have.  The value of this macro is used
Index: gcc/config/riscv/riscv.c
===================================================================
--- gcc/config/riscv/riscv.c	2017-09-15 13:56:20.282148920 +0100
+++ gcc/config/riscv/riscv.c	2017-09-22 17:37:26.776614386 +0100
@@ -3995,6 +3995,17 @@ riscv_can_change_mode_class (machine_mod
   return !reg_classes_intersect_p (FP_REGS, rclass);
 }
 
+
+/* Implement TARGET_CONSTANT_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+riscv_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  if (TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)
+    return MAX (align, BITS_PER_WORD);
+  return align;
+}
+
 /* Initialize the GCC target structure.  */
 #undef TARGET_ASM_ALIGNED_HI_OP
 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
@@ -4142,6 +4153,9 @@ #define TARGET_SECONDARY_MEMORY_NEEDED r
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS riscv_can_change_mode_class
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT riscv_constant_alignment
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-riscv.h"
Index: gcc/config/rs6000/rs6000.h
===================================================================
--- gcc/config/rs6000/rs6000.h	2017-09-15 14:47:33.177332340 +0100
+++ gcc/config/rs6000/rs6000.h	2017-09-22 17:37:26.779614386 +0100
@@ -950,14 +950,6 @@ enum data_align { align_abi, align_opt,
 #define LOCAL_ALIGNMENT(TYPE, ALIGN)				\
   rs6000_data_alignment (TYPE, ALIGN, align_both)
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)                           \
-  (TREE_CODE (EXP) == STRING_CST	                         \
-   && (STRICT_ALIGNMENT || !optimize_size)                       \
-   && (ALIGN) < BITS_PER_WORD                                    \
-   ? BITS_PER_WORD                                               \
-   : (ALIGN))
-
 /* Make arrays of chars word-aligned for the same reasons.  */
 #define DATA_ALIGNMENT(TYPE, ALIGN) \
   rs6000_data_alignment (TYPE, ALIGN, align_opt)
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	2017-09-22 17:31:56.427058675 +0100
+++ gcc/config/rs6000/rs6000.c	2017-09-22 17:37:26.779614386 +0100
@@ -1974,6 +1974,9 @@ #define TARGET_SLOW_UNALIGNED_ACCESS rs6
 
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS rs6000_can_change_mode_class
+
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT rs6000_constant_alignment
 
 
 /* Processor table.  */
@@ -39128,6 +39131,17 @@ rs6000_optab_supported_p (int op, machin
       return true;
     }
 }
+
+/* Implement TARGET_CONSTANT_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+rs6000_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  if (TREE_CODE (exp) == STRING_CST
+      && (STRICT_ALIGNMENT || !optimize_size))
+    return MAX (align, BITS_PER_WORD);
+  return align;
+}
 
 struct gcc_target targetm = TARGET_INITIALIZER;
 
Index: gcc/config/s390/s390.h
===================================================================
--- gcc/config/s390/s390.h	2017-09-15 14:47:33.178332233 +0100
+++ gcc/config/s390/s390.h	2017-09-22 17:37:26.781614386 +0100
@@ -315,7 +315,6 @@ #define BIGGEST_ALIGNMENT 64
 #define EMPTY_FIELD_BOUNDARY 32
 
 /* Alignment on even addresses for LARL instruction.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN) (ALIGN) < 16 ? 16 : (ALIGN)
 #define DATA_ABI_ALIGNMENT(TYPE, ALIGN) (ALIGN) < 16 ? 16 : (ALIGN)
 
 /* Alignment is not required by the hardware.  */
Index: gcc/config/s390/s390.c
===================================================================
--- gcc/config/s390/s390.c	2017-09-21 11:53:16.508848803 +0100
+++ gcc/config/s390/s390.c	2017-09-22 17:37:26.781614386 +0100
@@ -15906,6 +15906,15 @@ s390_vector_alignment (const_tree type)
   return MIN (64, tree_to_shwi (TYPE_SIZE (type)));
 }
 
+/* Implement TARGET_CONSTANT_ALIGNMENT.  Alignment on even addresses for
+   LARL instruction.  */
+
+static HOST_WIDE_INT
+s390_constant_alignment (const_tree, HOST_WIDE_INT align)
+{
+  return MAX (align, 16);
+}
+
 #ifdef HAVE_AS_MACHINE_MACHINEMODE
 /* Implement TARGET_ASM_FILE_START.  */
 static void
@@ -16325,6 +16334,9 @@ #define TARGET_OPTION_RESTORE s390_funct
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS s390_can_change_mode_class
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT s390_constant_alignment
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-s390.h"
Index: gcc/config/sh/sh.h
===================================================================
--- gcc/config/sh/sh.h	2017-09-15 14:47:33.178332233 +0100
+++ gcc/config/sh/sh.h	2017-09-22 17:37:26.782614386 +0100
@@ -462,12 +462,6 @@ #define BIGGEST_ALIGNMENT  (TARGET_ALIGN
 /* The best alignment to use in cases where we have a choice.  */
 #define FASTEST_ALIGNMENT (32)
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)	\
-  ((TREE_CODE (EXP) == STRING_CST	\
-    && (ALIGN) < FASTEST_ALIGNMENT)	\
-    ? FASTEST_ALIGNMENT : (ALIGN))
-
 /* get_mode_alignment assumes complex values are always held in multiple
    registers, but that is not the case on the SH; CQImode and CHImode are
    held in a single integer register.  */
Index: gcc/config/sh/sh.c
===================================================================
--- gcc/config/sh/sh.c	2017-09-15 13:56:20.288149017 +0100
+++ gcc/config/sh/sh.c	2017-09-22 17:37:26.782614386 +0100
@@ -657,6 +657,9 @@ #define TARGET_MODES_TIEABLE_P sh_modes_
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS sh_can_change_mode_class
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 
Index: gcc/config/sparc/sparc.h
===================================================================
--- gcc/config/sparc/sparc.h	2017-09-15 14:47:33.178332233 +0100
+++ gcc/config/sparc/sparc.h	2017-09-22 17:37:26.784614385 +0100
@@ -579,12 +579,6 @@ #define MAX_FIXED_MODE_SIZE GET_MODE_BIT
 #define STACK_SAVEAREA_MODE(LEVEL) \
   ((LEVEL) == SAVE_NONLOCAL ? (TARGET_ARCH64 ? TImode : DImode) : Pmode)
 
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  ((TREE_CODE (EXP) == STRING_CST	\
-    && (ALIGN) < FASTEST_ALIGNMENT)	\
-   ? FASTEST_ALIGNMENT : (ALIGN))
-
 /* Make arrays of chars word-aligned for the same reasons.  */
 #define DATA_ALIGNMENT(TYPE, ALIGN)		\
   (TREE_CODE (TYPE) == ARRAY_TYPE		\
Index: gcc/config/sparc/sparc.c
===================================================================
--- gcc/config/sparc/sparc.c	2017-09-21 11:53:16.532263818 +0100
+++ gcc/config/sparc/sparc.c	2017-09-22 17:37:26.784614385 +0100
@@ -684,6 +684,7 @@ static bool sparc_hard_regno_mode_ok (un
 static bool sparc_modes_tieable_p (machine_mode, machine_mode);
 static bool sparc_can_change_mode_class (machine_mode, machine_mode,
 					 reg_class_t);
+static HOST_WIDE_INT sparc_constant_alignment (const_tree, HOST_WIDE_INT);
 
 #ifdef SUBTARGET_ATTRIBUTE_TABLE
 /* Table of valid machine attributes.  */
@@ -925,6 +926,9 @@ #define TARGET_MODES_TIEABLE_P sparc_mod
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS sparc_can_change_mode_class
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT sparc_constant_alignment
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Return the memory reference contained in X if any, zero otherwise.  */
@@ -13429,4 +13433,14 @@ sparc_can_change_mode_class (machine_mod
   return true;
 }
 
+/* Implement TARGET_CONSTANT_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+sparc_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  if (TREE_CODE (exp) == STRING_CST)
+    return MAX (align, FASTEST_ALIGNMENT);
+  return align;
+}
+
 #include "gt-sparc.h"
Index: gcc/config/spu/spu.h
===================================================================
--- gcc/config/spu/spu.h	2017-09-15 15:37:22.133931616 +0100
+++ gcc/config/spu/spu.h	2017-09-22 17:37:26.785614385 +0100
@@ -96,7 +96,6 @@ #define MINIMUM_ATOMIC_ALIGNMENT 128
    on the stack.  (Except a bug (?) allows some stack objects to be
    unaligned.)  */
 #define DATA_ALIGNMENT(TYPE,ALIGN) ((ALIGN) > 128 ? (ALIGN) : 128)
-#define CONSTANT_ALIGNMENT(TYPE,ALIGN) ((ALIGN) > 128 ? (ALIGN) : 128)
 #define LOCAL_ALIGNMENT(TYPE,ALIGN) ((ALIGN) > 128 ? (ALIGN) : 128)
 
 #define EMPTY_FIELD_BOUNDARY 32
Index: gcc/config/spu/spu.c
===================================================================
--- gcc/config/spu/spu.c	2017-09-21 22:36:18.178401236 +0100
+++ gcc/config/spu/spu.c	2017-09-22 17:37:26.785614385 +0100
@@ -4159,7 +4159,7 @@ spu_encode_section_info (tree decl, rtx
    which is both 16-byte aligned and padded to a 16-byte boundary.  This
    would make it safe to store with a single instruction. 
    We guarantee the alignment and padding for static objects by aligning
-   all of them to 16-bytes. (DATA_ALIGNMENT and CONSTANT_ALIGNMENT.)
+   all of them to 16-bytes. (DATA_ALIGNMENT and TARGET_CONSTANT_ALIGNMENT.)
    FIXME: We currently cannot guarantee this for objects on the stack
    because assign_parm_setup_stack calls assign_stack_local with the
    alignment of the parameter mode and in that case the alignment never
@@ -7193,6 +7193,18 @@ spu_truly_noop_truncation (unsigned int
 {
   return inprec <= 32 && outprec <= inprec;
 }
+
+/* Implement TARGET_CONSTANT_ALIGNMENT.
+
+   Make all static objects 16-byte aligned.  This allows us to assume
+   they are also padded to 16 bytes, which means we can use a single
+   load or store instruction to access them.  */
+
+static HOST_WIDE_INT
+spu_constant_alignment (const_tree, HOST_WIDE_INT align)
+{
+  return MAX (align, 128);
+}
 
 /*  Table of machine attributes.  */
 static const struct attribute_spec spu_attribute_table[] =
@@ -7433,6 +7445,9 @@ #define TARGET_CAN_CHANGE_MODE_CLASS spu
 #undef TARGET_TRULY_NOOP_TRUNCATION
 #define TARGET_TRULY_NOOP_TRUNCATION spu_truly_noop_truncation
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT spu_constant_alignment
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-spu.h"
Index: gcc/config/stormy16/stormy16.h
===================================================================
--- gcc/config/stormy16/stormy16.h	2017-09-15 14:47:33.179332125 +0100
+++ gcc/config/stormy16/stormy16.h	2017-09-22 17:37:26.785614385 +0100
@@ -87,10 +87,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)		\
    && TYPE_MODE (TREE_TYPE (TYPE)) == QImode	\
    && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
 
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  (TREE_CODE (EXP) == STRING_CST	\
-   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
-
 #define STRICT_ALIGNMENT 1
 
 #define PCC_BITFIELD_TYPE_MATTERS 1
Index: gcc/config/stormy16/stormy16.c
===================================================================
--- gcc/config/stormy16/stormy16.c	2017-09-04 11:50:08.540041564 +0100
+++ gcc/config/stormy16/stormy16.c	2017-09-22 17:37:26.785614385 +0100
@@ -2715,6 +2715,9 @@ #define TARGET_HARD_REGNO_MODE_OK xstorm
 #undef TARGET_MODES_TIEABLE_P
 #define TARGET_MODES_TIEABLE_P xstormy16_modes_tieable_p
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-stormy16.h"
Index: gcc/config/tilegx/tilegx.h
===================================================================
--- gcc/config/tilegx/tilegx.h	2017-09-15 14:47:33.180332018 +0100
+++ gcc/config/tilegx/tilegx.h	2017-09-22 17:37:26.786614385 +0100
@@ -94,13 +94,6 @@ #define FASTEST_ALIGNMENT 64
 #define BIGGEST_FIELD_ALIGNMENT 128
 #define WIDEST_HARDWARE_FP_SIZE 64
 
-/* Make strings word-aligned so strcpy from constants will be
-   faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  ((TREE_CODE (EXP) == STRING_CST	\
-    && (ALIGN) < FASTEST_ALIGNMENT)	\
-   ? FASTEST_ALIGNMENT : (ALIGN))
-
 /* Make arrays of chars word-aligned for the same reasons.  */
 #define DATA_ALIGNMENT(TYPE, ALIGN)		\
   (TREE_CODE (TYPE) == ARRAY_TYPE		\
Index: gcc/config/tilegx/tilegx.c
===================================================================
--- gcc/config/tilegx/tilegx.c	2017-09-15 14:47:33.180332018 +0100
+++ gcc/config/tilegx/tilegx.c	2017-09-22 17:37:26.786614385 +0100
@@ -5734,6 +5734,9 @@ #define TARGET_CAN_USE_DOLOOP_P can_use_
 #undef  TARGET_TRULY_NOOP_TRUNCATION
 #define TARGET_TRULY_NOOP_TRUNCATION tilegx_truly_noop_truncation
 
+#undef  TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-tilegx.h"
Index: gcc/config/tilepro/tilepro.h
===================================================================
--- gcc/config/tilepro/tilepro.h	2017-09-15 14:47:33.180332018 +0100
+++ gcc/config/tilepro/tilepro.h	2017-09-22 17:37:26.787614385 +0100
@@ -58,13 +58,6 @@ #define PCC_BITFIELD_TYPE_MATTERS 1
 #define FASTEST_ALIGNMENT 32
 #define BIGGEST_FIELD_ALIGNMENT 64
 
-/* Make strings word-aligned so strcpy from constants will be
-   faster.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
-  ((TREE_CODE (EXP) == STRING_CST	\
-    && (ALIGN) < FASTEST_ALIGNMENT)	\
-   ? FASTEST_ALIGNMENT : (ALIGN))
-
 /* Make arrays of chars word-aligned for the same reasons.  */
 #define DATA_ALIGNMENT(TYPE, ALIGN)		\
   (TREE_CODE (TYPE) == ARRAY_TYPE		\
Index: gcc/config/tilepro/tilepro.c
===================================================================
--- gcc/config/tilepro/tilepro.c	2017-09-04 08:30:09.354408112 +0100
+++ gcc/config/tilepro/tilepro.c	2017-09-22 17:37:26.786614385 +0100
@@ -5091,6 +5091,9 @@ #define TARGET_ASM_FILE_END tilepro_file
 #undef  TARGET_CAN_USE_DOLOOP_P
 #define TARGET_CAN_USE_DOLOOP_P can_use_doloop_if_innermost
 
+#undef  TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-tilepro.h"
Index: gcc/config/visium/visium.h
===================================================================
--- gcc/config/visium/visium.h	2017-09-15 14:47:33.181331910 +0100
+++ gcc/config/visium/visium.h	2017-09-22 17:37:26.787614385 +0100
@@ -236,16 +236,6 @@ #define BIGGEST_ALIGNMENT 32
    this macro is used instead of that alignment to align the object. */
 #define DATA_ALIGNMENT(TYPE,ALIGN) visium_data_alignment (TYPE, ALIGN)
 
-/* `CONSTANT_ALIGNMENT (CONSTANT, BASIC-ALIGN)`
-
-   If defined, a C expression to compute the alignment given to a
-   constant that is being placed in memory.  CONSTANT is the constant
-   and BASIC-ALIGN is the alignment that the object would ordinarily
-   have.  The value of this macro is used instead of that alignment to
-   align the object. */
-#define CONSTANT_ALIGNMENT(EXP,ALIGN) \
-  visium_data_alignment (TREE_TYPE (EXP), ALIGN)
-
 /* `LOCAL_ALIGNMENT (TYPE, BASIC-ALIGN)`
 
    If defined, a C expression to compute the alignment for a variable
Index: gcc/config/visium/visium.c
===================================================================
--- gcc/config/visium/visium.c	2017-09-15 13:56:20.293149098 +0100
+++ gcc/config/visium/visium.c	2017-09-22 17:37:26.787614385 +0100
@@ -237,6 +237,8 @@ static bool visium_modes_tieable_p (mach
 static bool visium_can_change_mode_class (machine_mode, machine_mode,
 					  reg_class_t);
 
+static HOST_WIDE_INT visium_constant_alignment (const_tree, HOST_WIDE_INT);
+
 /* Setup the global target hooks structure.  */
 
 #undef  TARGET_MAX_ANCHOR_OFFSET
@@ -360,6 +362,9 @@ #define TARGET_MODES_TIEABLE_P visium_mo
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS visium_can_change_mode_class
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT visium_constant_alignment
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 namespace {
@@ -834,6 +839,14 @@ visium_data_alignment (tree type, unsign
   return align;
 }
 
+/* Implement TARGET_CONSTANT_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+visium_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  return visium_data_alignment (TREE_TYPE (exp), align);
+}
+
 /* Helper function for HARD_REGNO_RENAME_OK (FROM, TO).  Return non-zero if
    it is OK to rename a hard register FROM to another hard register TO.  */
 
Index: gcc/config/xtensa/xtensa.h
===================================================================
--- gcc/config/xtensa/xtensa.h	2017-09-15 14:47:33.181331910 +0100
+++ gcc/config/xtensa/xtensa.h	2017-09-22 17:37:26.788614385 +0100
@@ -169,17 +169,6 @@ #define PROMOTE_MODE(MODE, UNSIGNEDP, TY
    bitfields and the structures that contain them.  */
 #define PCC_BITFIELD_TYPE_MATTERS 1
 
-/* Align string constants and constructors to at least a word boundary.
-   The typical use of this macro is to increase alignment for string
-   constants to be word aligned so that 'strcpy' calls that copy
-   constants can be done inline.  */
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)					\
-  (!optimize_size &&							\
-   (TREE_CODE (EXP) == STRING_CST || TREE_CODE (EXP) == CONSTRUCTOR)	\
-   && (ALIGN) < BITS_PER_WORD						\
-	? BITS_PER_WORD							\
-	: (ALIGN))
-
 /* Align arrays, unions and records to at least a word boundary.
    One use of this macro is to increase alignment of medium-size
    data to make it all fit in fewer cache lines.  Another is to
Index: gcc/config/xtensa/xtensa.c
===================================================================
--- gcc/config/xtensa/xtensa.c	2017-09-12 14:29:25.261529490 +0100
+++ gcc/config/xtensa/xtensa.c	2017-09-22 17:37:26.788614385 +0100
@@ -181,6 +181,7 @@ static void xtensa_conditional_register_
 static unsigned int xtensa_hard_regno_nregs (unsigned int, machine_mode);
 static bool xtensa_hard_regno_mode_ok (unsigned int, machine_mode);
 static bool xtensa_modes_tieable_p (machine_mode, machine_mode);
+static HOST_WIDE_INT xtensa_constant_alignment (const_tree, HOST_WIDE_INT);
 
 
 
@@ -317,6 +318,9 @@ #define TARGET_HARD_REGNO_MODE_OK xtensa
 #undef TARGET_MODES_TIEABLE_P
 #define TARGET_MODES_TIEABLE_P xtensa_modes_tieable_p
 
+#undef TARGET_CONSTANT_ALIGNMENT
+#define TARGET_CONSTANT_ALIGNMENT xtensa_constant_alignment
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 
@@ -4380,4 +4384,19 @@ enum reg_class xtensa_regno_to_class (in
     return regno_to_class[regno];
 }
 
+/* Implement TARGET_CONSTANT_ALIGNMENT.  Align string constants and
+   constructors to at least a word boundary.  The typical use of this
+   macro is to increase alignment for string constants to be word
+   aligned so that 'strcpy' calls that copy constants can be done
+   inline.  */
+
+static HOST_WIDE_INT
+xtensa_constant_alignment (const_tree exp, HOST_WIDE_INT align)
+{
+  if ((TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)
+      && !optimize_size)
+    return MAX (align, BITS_PER_WORD);
+  return align;
+}
+
 #include "gt-xtensa.h"
Index: gcc/system.h
===================================================================
--- gcc/system.h	2017-09-15 15:37:22.136931501 +0100
+++ gcc/system.h	2017-09-22 17:37:26.790614385 +0100
@@ -915,7 +915,7 @@ #define realloc xrealloc
 	MODES_TIEABLE_P FUNCTION_ARG_PADDING SLOW_UNALIGNED_ACCESS	\
 	HARD_REGNO_NREGS SECONDARY_MEMORY_NEEDED_MODE			\
 	SECONDARY_MEMORY_NEEDED CANNOT_CHANGE_MODE_CLASS		\
-	TRULY_NOOP_TRUNCATION FUNCTION_ARG_OFFSET
+	TRULY_NOOP_TRUNCATION FUNCTION_ARG_OFFSET CONSTANT_ALIGNMENT
 
 /* Target macros only used for code built for the target, that have
    moved to libgcc-tm.h or have never been present elsewhere.  */
Richard Biener Sept. 25, 2017, 12:53 p.m. UTC | #5
On Fri, Sep 22, 2017 at 6:42 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> Richard Biener <richard.guenther@gmail.com> writes:

>> On Thu, Sep 21, 2017 at 2:56 PM, Richard Sandiford

>> <richard.sandiford@linaro.org> wrote:

>>> Richard Biener <richard.guenther@gmail.com> writes:

>>>> On September 20, 2017 2:36:03 PM GMT+02:00, Richard Sandiford

>>>> <richard.sandiford@linaro.org> wrote:

>>>>>When forcing a constant of mode MODE into memory, force_const_mem

>>>>>asks the frontend to provide the type associated with that mode.

>>>>>In principle type_for_mode is allowed to return null, and although

>>>>>one use site correctly handled that, the other didn't.

>>>>>

>>>>>I think there's agreement that it's bogus to use type_for_mode for

>>>>>this kind of thing, since it forces frontends to handle types that

>>>>>don't exist in that language.  See e.g. http://gcc.gnu.org/PR46805

>>>>>where the Go frontend was forced to handle vector types even though

>>>>>Go doesn't have vector types.

>>>>>

>>>>>Also, the frontends use code like:

>>>>>

>>>>>  else if (VECTOR_MODE_P (mode))

>>>>>    {

>>>>>      machine_mode inner_mode = GET_MODE_INNER (mode);

>>>>>      tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);

>>>>>      if (inner_type != NULL_TREE)

>>>>>        return build_vector_type_for_mode (inner_type, mode);

>>>>>    }

>>>>>

>>>>>and there's no guarantee that every vector mode M used by backend

>>>>>rtl has an associated vector type whose TYPE_MODE is M.  I think

>>>>>really the type_for_mode hook should only return trees that _do_ have

>>>>>the requested TYPE_MODE, but PR46805 linked above shows that this is

>>>>>likely to have too many knock-on consequences.  It doesn't make sense

>>>>>for force_const_mem to ask about vector modes that aren't valid for

>>>>>vector types, so this patch handles the condition there instead.

>>>>>

>>>>>This is needed for SVE multi-register modes, which are modelled as

>>>>>vector modes but are not usable as vector types.

>>>>>

>>>>>Tested on aarch64-linux-gnu, x86_64-linux-gnu and

>>>>>powerpc64le-linus-gnu.

>>>>>OK to install?

>>>>

>>>> I think we should get rid of the use entirely.

>>>

>>> I first read this as not using type_for_mode at all in force_const_mem,

>>> which sounded like a good thing :-)

>>

>> That's what I meant ;)  A mode doesn't really have a type...

>>

>>   I tried it overnight on the usual

>>> at-least-one-target-per-CPU set and diffing the before and after

>>> assembly for the testsuite.  And it looks like i686 relies on this

>>> to get an alignment of 16 rather than 4 for XFmode constants:

>>> GET_MODE_ALIGNMENT (XFmode) == 32 (as requested by i386-modes.def),

>>> but i386's CONSTANT_ALIGNMENT increases it to 128 for static constants.

>>

>> Then the issue is that CONSTANT_ALIGNMENT takes a tree and not a mode...

>> even worse than type_for_mode is a use of make_tree!  Incidentially

>> ix86_constant_alignment _does_ look at the mode in the end...

>

> OK, I guess this means another target hook conversion.  The patch

> below converts CONSTANT_ALIGNMENT with its current interface.

> The definition:

>

>   #define CONSTANT_ALIGNMENT(EXP, ALIGN) \

>     (TREE_CODE (EXP) == STRING_CST \

>      && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

>

> was very common, so the patch adds a canned definition for that,

> called constant_alignment_word_strings.  Some ports had a variation

> that used a port-local FASTEST_ALIGNMENT instead of BITS_PER_WORD;

> the patch uses constant_alignment_word_strings if FASTEST_ALIGNMENT

> was always BITS_PER_WORD and a port-local hook function otherwise.

>

> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.

> Also tested by comparing the testsuite assembly output on at least one

> target per CPU directory.  I don't think this comes under Jeff's

> preapproval due to the constant_alignment_word_strings thing, so:

> OK to install?


Ok.

Thanks,
Richard.

> If so, then I'll follow up with a separate hook for rtl modes, which

> varasm, default_constant_alignment and constant_alignment_word_strings

> can all use.

>

> Thanks,

> Richard

>

>

> 2017-09-22  Richard Sandiford  <richard.sandiford@linaro.org>

>

> gcc/

>         * target.def (constant_alignment): New hook.

>         * defaults.h (CONSTANT_ALIGNMENT): Delete.

>         * doc/tm.texi.in (CONSTANT_ALIGNMENT): Replace with...

>         (TARGET_CONSTANT_ALIGNMENT): ...this new hook.

>         * doc/tm.texi: Regenerate.

>         * targhooks.h (default_constant_alignment): Declare.

>         (constant_alignment_word_strings): Likewise.

>         * targhooks.c (default_constant_alignment): New function.

>         (constant_alignment_word_strings): Likewise.

>         * builtins.c (get_object_alignment_2): Use targetm.constant_alignment

>         instead of CONSTANT_ALIGNMENT.

>         * varasm.c (align_variable, get_variable_align, build_constant_desc)

>         (force_const_mem): Likewise.

>         * config/aarch64/aarch64.h (CONSTANT_ALIGNMENT): Delete.

>         * config/aarch64/aarch64.c (aarch64_constant_alignment): New function.

>         (aarch64_classify_address): Call it instead of CONSTANT_ALIGNMENT.

>         (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         * config/alpha/alpha.h (CONSTANT_ALIGNMENT): Delete commented-out

>         definition.

>         * config/arc/arc.h (CONSTANT_ALIGNMENT): Delete.

>         * config/arc/arc.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/arm/arm.h (CONSTANT_ALIGNMENT_FACTOR): Delete.

>         (CONSTANT_ALIGNMENT): Likewise.

>         * config/arm/arm.c (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         (arm_constant_alignment): New function.

>         * config/bfin/bfin.h (CONSTANT_ALIGNMENT): Delete.

>         * config/bfin/bfin.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/cr16/cr16.h (CONSTANT_ALIGNMENT): Delete.

>         * config/cr16/cr16.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/cris/cris.h (CONSTANT_ALIGNMENT): Delete.

>         * config/cris/cris.c (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         (cris_constant_alignment): New function.

>         * config/epiphany/epiphany.h (CONSTANT_ALIGNMENT): Delete.

>         * config/epiphany/epiphany.c (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         (epiphany_constant_alignment): New function.

>         * config/fr30/fr30.h (CONSTANT_ALIGNMENT): Delete.

>         * config/fr30/fr30.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/frv/frv.h (CONSTANT_ALIGNMENT): Delete.

>         * config/frv/frv.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/ft32/ft32.h (CONSTANT_ALIGNMENT): Delete.

>         * config/ft32/ft32.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/i386/i386.h (CONSTANT_ALIGNMENT): Delete.

>         * config/i386/i386-protos.h (ix86_constant_alignment): Delete.

>         * config/i386/i386.c (ix86_constant_alignment): Make static.

>         Use the same interface as the target hook.

>         (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         * config/ia64/ia64.h (CONSTANT_ALIGNMENT): Delete.

>         * config/ia64/ia64.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/iq2000/iq2000.h (CONSTANT_ALIGNMENT): Delete.

>         * config/iq2000/iq2000.c (iq2000_constant_alignment): New function.

>         (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         * config/lm32/lm32.h (CONSTANT_ALIGNMENT): Delete.

>         * config/lm32/lm32.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/m32r/m32r.h (CONSTANT_ALIGNMENT): Delete.

>         * config/m32r/m32r.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/mcore/mcore.h (CONSTANT_ALIGNMENT): Delete.

>         * config/mcore/mcore.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/microblaze/microblaze.h (CONSTANT_ALIGNMENT): Delete.

>         * config/microblaze/microblaze.c (microblaze_constant_alignment):

>         New function.

>         (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         * config/mips/mips.h (CONSTANT_ALIGNMENT): Delete.

>         * config/mips/mips.c (mips_constant_alignment): New function.

>         (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         * config/mmix/mmix.h (CONSTANT_ALIGNMENT): Delete.

>         * config/mmix/mmix-protos.h (mmix_constant_alignment): Delete.

>         * config/mmix/mmix.c (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         (mmix_constant_alignment): Make static.  Use the same interface

>         as the target hook.

>         * config/moxie/moxie.h (CONSTANT_ALIGNMENT): Delete.

>         * config/moxie/moxie.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/nios2/nios2.h (CONSTANT_ALIGNMENT): Delete.

>         * config/nios2/nios2.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/pa/pa.h (CONSTANT_ALIGNMENT): Delete.

>         * config/pa/pa.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/powerpcspe/powerpcspe.h (CONSTANT_ALIGNMENT): Delete.

>         * config/powerpcspe/powerpcspe.c (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         (rs6000_constant_alignment): New function.

>         * config/riscv/riscv.h (CONSTANT_ALIGNMENT): Delete.

>         * config/riscv/riscv.c (riscv_constant_alignment): New function.

>         (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         * config/rs6000/rs6000.h (CONSTANT_ALIGNMENT): Delete.

>         * config/rs6000/rs6000.c (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         (rs6000_constant_alignment): New function.

>         * config/s390/s390.h (CONSTANT_ALIGNMENT): Delete.

>         * config/s390/s390.c (s390_constant_alignment): New function.

>         (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         * config/sh/sh.h (CONSTANT_ALIGNMENT): Delete.

>         * config/sh/sh.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/sparc/sparc.h (CONSTANT_ALIGNMENT): Delete.

>         * config/sparc/sparc.c (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         (sparc_constant_alignment): New function.

>         * config/spu/spu.h (CONSTANT_ALIGNMENT): Delete.

>         * config/spu/spu.c (spu_constant_alignment): New function.

>         (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         * config/stormy16/stormy16.h (CONSTANT_ALIGNMENT): Delete.

>         * config/stormy16/stormy16.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/tilegx/tilegx.h (CONSTANT_ALIGNMENT): Delete.

>         * config/tilegx/tilegx.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/tilepro/tilepro.h (CONSTANT_ALIGNMENT): Delete.

>         * config/tilepro/tilepro.c (TARGET_CONSTANT_ALIGNMENT): Redefine to

>         constant_alignment_word_strings.

>         * config/visium/visium.h (CONSTANT_ALIGNMENT): Delete.

>         * config/visium/visium.c (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         (visium_constant_alignment): New function.

>         * config/xtensa/xtensa.h (CONSTANT_ALIGNMENT): Delete.

>         * config/xtensa/xtensa.c (TARGET_CONSTANT_ALIGNMENT): Redefine.

>         (xtensa_constant_alignment): New function.

>         * system.h (CONSTANT_ALIGNMENT): Poison.

>

> Index: gcc/target.def

> ===================================================================

> --- gcc/target.def      2017-09-22 17:31:56.428954480 +0100

> +++ gcc/target.def      2017-09-22 17:37:26.791614385 +0100

> @@ -3335,6 +3335,21 @@ HOOK_VECTOR_END (addr_space)

>  #undef HOOK_PREFIX

>  #define HOOK_PREFIX "TARGET_"

>

> +DEFHOOK

> +(constant_alignment,

> + "This hook returns the alignment in bits of a constant that is being\n\

> +placed in memory.  @var{constant} is the constant and @var{basic_align}\n\

> +is the alignment that the object would ordinarily have.\n\

> +\n\

> +The default definition just returns @var{basic_align}.\n\

> +\n\

> +The typical use of this hook is to increase alignment for string\n\

> +constants to be word aligned so that @code{strcpy} calls that copy\n\

> +constants can be done inline.  The function\n\

> +@code{constant_alignment_word_strings} provides such a definition.",

> + HOST_WIDE_INT, (const_tree constant, HOST_WIDE_INT basic_align),

> + default_constant_alignment)

> +

>  /* True if MODE is valid for the target.  By "valid", we mean able to

>     be manipulated in non-trivial ways.  In particular, this means all

>     the arithmetic is supported.  */

> Index: gcc/defaults.h

> ===================================================================

> --- gcc/defaults.h      2017-09-12 14:27:14.524325620 +0100

> +++ gcc/defaults.h      2017-09-22 17:37:26.788614385 +0100

> @@ -1265,10 +1265,6 @@ #define WORD_REGISTER_OPERATIONS 0

>  #define LOAD_EXTEND_OP(M) UNKNOWN

>  #endif

>

> -#ifndef CONSTANT_ALIGNMENT

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN) ALIGN

> -#endif

> -

>  #ifndef INITIAL_FRAME_ADDRESS_RTX

>  #define INITIAL_FRAME_ADDRESS_RTX NULL

>  #endif

> Index: gcc/doc/tm.texi.in

> ===================================================================

> --- gcc/doc/tm.texi.in  2017-09-22 17:31:36.934389276 +0100

> +++ gcc/doc/tm.texi.in  2017-09-22 17:37:26.790614385 +0100

> @@ -1050,19 +1050,7 @@ must be aligned to 16 byte boundaries.

>  If this macro is not defined, then @var{basic-align} is used.

>  @end defmac

>

> -@defmac CONSTANT_ALIGNMENT (@var{constant}, @var{basic-align})

> -If defined, a C expression to compute the alignment given to a constant

> -that is being placed in memory.  @var{constant} is the constant and

> -@var{basic-align} is the alignment that the object would ordinarily

> -have.  The value of this macro is used instead of that alignment to

> -align the object.

> -

> -The default definition just returns @var{basic-align}.

> -

> -The typical use of this macro is to increase alignment for string

> -constants to be word aligned so that @code{strcpy} calls that copy

> -constants can be done inline.

> -@end defmac

> +@hook TARGET_CONSTANT_ALIGNMENT

>

>  @defmac LOCAL_ALIGNMENT (@var{type}, @var{basic-align})

>  If defined, a C expression to compute the alignment for a variable in

> Index: gcc/doc/tm.texi

> ===================================================================

> --- gcc/doc/tm.texi     2017-09-22 17:31:56.428006577 +0100

> +++ gcc/doc/tm.texi     2017-09-22 17:37:26.789614385 +0100

> @@ -1102,19 +1102,18 @@ must be aligned to 16 byte boundaries.

>  If this macro is not defined, then @var{basic-align} is used.

>  @end defmac

>

> -@defmac CONSTANT_ALIGNMENT (@var{constant}, @var{basic-align})

> -If defined, a C expression to compute the alignment given to a constant

> -that is being placed in memory.  @var{constant} is the constant and

> -@var{basic-align} is the alignment that the object would ordinarily

> -have.  The value of this macro is used instead of that alignment to

> -align the object.

> +@deftypefn {Target Hook} HOST_WIDE_INT TARGET_CONSTANT_ALIGNMENT (const_tree @var{constant}, HOST_WIDE_INT @var{basic_align})

> +This hook returns the alignment in bits of a constant that is being

> +placed in memory.  @var{constant} is the constant and @var{basic_align}

> +is the alignment that the object would ordinarily have.

>

> -The default definition just returns @var{basic-align}.

> +The default definition just returns @var{basic_align}.

>

> -The typical use of this macro is to increase alignment for string

> +The typical use of this hook is to increase alignment for string

>  constants to be word aligned so that @code{strcpy} calls that copy

> -constants can be done inline.

> -@end defmac

> +constants can be done inline.  The function

> +@code{constant_alignment_word_strings} provides such a definition.

> +@end deftypefn

>

>  @defmac LOCAL_ALIGNMENT (@var{type}, @var{basic-align})

>  If defined, a C expression to compute the alignment for a variable in

> Index: gcc/targhooks.h

> ===================================================================

> --- gcc/targhooks.h     2017-09-22 17:31:36.935337179 +0100

> +++ gcc/targhooks.h     2017-09-22 17:37:26.791614385 +0100

> @@ -93,6 +93,9 @@ extern int default_builtin_vectorization

>

>  extern tree default_builtin_reciprocal (tree);

>

> +extern HOST_WIDE_INT default_constant_alignment (const_tree, HOST_WIDE_INT);

> +extern HOST_WIDE_INT constant_alignment_word_strings (const_tree,

> +                                                     HOST_WIDE_INT);

>  extern HOST_WIDE_INT default_vector_alignment (const_tree);

>

>  extern HOST_WIDE_INT default_preferred_vector_alignment (const_tree);

> Index: gcc/targhooks.c

> ===================================================================

> --- gcc/targhooks.c     2017-09-22 17:31:36.935337179 +0100

> +++ gcc/targhooks.c     2017-09-22 17:37:26.791614385 +0100

> @@ -1165,6 +1165,25 @@ tree default_mangle_decl_assembler_name

>     return id;

>  }

>

> +/* The default implementation of TARGET_CONSTANT_ALIGNMENT.  */

> +

> +HOST_WIDE_INT

> +default_constant_alignment (const_tree, HOST_WIDE_INT align)

> +{

> +  return align;

> +}

> +

> +/* An implementation of TARGET_CONSTANT_ALIGNMENT that aligns strings

> +   to at least BITS_PER_WORD but otherwise makes no changes.  */

> +

> +HOST_WIDE_INT

> +constant_alignment_word_strings (const_tree exp, HOST_WIDE_INT align)

> +{

> +  if (TREE_CODE (exp) == STRING_CST)

> +    return MAX (align, BITS_PER_WORD);

> +  return align;

> +}

> +

>  /* Default to natural alignment for vector types.  */

>  HOST_WIDE_INT

>  default_vector_alignment (const_tree type)

> Index: gcc/builtins.c

> ===================================================================

> --- gcc/builtins.c      2017-09-05 20:56:49.744887619 +0100

> +++ gcc/builtins.c      2017-09-22 17:37:26.746614388 +0100

> @@ -283,7 +283,7 @@ get_object_alignment_2 (tree exp, unsign

>        exp = DECL_INITIAL (exp);

>        align = TYPE_ALIGN (TREE_TYPE (exp));

>        if (CONSTANT_CLASS_P (exp))

> -       align = (unsigned) CONSTANT_ALIGNMENT (exp, align);

> +       align = targetm.constant_alignment (exp, align);

>

>        known_alignment = true;

>      }

> @@ -359,7 +359,7 @@ get_object_alignment_2 (tree exp, unsign

>           wrapped inside a CONST_DECL.  */

>        align = TYPE_ALIGN (TREE_TYPE (exp));

>        if (CONSTANT_CLASS_P (exp))

> -       align = (unsigned) CONSTANT_ALIGNMENT (exp, align);

> +       align = targetm.constant_alignment (exp, align);

>

>        known_alignment = true;

>      }

> Index: gcc/varasm.c

> ===================================================================

> --- gcc/varasm.c        2017-09-21 22:34:52.782138953 +0100

> +++ gcc/varasm.c        2017-09-22 17:37:26.792614385 +0100

> @@ -1055,7 +1055,7 @@ align_variable (tree decl, bool dont_out

>               && (in_lto_p || DECL_INITIAL (decl) != error_mark_node))

>             {

>               unsigned int const_align

> -               = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);

> +               = targetm.constant_alignment (DECL_INITIAL (decl), align);

>               /* Don't increase alignment too much for TLS variables - TLS

>                  space is too precious.  */

>               if (! DECL_THREAD_LOCAL_P (decl) || const_align <= BITS_PER_WORD)

> @@ -1106,8 +1106,8 @@ get_variable_align (tree decl)

>              to mark offlined constructors.  */

>           && (in_lto_p || DECL_INITIAL (decl) != error_mark_node))

>         {

> -         unsigned int const_align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl),

> -                                                        align);

> +         unsigned int const_align

> +           = targetm.constant_alignment (DECL_INITIAL (decl), align);

>           /* Don't increase alignment too much for TLS variables - TLS space

>              is too precious.  */

>           if (! DECL_THREAD_LOCAL_P (decl) || const_align <= BITS_PER_WORD)

> @@ -3326,12 +3326,10 @@ build_constant_desc (tree exp)

>       Instead we set the flag that will be recognized in make_decl_rtl.  */

>    DECL_IN_CONSTANT_POOL (decl) = 1;

>    DECL_INITIAL (decl) = desc->value;

> -  /* ??? CONSTANT_ALIGNMENT hasn't been updated for vector types on most

> -     architectures so use DATA_ALIGNMENT as well, except for strings.  */

> +  /* ??? targetm.constant_alignment hasn't been updated for vector types on

> +     most architectures so use DATA_ALIGNMENT as well, except for strings.  */

>    if (TREE_CODE (exp) == STRING_CST)

> -    {

> -      SET_DECL_ALIGN (decl, CONSTANT_ALIGNMENT (exp, DECL_ALIGN (decl)));

> -    }

> +    SET_DECL_ALIGN (decl, targetm.constant_alignment (exp, DECL_ALIGN (decl)));

>    else

>      align_variable (decl, 0);

>

> @@ -3790,7 +3788,7 @@ force_const_mem (machine_mode mode, rtx

>

>    tree type = lang_hooks.types.type_for_mode (mode, 0);

>    if (type != NULL_TREE)

> -    align = CONSTANT_ALIGNMENT (make_tree (type, x), align);

> +    align = targetm.constant_alignment (make_tree (type, x), align);

>

>    pool->offset += (align / BITS_PER_UNIT) - 1;

>    pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);

> Index: gcc/config/aarch64/aarch64.h

> ===================================================================

> --- gcc/config/aarch64/aarch64.h        2017-09-21 22:35:16.977238356 +0100

> +++ gcc/config/aarch64/aarch64.h        2017-09-22 17:37:26.747614388 +0100

> @@ -90,14 +90,6 @@ #define LONG_DOUBLE_TYPE_SIZE        128

>     port.  */

>  #define TARGET_PTRMEMFUNC_VBIT_LOCATION ptrmemfunc_vbit_in_delta

>

> -/* Make strings word-aligned so that strcpy from constants will be

> -   faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)         \

> -  ((TREE_CODE (EXP) == STRING_CST              \

> -    && !optimize_size                          \

> -    && (ALIGN) < BITS_PER_WORD)                        \

> -   ? BITS_PER_WORD : ALIGN)

> -

>  /* Align definitions of arrays, unions and structures so that

>     initializations and copies can be made more efficient.  This is not

>     ABI-changing, so it only affects places where we can see the

> Index: gcc/config/aarch64/aarch64.c

> ===================================================================

> --- gcc/config/aarch64/aarch64.c        2017-09-22 17:35:22.483794044 +0100

> +++ gcc/config/aarch64/aarch64.c        2017-09-22 17:37:26.747614388 +0100

> @@ -1142,6 +1142,17 @@ aarch64_hard_regno_caller_save_mode (uns

>      return choose_hard_reg_mode (regno, nregs, false);

>  }

>

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  Make strings word-aligned so

> +   that strcpy from constants will be faster.  */

> +

> +static HOST_WIDE_INT

> +aarch64_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  if (TREE_CODE (exp) == STRING_CST && !optimize_size)

> +    return MAX (align, BITS_PER_WORD);

> +  return align;

> +}

> +

>  /* Return true if calls to DECL should be treated as

>     long-calls (ie called via a register).  */

>  static bool

> @@ -4622,7 +4633,7 @@ aarch64_classify_address (struct aarch64

>                 {

>                   tree exp = SYMBOL_REF_DECL (sym);

>                   align = TYPE_ALIGN (TREE_TYPE (exp));

> -                 align = CONSTANT_ALIGNMENT (exp, align);

> +                 align = aarch64_constant_alignment (exp, align);

>                 }

>               else if (SYMBOL_REF_DECL (sym))

>                 align = DECL_ALIGN (SYMBOL_REF_DECL (sym));

> @@ -15687,6 +15698,9 @@ #define TARGET_MODES_TIEABLE_P aarch64_m

>  #define TARGET_HARD_REGNO_CALL_PART_CLOBBERED \

>    aarch64_hard_regno_call_part_clobbered

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT aarch64_constant_alignment

> +

>  #if CHECKING_P

>  #undef TARGET_RUN_TARGET_SELFTESTS

>  #define TARGET_RUN_TARGET_SELFTESTS selftest::aarch64_run_selftests

> Index: gcc/config/alpha/alpha.h

> ===================================================================

> --- gcc/config/alpha/alpha.h    2017-09-15 14:47:33.167333414 +0100

> +++ gcc/config/alpha/alpha.h    2017-09-22 17:37:26.748614388 +0100

> @@ -289,7 +289,6 @@ #define MINIMUM_ATOMIC_ALIGNMENT ((unsig

>  /* ??? Only if block-move stuff knows about different source/destination

>     alignment.  */

>  #if 0

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN) MAX ((ALIGN), BITS_PER_WORD)

>  #define DATA_ALIGNMENT(EXP, ALIGN) MAX ((ALIGN), BITS_PER_WORD)

>  #endif

>

> Index: gcc/config/arc/arc.h

> ===================================================================

> --- gcc/config/arc/arc.h        2017-09-15 14:47:33.167333414 +0100

> +++ gcc/config/arc/arc.h        2017-09-22 17:37:26.749614388 +0100

> @@ -271,13 +271,6 @@ #define BIGGEST_ALIGNMENT 32

>  /* The best alignment to use in cases where we have a choice.  */

>  #define FASTEST_ALIGNMENT 32

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  ((TREE_CODE (EXP) == STRING_CST      \

> -    && (ALIGN) < FASTEST_ALIGNMENT)    \

> -   ? FASTEST_ALIGNMENT : (ALIGN))

> -

> -

>  /* Make arrays of chars word-aligned for the same reasons.  */

>  #define LOCAL_ALIGNMENT(TYPE, ALIGN)             \

>    (TREE_CODE (TYPE) == ARRAY_TYPE               \

> Index: gcc/config/arc/arc.c

> ===================================================================

> --- gcc/config/arc/arc.c        2017-09-12 14:29:25.225531070 +0100

> +++ gcc/config/arc/arc.c        2017-09-22 17:37:26.749614388 +0100

> @@ -10657,6 +10657,9 @@ arc_use_anchors_for_symbol_p (const_rtx

>  #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P

>  #define TARGET_USE_ANCHORS_FOR_SYMBOL_P arc_use_anchors_for_symbol_p

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-arc.h"

> Index: gcc/config/arm/arm.h

> ===================================================================

> --- gcc/config/arm/arm.h        2017-09-22 17:22:08.191305805 +0100

> +++ gcc/config/arm/arm.h        2017-09-22 17:37:26.752614387 +0100

> @@ -592,15 +592,6 @@ #define MALLOC_ABI_ALIGNMENT  BIGGEST_AL

>  #define BIGGEST_FIELD_ALIGNMENT 64

>  #endif

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT_FACTOR (TARGET_THUMB || ! arm_tune_xscale ? 1 : 2)

> -

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)                         \

> -   ((TREE_CODE (EXP) == STRING_CST                             \

> -     && !optimize_size                                         \

> -     && (ALIGN) < BITS_PER_WORD * CONSTANT_ALIGNMENT_FACTOR)   \

> -    ? BITS_PER_WORD * CONSTANT_ALIGNMENT_FACTOR : (ALIGN))

> -

>  /* Align definitions of arrays, unions and structures so that

>     initializations and copies can be made more efficient.  This is not

>     ABI-changing, so it only affects places where we can see the

> Index: gcc/config/arm/arm.c

> ===================================================================

> --- gcc/config/arm/arm.c        2017-09-22 17:35:22.486794044 +0100

> +++ gcc/config/arm/arm.c        2017-09-22 17:37:26.751614388 +0100

> @@ -316,6 +316,7 @@ static opt_scalar_float_mode arm_floatn_

>  static unsigned int arm_hard_regno_nregs (unsigned int, machine_mode);

>  static bool arm_hard_regno_mode_ok (unsigned int, machine_mode);

>  static bool arm_modes_tieable_p (machine_mode, machine_mode);

> +static HOST_WIDE_INT arm_constant_alignment (const_tree, HOST_WIDE_INT);

>

>  /* Table of machine attributes.  */

>  static const struct attribute_spec arm_attribute_table[] =

> @@ -795,6 +796,9 @@ #define TARGET_MODES_TIEABLE_P arm_modes

>

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS arm_can_change_mode_class

> +

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT arm_constant_alignment

>

>  /* Obstack for minipool constant handling.  */

>  static struct obstack minipool_obstack;

> @@ -31276,6 +31280,18 @@ arm_can_change_mode_class (machine_mode

>    return true;

>  }

>

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  Make strings word-aligned so

> +   strcpy from constants will be faster.  */

> +

> +static HOST_WIDE_INT

> +arm_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  unsigned int factor = (TARGET_THUMB || ! arm_tune_xscale ? 1 : 2);

> +  if (TREE_CODE (exp) == STRING_CST && !optimize_size)

> +    return MAX (align, BITS_PER_WORD * factor);

> +  return align;

> +}

> +

>  #if CHECKING_P

>  namespace selftest {

>

> Index: gcc/config/bfin/bfin.h

> ===================================================================

> --- gcc/config/bfin/bfin.h      2017-09-15 14:47:33.168333307 +0100

> +++ gcc/config/bfin/bfin.h      2017-09-22 17:37:26.753614387 +0100

> @@ -321,11 +321,6 @@ #define ACCUMULATE_OUTGOING_ARGS 1

>

>  #define LOCAL_ALIGNMENT(TYPE, ALIGN) bfin_local_alignment ((TYPE), (ALIGN))

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  (TREE_CODE (EXP) == STRING_CST        \

> -   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

> -

>  #define TRAMPOLINE_SIZE (TARGET_FDPIC ? 30 : 18)

>

>  /* Definitions for register eliminations.

> Index: gcc/config/bfin/bfin.c

> ===================================================================

> --- gcc/config/bfin/bfin.c      2017-09-12 14:29:25.228530938 +0100

> +++ gcc/config/bfin/bfin.c      2017-09-22 17:37:26.752614387 +0100

> @@ -5882,4 +5882,7 @@ #define TARGET_HARD_REGNO_MODE_OK bfin_h

>  #undef TARGET_MODES_TIEABLE_P

>  #define TARGET_MODES_TIEABLE_P bfin_modes_tieable_p

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

> Index: gcc/config/cr16/cr16.h

> ===================================================================

> --- gcc/config/cr16/cr16.h      2017-09-15 14:47:33.168333307 +0100

> +++ gcc/config/cr16/cr16.h      2017-09-22 17:37:26.753614387 +0100

> @@ -114,11 +114,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)

>       && ((ALIGN) < BITS_PER_WORD))               \

>       ? (BITS_PER_WORD) : (ALIGN))

>

> -/* In CR16 strings are word-aligned; strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(CONSTANT, ALIGN)                            \

> -  (((TREE_CODE (CONSTANT) == STRING_CST) && ((ALIGN) < BITS_PER_WORD)) \

> -     ? (BITS_PER_WORD) : (ALIGN))

> -

>  #define STRICT_ALIGNMENT 0

>

>  #define PCC_BITFIELD_TYPE_MATTERS 1

> Index: gcc/config/cr16/cr16.c

> ===================================================================

> --- gcc/config/cr16/cr16.c      2017-09-12 14:29:25.229530894 +0100

> +++ gcc/config/cr16/cr16.c      2017-09-22 17:37:26.753614387 +0100

> @@ -200,6 +200,9 @@ #define TARGET_REGISTER_MOVE_COST   cr16_

>  #undef TARGET_MEMORY_MOVE_COST

>  #define TARGET_MEMORY_MOVE_COST        cr16_memory_move_cost

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT      constant_alignment_word_strings

> +

>  /* Table of machine attributes.  */

>  static const struct attribute_spec cr16_attribute_table[] = {

>    /* ISRs have special prologue and epilogue requirements.  */

> Index: gcc/config/cris/cris.h

> ===================================================================

> --- gcc/config/cris/cris.h      2017-09-15 14:47:33.169333199 +0100

> +++ gcc/config/cris/cris.h      2017-09-22 17:37:26.754614387 +0100

> @@ -368,17 +368,6 @@ #define DATA_ALIGNMENT(TYPE, BASIC_ALIGN

>       ? (BASIC_ALIGN < 32 ? 32 : BASIC_ALIGN)                   \

>       : (BASIC_ALIGN < 16 ? 16 : BASIC_ALIGN)) : BASIC_ALIGN)

>

> -/* Note that CONSTANT_ALIGNMENT has the effect of making gcc believe that

> -   ALL references to constant stuff (in code segment, like strings) has

> -   this alignment.  That is a rather rushed assumption.  Luckily we do not

> -   care about the "alignment" operand to builtin memcpy (only place where

> -   it counts), so it doesn't affect any bad spots.  */

> -#define CONSTANT_ALIGNMENT(CONSTANT, BASIC_ALIGN)              \

> - (TARGET_CONST_ALIGN                                           \

> -  ? (TARGET_ALIGN_BY_32                                                \

> -     ? (BASIC_ALIGN < 32 ? 32 : BASIC_ALIGN)                   \

> -     : (BASIC_ALIGN < 16 ? 16 : BASIC_ALIGN)) : BASIC_ALIGN)

> -

>  /* FIXME: Define LOCAL_ALIGNMENT for word and dword or arrays and

>     structures (if -mstack-align=), and check that it is good.  */

>

> Index: gcc/config/cris/cris.c

> ===================================================================

> --- gcc/config/cris/cris.c      2017-09-12 14:29:25.229530894 +0100

> +++ gcc/config/cris/cris.c      2017-09-22 17:37:26.754614387 +0100

> @@ -165,6 +165,7 @@ static bool cris_function_value_regno_p

>  static void cris_file_end (void);

>  static unsigned int cris_hard_regno_nregs (unsigned int, machine_mode);

>  static bool cris_hard_regno_mode_ok (unsigned int, machine_mode);

> +static HOST_WIDE_INT cris_constant_alignment (const_tree, HOST_WIDE_INT);

>

>  /* This is the parsed result of the "-max-stack-stackframe=" option.  If

>     it (still) is zero, then there was no such option given.  */

> @@ -287,6 +288,9 @@ #define TARGET_HARD_REGNO_NREGS cris_har

>  #undef TARGET_HARD_REGNO_MODE_OK

>  #define TARGET_HARD_REGNO_MODE_OK cris_hard_regno_mode_ok

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT cris_constant_alignment

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  /* Helper for cris_load_multiple_op and cris_ret_movem_op.  */

> @@ -4325,6 +4329,23 @@ cris_hard_regno_mode_ok (unsigned int re

>               || (regno != CRIS_MOF_REGNUM && regno != CRIS_ACR_REGNUM)));

>  }

>

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  Note that this hook has the

> +   effect of making gcc believe that ALL references to constant stuff

> +   (in code segment, like strings) have this alignment.  That is a rather

> +   rushed assumption.  Luckily we do not care about the "alignment"

> +   operand to builtin memcpy (only place where it counts), so it doesn't

> +   affect any bad spots.  */

> +

> +static HOST_WIDE_INT

> +cris_constant_alignment (const_tree, HOST_WIDE_INT basic_align)

> +{

> +  if (!TARGET_CONST_ALIGN)

> +    return basic_align;

> +  if (TARGET_ALIGN_BY_32)

> +    return MAX (basic_align, 32);

> +  return MAX (basic_align, 16);

> +}

> +

>  #if 0

>  /* Various small functions to replace macros.  Only called from a

>     debugger.  They might collide with gcc functions or system functions,

> Index: gcc/config/epiphany/epiphany.h

> ===================================================================

> --- gcc/config/epiphany/epiphany.h      2017-09-15 14:47:33.169333199 +0100

> +++ gcc/config/epiphany/epiphany.h      2017-09-22 17:37:26.754614387 +0100

> @@ -147,12 +147,6 @@ #define FASTEST_ALIGNMENT 64

>

>  #define MALLOC_ABI_ALIGNMENT BIGGEST_ALIGNMENT

>

> -/* Make strings dword-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  ((TREE_CODE (EXP) == STRING_CST      \

> -    && (ALIGN) < FASTEST_ALIGNMENT)    \

> -   ? FASTEST_ALIGNMENT : (ALIGN))

> -

>  /* Make arrays of chars dword-aligned for the same reasons.

>     Also, align arrays of SImode items.  */

>  #define DATA_ALIGNMENT(TYPE, ALIGN)            \

> Index: gcc/config/epiphany/epiphany.c

> ===================================================================

> --- gcc/config/epiphany/epiphany.c      2017-09-04 11:49:42.897500726 +0100

> +++ gcc/config/epiphany/epiphany.c      2017-09-22 17:37:26.754614387 +0100

> @@ -173,6 +173,9 @@ #define TARGET_ASM_ALIGNED_SI_OP "\t.wor

>

>  #undef TARGET_HARD_REGNO_MODE_OK

>  #define TARGET_HARD_REGNO_MODE_OK epiphany_hard_regno_mode_ok

> +

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT epiphany_constant_alignment

>

>  bool

>  epiphany_is_interrupt_p (tree decl)

> @@ -3014,4 +3017,15 @@ epiphany_start_function (FILE *file, con

>    ASM_OUTPUT_FUNCTION_LABEL (file, name, decl);

>  }

>

> +

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +epiphany_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  if (TREE_CODE (exp) == STRING_CST)

> +    return MAX (align, FASTEST_ALIGNMENT);

> +  return align;

> +}

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

> Index: gcc/config/fr30/fr30.h

> ===================================================================

> --- gcc/config/fr30/fr30.h      2017-09-15 14:47:33.169333199 +0100

> +++ gcc/config/fr30/fr30.h      2017-09-22 17:37:26.755614387 +0100

> @@ -88,10 +88,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)          \

>     && TYPE_MODE (TREE_TYPE (TYPE)) == QImode   \

>     && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

>

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  (TREE_CODE (EXP) == STRING_CST       \

> -   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

> -

>  #define STRICT_ALIGNMENT 1

>

>  #define PCC_BITFIELD_TYPE_MATTERS 1

> Index: gcc/config/fr30/fr30.c

> ===================================================================

> --- gcc/config/fr30/fr30.c      2017-08-10 14:36:08.721447283 +0100

> +++ gcc/config/fr30/fr30.c      2017-09-22 17:37:26.754614387 +0100

> @@ -190,6 +190,9 @@ #define TARGET_ASM_TRAMPOLINE_TEMPLATE f

>  #undef TARGET_TRAMPOLINE_INIT

>  #define TARGET_TRAMPOLINE_INIT fr30_trampoline_init

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>

> Index: gcc/config/frv/frv.h

> ===================================================================

> --- gcc/config/frv/frv.h        2017-09-15 14:47:33.169333199 +0100

> +++ gcc/config/frv/frv.h        2017-09-22 17:37:26.756614387 +0100

> @@ -351,20 +351,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)                \

>     && TYPE_MODE (TREE_TYPE (TYPE)) == QImode   \

>     && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

>

> -/* If defined, a C expression to compute the alignment given to a constant that

> -   is being placed in memory.  CONSTANT is the constant and ALIGN is the

> -   alignment that the object would ordinarily have.  The value of this macro is

> -   used instead of that alignment to align the object.

> -

> -   If this macro is not defined, then ALIGN is used.

> -

> -   The typical use of this macro is to increase alignment for string constants

> -   to be word aligned so that `strcpy' calls that copy constants can be done

> -   inline.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  (TREE_CODE (EXP) == STRING_CST       \

> -   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

> -

>  /* Define this macro to be the value 1 if instructions will fail to work if

>     given data not on the nominal alignment.  If instructions will merely go

>     slower in that case, define this macro as 0.  */

> Index: gcc/config/frv/frv.c

> ===================================================================

> --- gcc/config/frv/frv.c        2017-09-12 14:29:25.231530806 +0100

> +++ gcc/config/frv/frv.c        2017-09-22 17:37:26.756614387 +0100

> @@ -523,6 +523,8 @@ #define TARGET_HARD_REGNO_NREGS frv_hard

>  #define TARGET_HARD_REGNO_MODE_OK frv_hard_regno_mode_ok

>  #undef TARGET_MODES_TIEABLE_P

>  #define TARGET_MODES_TIEABLE_P frv_modes_tieable_p

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

>

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

> Index: gcc/config/ft32/ft32.h

> ===================================================================

> --- gcc/config/ft32/ft32.h      2017-09-15 14:47:33.169333199 +0100

> +++ gcc/config/ft32/ft32.h      2017-09-22 17:37:26.756614387 +0100

> @@ -354,12 +354,6 @@ #define PCC_BITFIELD_TYPE_MATTERS

>     is GET_MODE_SIZE(DImode).  */

>  #define MAX_FIXED_MODE_SIZE 32

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  ((TREE_CODE (EXP) == STRING_CST       \

> -    && (ALIGN) < FASTEST_ALIGNMENT)     \

> -   ? FASTEST_ALIGNMENT : (ALIGN))

> -

>  /* Set this nonzero if move instructions will actually fail to work

>     when given unaligned data.  */

>  #define STRICT_ALIGNMENT 1

> Index: gcc/config/ft32/ft32.c

> ===================================================================

> --- gcc/config/ft32/ft32.c      2017-08-30 12:18:46.608141057 +0100

> +++ gcc/config/ft32/ft32.c      2017-09-22 17:37:26.756614387 +0100

> @@ -940,6 +940,9 @@ ft32_elf_encode_section_info (tree decl,

>      }

>  }

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-ft32.h"

> Index: gcc/config/i386/i386.h

> ===================================================================

> --- gcc/config/i386/i386.h      2017-09-21 11:53:16.598005975 +0100

> +++ gcc/config/i386/i386.h      2017-09-22 17:37:26.761614387 +0100

> @@ -848,20 +848,6 @@ #define ADJUST_FIELD_ALIGN(FIELD, TYPE,

>    x86_field_alignment ((TYPE), (COMPUTED))

>  #endif

>

> -/* If defined, a C expression to compute the alignment given to a

> -   constant that is being placed in memory.  EXP is the constant

> -   and ALIGN is the alignment that the object would ordinarily have.

> -   The value of this macro is used instead of that alignment to align

> -   the object.

> -

> -   If this macro is not defined, then ALIGN is used.

> -

> -   The typical use of this macro is to increase alignment for string

> -   constants to be word aligned so that `strcpy' calls that copy

> -   constants can be done inline.  */

> -

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN) ix86_constant_alignment ((EXP), (ALIGN))

> -

>  /* If defined, a C expression to compute the alignment for a static

>     variable.  TYPE is the data type, and ALIGN is the alignment that

>     the object would ordinarily have.  The value of this macro is used

> Index: gcc/config/i386/i386-protos.h

> ===================================================================

> --- gcc/config/i386/i386-protos.h       2017-09-15 13:56:20.266148661 +0100

> +++ gcc/config/i386/i386-protos.h       2017-09-22 17:37:26.756614387 +0100

> @@ -209,7 +209,6 @@ extern unsigned int ix86_local_alignment

>                                           unsigned int);

>  extern unsigned int ix86_minimum_alignment (tree, machine_mode,

>                                             unsigned int);

> -extern int ix86_constant_alignment (tree, int);

>  extern tree ix86_handle_shared_attribute (tree *, tree, tree, int, bool *);

>  extern tree ix86_handle_selectany_attribute (tree *, tree, tree, int, bool *);

>  extern int x86_field_alignment (tree, int);

> Index: gcc/config/i386/i386.c

> ===================================================================

> --- gcc/config/i386/i386.c      2017-09-22 17:31:56.418527551 +0100

> +++ gcc/config/i386/i386.c      2017-09-22 17:37:26.760614387 +0100

> @@ -31555,14 +31555,10 @@ ix86_sched_init_global (FILE *, int, int

>  }

>

>

> -/* Compute the alignment given to a constant that is being placed in memory.

> -   EXP is the constant and ALIGN is the alignment that the object would

> -   ordinarily have.

> -   The value of this function is used instead of that alignment to align

> -   the object.  */

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  */

>

> -int

> -ix86_constant_alignment (tree exp, int align)

> +static HOST_WIDE_INT

> +ix86_constant_alignment (const_tree exp, HOST_WIDE_INT align)

>  {

>    if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST

>        || TREE_CODE (exp) == INTEGER_CST)

> @@ -53601,6 +53597,9 @@ #define TARGET_HARD_REGNO_CALL_PART_CLOB

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS ix86_can_change_mode_class

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT ix86_constant_alignment

> +

>  #if CHECKING_P

>  #undef TARGET_RUN_TARGET_SELFTESTS

>  #define TARGET_RUN_TARGET_SELFTESTS selftest::ix86_run_selftests

> Index: gcc/config/ia64/ia64.h

> ===================================================================

> --- gcc/config/ia64/ia64.h      2017-09-15 14:47:33.170333092 +0100

> +++ gcc/config/ia64/ia64.h      2017-09-22 17:37:26.762614387 +0100

> @@ -185,15 +185,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)                \

>     && TYPE_MODE (TREE_TYPE (TYPE)) == QImode   \

>     && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

>

> -/* If defined, a C expression to compute the alignment given to a constant that

> -   is being placed in memory.  CONSTANT is the constant and ALIGN is the

> -   alignment that the object would ordinarily have.  The value of this macro is

> -   used instead of that alignment to align the object.  */

> -

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  (TREE_CODE (EXP) == STRING_CST       \

> -   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

> -

>  #define STRICT_ALIGNMENT 1

>

>  /* Define this if you wish to imitate the way many other C compilers handle

> Index: gcc/config/ia64/ia64.c

> ===================================================================

> --- gcc/config/ia64/ia64.c      2017-09-22 17:31:56.419475454 +0100

> +++ gcc/config/ia64/ia64.c      2017-09-22 17:37:26.762614387 +0100

> @@ -672,6 +672,9 @@ #define TARGET_MODES_TIEABLE_P ia64_mode

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS ia64_can_change_mode_class

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  /* Returns TRUE iff the target attribute indicated by ATTR_ID takes a plain

> Index: gcc/config/iq2000/iq2000.h

> ===================================================================

> --- gcc/config/iq2000/iq2000.h  2017-09-15 14:47:33.170333092 +0100

> +++ gcc/config/iq2000/iq2000.h  2017-09-22 17:37:26.763614387 +0100

> @@ -96,10 +96,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)

>         || TREE_CODE (TYPE) == UNION_TYPE                               \

>         || TREE_CODE (TYPE) == RECORD_TYPE)) ? BITS_PER_WORD : (ALIGN))

>

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)                                 \

> -  ((TREE_CODE (EXP) == STRING_CST  || TREE_CODE (EXP) == CONSTRUCTOR)  \

> -   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

> -

>  #define EMPTY_FIELD_BOUNDARY 32

>

>  #define STRUCTURE_SIZE_BOUNDARY 8

> Index: gcc/config/iq2000/iq2000.c

> ===================================================================

> --- gcc/config/iq2000/iq2000.c  2017-09-04 11:50:24.548966298 +0100

> +++ gcc/config/iq2000/iq2000.c  2017-09-22 17:37:26.762614387 +0100

> @@ -180,6 +180,7 @@ static void iq2000_print_operand_address

>  static bool iq2000_print_operand_punct_valid_p (unsigned char code);

>  static bool iq2000_hard_regno_mode_ok (unsigned int, machine_mode);

>  static bool iq2000_modes_tieable_p (machine_mode, machine_mode);

> +static HOST_WIDE_INT iq2000_constant_alignment (const_tree, HOST_WIDE_INT);

>

>  #undef  TARGET_INIT_BUILTINS

>  #define TARGET_INIT_BUILTINS           iq2000_init_builtins

> @@ -264,6 +265,9 @@ #define TARGET_HARD_REGNO_MODE_OK   iq2000

>  #undef  TARGET_MODES_TIEABLE_P

>  #define TARGET_MODES_TIEABLE_P         iq2000_modes_tieable_p

>

> +#undef  TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT      iq2000_constant_alignment

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  /* Return nonzero if we split the address into high and low parts.  */

> @@ -3532,4 +3536,14 @@ iq2000_modes_tieable_p (machine_mode mod

>               || GET_MODE_CLASS (mode2) == MODE_COMPLEX_FLOAT));

>  }

>

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +iq2000_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  if (TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)

> +    return MAX (align, BITS_PER_WORD);

> +  return align;

> +}

> +

>  #include "gt-iq2000.h"

> Index: gcc/config/lm32/lm32.h

> ===================================================================

> --- gcc/config/lm32/lm32.h      2017-09-15 14:47:33.171332984 +0100

> +++ gcc/config/lm32/lm32.h      2017-09-22 17:37:26.763614387 +0100

> @@ -99,11 +99,6 @@ #define STRICT_ALIGNMENT 1

>

>  #define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  (TREE_CODE (EXP) == STRING_CST       \

> -   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

> -

>  /* Make arrays and structures word-aligned to allow faster copying etc.  */

>  #define DATA_ALIGNMENT(TYPE, ALIGN)                                    \

>    ((((ALIGN) < BITS_PER_WORD)                                          \

> Index: gcc/config/lm32/lm32.c

> ===================================================================

> --- gcc/config/lm32/lm32.c      2017-09-05 20:56:49.753937121 +0100

> +++ gcc/config/lm32/lm32.c      2017-09-22 17:37:26.763614387 +0100

> @@ -113,6 +113,9 @@ #define TARGET_HARD_REGNO_MODE_OK lm32_h

>  #undef TARGET_MODES_TIEABLE_P

>  #define TARGET_MODES_TIEABLE_P lm32_modes_tieable_p

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  /* Current frame information calculated by lm32_compute_frame_size.  */

> Index: gcc/config/m32r/m32r.h

> ===================================================================

> --- gcc/config/m32r/m32r.h      2017-09-15 14:47:33.171332984 +0100

> +++ gcc/config/m32r/m32r.h      2017-09-22 17:37:26.766614387 +0100

> @@ -260,12 +260,6 @@ #define BIGGEST_ALIGNMENT 32

>  /* The best alignment to use in cases where we have a choice.  */

>  #define FASTEST_ALIGNMENT 32

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN) \

> -  ((TREE_CODE (EXP) == STRING_CST      \

> -    && (ALIGN) < FASTEST_ALIGNMENT)    \

> -   ? FASTEST_ALIGNMENT : (ALIGN))

> -

>  /* Make arrays of chars word-aligned for the same reasons.  */

>  #define DATA_ALIGNMENT(TYPE, ALIGN)                                    \

>    (TREE_CODE (TYPE) == ARRAY_TYPE                                      \

> Index: gcc/config/m32r/m32r.c

> ===================================================================

> --- gcc/config/m32r/m32r.c      2017-09-04 11:50:08.518432217 +0100

> +++ gcc/config/m32r/m32r.c      2017-09-22 17:37:26.765614387 +0100

> @@ -217,6 +217,9 @@ #define TARGET_HARD_REGNO_MODE_OK m32r_h

>  #undef TARGET_MODES_TIEABLE_P

>  #define TARGET_MODES_TIEABLE_P m32r_modes_tieable_p

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  /* Called by m32r_option_override to initialize various things.  */

> Index: gcc/config/mcore/mcore.h

> ===================================================================

> --- gcc/config/mcore/mcore.h    2017-09-15 14:47:33.171332984 +0100

> +++ gcc/config/mcore/mcore.h    2017-09-22 17:37:26.766614387 +0100

> @@ -148,12 +148,6 @@ #define    PCC_BITFIELD_TYPE_MATTERS       1

>     is GET_MODE_SIZE(DImode).  */

>  #define MAX_FIXED_MODE_SIZE 32

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  ((TREE_CODE (EXP) == STRING_CST      \

> -    && (ALIGN) < FASTEST_ALIGNMENT)    \

> -   ? FASTEST_ALIGNMENT : (ALIGN))

> -

>  /* Make arrays of chars word-aligned for the same reasons.  */

>  #define DATA_ALIGNMENT(TYPE, ALIGN)            \

>    (TREE_CODE (TYPE) == ARRAY_TYPE              \

> Index: gcc/config/mcore/mcore.c

> ===================================================================

> --- gcc/config/mcore/mcore.c    2017-09-04 11:50:08.519332606 +0100

> +++ gcc/config/mcore/mcore.c    2017-09-22 17:37:26.766614387 +0100

> @@ -248,6 +248,9 @@ #define TARGET_HARD_REGNO_MODE_OK mcore_

>  #undef TARGET_MODES_TIEABLE_P

>  #define TARGET_MODES_TIEABLE_P mcore_modes_tieable_p

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  /* Adjust the stack and return the number of bytes taken to do it.  */

> Index: gcc/config/microblaze/microblaze.h

> ===================================================================

> --- gcc/config/microblaze/microblaze.h  2017-09-15 14:47:33.172332877 +0100

> +++ gcc/config/microblaze/microblaze.h  2017-09-22 17:37:26.767614387 +0100

> @@ -234,12 +234,6 @@ #define SIZE_TYPE "unsigned int"

>  #undef PTRDIFF_TYPE

>  #define PTRDIFF_TYPE "int"

>

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)                                 \

> -  ((TREE_CODE (EXP) == STRING_CST  || TREE_CODE (EXP) == CONSTRUCTOR)  \

> -   && (ALIGN) < BITS_PER_WORD                                          \

> -       ? BITS_PER_WORD                                                 \

> -       : (ALIGN))

> -

>  #define DATA_ALIGNMENT(TYPE, ALIGN)                                    \

>    ((((ALIGN) < BITS_PER_WORD)                                          \

>      && (TREE_CODE (TYPE) == ARRAY_TYPE                                 \

> Index: gcc/config/microblaze/microblaze.c

> ===================================================================

> --- gcc/config/microblaze/microblaze.c  2017-09-05 20:56:49.754842071 +0100

> +++ gcc/config/microblaze/microblaze.c  2017-09-22 17:37:26.767614387 +0100

> @@ -3800,6 +3800,16 @@ microblaze_machine_dependent_reorg (void

>        return;

>      }

>  }

> +

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +microblaze_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  if (TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)

> +    return MAX (align, BITS_PER_WORD);

> +  return align;

> +}

>

>  #undef TARGET_ENCODE_SECTION_INFO

>  #define TARGET_ENCODE_SECTION_INFO      microblaze_encode_section_info

> @@ -3904,6 +3914,9 @@ #define TARGET_HARD_REGNO_MODE_OK microb

>  #undef TARGET_MODES_TIEABLE_P

>  #define TARGET_MODES_TIEABLE_P microblaze_modes_tieable_p

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT microblaze_constant_alignment

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-microblaze.h"

> Index: gcc/config/mips/mips.h

> ===================================================================

> --- gcc/config/mips/mips.h      2017-09-15 14:47:33.174332662 +0100

> +++ gcc/config/mips/mips.h      2017-09-22 17:37:26.769614386 +0100

> @@ -1636,22 +1636,6 @@ #define STRICT_ALIGNMENT 1

>

>  #define PCC_BITFIELD_TYPE_MATTERS 1

>

> -/* If defined, a C expression to compute the alignment given to a

> -   constant that is being placed in memory.  CONSTANT is the constant

> -   and ALIGN is the alignment that the object would ordinarily have.

> -   The value of this macro is used instead of that alignment to align

> -   the object.

> -

> -   If this macro is not defined, then ALIGN is used.

> -

> -   The typical use of this macro is to increase alignment for string

> -   constants to be word aligned so that `strcpy' calls that copy

> -   constants can be done inline.  */

> -

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)                                 \

> -  ((TREE_CODE (EXP) == STRING_CST  || TREE_CODE (EXP) == CONSTRUCTOR)  \

> -   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

> -

>  /* If defined, a C expression to compute the alignment for a static

>     variable.  TYPE is the data type, and ALIGN is the alignment that

>     the object would ordinarily have.  The value of this macro is used

> Index: gcc/config/mips/mips.c

> ===================================================================

> --- gcc/config/mips/mips.c      2017-09-22 17:31:56.421371259 +0100

> +++ gcc/config/mips/mips.c      2017-09-22 17:37:26.769614386 +0100

> @@ -22336,6 +22336,16 @@ mips_truly_noop_truncation (unsigned int

>  {

>    return !TARGET_64BIT || inprec <= 32 || outprec > 32;

>  }

> +

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +mips_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  if (TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)

> +    return MAX (align, BITS_PER_WORD);

> +  return align;

> +}

>

>  /* Initialize the GCC target structure.  */

>  #undef TARGET_ASM_ALIGNED_HI_OP

> @@ -22634,6 +22644,9 @@ #define TARGET_CAN_CHANGE_MODE_CLASS mip

>  #undef TARGET_TRULY_NOOP_TRUNCATION

>  #define TARGET_TRULY_NOOP_TRUNCATION mips_truly_noop_truncation

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT mips_constant_alignment

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-mips.h"

> Index: gcc/config/mmix/mmix.h

> ===================================================================

> --- gcc/config/mmix/mmix.h      2017-09-15 14:47:33.174332662 +0100

> +++ gcc/config/mmix/mmix.h      2017-09-22 17:37:26.770614386 +0100

> @@ -167,9 +167,6 @@ #define MAX_OFILE_ALIGNMENT (32768 * 8)

>  #define DATA_ABI_ALIGNMENT(TYPE, BASIC_ALIGN) \

>   mmix_data_alignment (TYPE, BASIC_ALIGN)

>

> -#define CONSTANT_ALIGNMENT(CONSTANT, BASIC_ALIGN) \

> - mmix_constant_alignment (CONSTANT, BASIC_ALIGN)

> -

>  #define LOCAL_ALIGNMENT(TYPE, BASIC_ALIGN) \

>   mmix_local_alignment (TYPE, BASIC_ALIGN)

>

> Index: gcc/config/mmix/mmix-protos.h

> ===================================================================

> --- gcc/config/mmix/mmix-protos.h       2017-02-23 19:54:26.000000000 +0000

> +++ gcc/config/mmix/mmix-protos.h       2017-09-22 17:37:26.769614386 +0100

> @@ -47,7 +47,6 @@ extern unsigned mmix_dbx_register_number

>  extern int mmix_use_simple_return (void);

>  extern void mmix_make_decl_one_only (tree);

>  extern int mmix_data_alignment (tree, int);

> -extern int mmix_constant_alignment (tree, int);

>  extern unsigned mmix_local_alignment (tree, unsigned);

>  extern void mmix_asm_output_pool_prologue (FILE *, const char *, tree, int);

>  extern void mmix_asm_output_aligned_common (FILE *, const char *, int, int);

> Index: gcc/config/mmix/mmix.c

> ===================================================================

> --- gcc/config/mmix/mmix.c      2017-08-30 12:08:01.655417455 +0100

> +++ gcc/config/mmix/mmix.c      2017-09-22 17:37:26.770614386 +0100

> @@ -168,6 +168,7 @@ static void mmix_print_operand (FILE *,

>  static void mmix_print_operand_address (FILE *, machine_mode, rtx);

>  static bool mmix_print_operand_punct_valid_p (unsigned char);

>  static void mmix_conditional_register_usage (void);

> +static HOST_WIDE_INT mmix_constant_alignment (const_tree, HOST_WIDE_INT);

>

>  /* Target structure macros.  Listed by node.  See `Using and Porting GCC'

>     for a general description.  */

> @@ -282,6 +283,9 @@ #define TARGET_TRAMPOLINE_INIT mmix_tram

>  #undef TARGET_OPTION_OVERRIDE

>  #define TARGET_OPTION_OVERRIDE mmix_option_override

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT mmix_constant_alignment

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  /* Functions that are expansions for target macros.

> @@ -334,10 +338,10 @@ mmix_data_alignment (tree type ATTRIBUTE

>    return basic_align;

>  }

>

> -/* CONSTANT_ALIGNMENT.  */

> +/* Implement tARGET_CONSTANT_ALIGNMENT.  */

>

> -int

> -mmix_constant_alignment (tree constant ATTRIBUTE_UNUSED, int basic_align)

> +static HOST_WIDE_INT

> +mmix_constant_alignment (const_tree, HOST_WIDE_INT basic_align)

>  {

>    if (basic_align < 32)

>      return 32;

> Index: gcc/config/moxie/moxie.h

> ===================================================================

> --- gcc/config/moxie/moxie.h    2017-09-15 14:47:33.175332555 +0100

> +++ gcc/config/moxie/moxie.h    2017-09-22 17:37:26.770614386 +0100

> @@ -317,12 +317,6 @@ #define    PCC_BITFIELD_TYPE_MATTERS       1

>     is GET_MODE_SIZE(DImode).  */

>  #define MAX_FIXED_MODE_SIZE 32

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  ((TREE_CODE (EXP) == STRING_CST      \

> -    && (ALIGN) < FASTEST_ALIGNMENT)    \

> -   ? FASTEST_ALIGNMENT : (ALIGN))

> -

>  /* Make arrays of chars word-aligned for the same reasons.  */

>  #define DATA_ALIGNMENT(TYPE, ALIGN)            \

>    (TREE_CODE (TYPE) == ARRAY_TYPE              \

> Index: gcc/config/moxie/moxie.c

> ===================================================================

> --- gcc/config/moxie/moxie.c    2017-08-10 14:36:08.735446777 +0100

> +++ gcc/config/moxie/moxie.c    2017-09-22 17:37:26.770614386 +0100

> @@ -667,6 +667,9 @@ #define TARGET_PRINT_OPERAND moxie_print

>  #undef  TARGET_PRINT_OPERAND_ADDRESS

>  #define TARGET_PRINT_OPERAND_ADDRESS moxie_print_operand_address

>

> +#undef  TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-moxie.h"

> Index: gcc/config/nios2/nios2.h

> ===================================================================

> --- gcc/config/nios2/nios2.h    2017-09-15 14:47:33.175332555 +0100

> +++ gcc/config/nios2/nios2.h    2017-09-22 17:37:26.771614386 +0100

> @@ -92,10 +92,6 @@ #define STACK_BOUNDARY 32

>  #define PREFERRED_STACK_BOUNDARY 32

>  #define MAX_FIXED_MODE_SIZE 64

>

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)                          \

> -  ((TREE_CODE (EXP) == STRING_CST)                              \

> -   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

> -

>  #define LABEL_ALIGN(LABEL) nios2_label_align (LABEL)

>

>  /* Layout of source language data types.  */

> Index: gcc/config/nios2/nios2.c

> ===================================================================

> --- gcc/config/nios2/nios2.c    2017-09-04 11:50:24.551667467 +0100

> +++ gcc/config/nios2/nios2.c    2017-09-22 17:37:26.771614386 +0100

> @@ -5116,6 +5116,9 @@ #define TARGET_ASM_OUTPUT_MI_THUNK nios2

>  #undef TARGET_MACHINE_DEPENDENT_REORG

>  #define TARGET_MACHINE_DEPENDENT_REORG nios2_reorg

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-nios2.h"

> Index: gcc/config/pa/pa.h

> ===================================================================

> --- gcc/config/pa/pa.h  2017-09-15 14:47:33.176332447 +0100

> +++ gcc/config/pa/pa.h  2017-09-22 17:37:26.772614386 +0100

> @@ -309,11 +309,6 @@ #define BIGGEST_ALIGNMENT (2 * BITS_PER_

>     atomic operations.  */

>  #define MALLOC_ABI_ALIGNMENT (TARGET_SOM ? 64 : 128)

>

> -/* Get around hp-ux assembler bug, and make strcpy of constants fast.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)         \

> -  (TREE_CODE (EXP) == STRING_CST               \

> -   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

> -

>  /* Make arrays of chars word-aligned for the same reasons.  */

>  #define DATA_ALIGNMENT(TYPE, ALIGN)            \

>    (TREE_CODE (TYPE) == ARRAY_TYPE              \

> Index: gcc/config/pa/pa.c

> ===================================================================

> --- gcc/config/pa/pa.c  2017-09-15 13:56:20.276148823 +0100

> +++ gcc/config/pa/pa.c  2017-09-22 17:37:26.772614386 +0100

> @@ -425,6 +425,9 @@ #define TARGET_MODES_TIEABLE_P pa_modes_

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS pa_can_change_mode_class

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  /* Parse the -mfixed-range= option string.  */

> Index: gcc/config/powerpcspe/powerpcspe.h

> ===================================================================

> --- gcc/config/powerpcspe/powerpcspe.h  2017-09-15 14:47:33.176332447 +0100

> +++ gcc/config/powerpcspe/powerpcspe.h  2017-09-22 17:37:26.775614386 +0100

> @@ -978,14 +978,6 @@ enum data_align { align_abi, align_opt,

>  #define LOCAL_ALIGNMENT(TYPE, ALIGN)                           \

>    rs6000_data_alignment (TYPE, ALIGN, align_both)

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)                           \

> -  (TREE_CODE (EXP) == STRING_CST                                \

> -   && (STRICT_ALIGNMENT || !optimize_size)                       \

> -   && (ALIGN) < BITS_PER_WORD                                    \

> -   ? BITS_PER_WORD                                               \

> -   : (ALIGN))

> -

>  /* Make arrays of chars word-aligned for the same reasons.  */

>  #define DATA_ALIGNMENT(TYPE, ALIGN) \

>    rs6000_data_alignment (TYPE, ALIGN, align_opt)

> Index: gcc/config/powerpcspe/powerpcspe.c

> ===================================================================

> --- gcc/config/powerpcspe/powerpcspe.c  2017-09-22 17:31:56.424214967 +0100

> +++ gcc/config/powerpcspe/powerpcspe.c  2017-09-22 17:37:26.775614386 +0100

> @@ -1984,6 +1984,9 @@ #define TARGET_SLOW_UNALIGNED_ACCESS rs6

>

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS rs6000_can_change_mode_class

> +

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT rs6000_constant_alignment

>

>

>  /* Processor table.  */

> @@ -43752,6 +43755,17 @@ rs6000_optab_supported_p (int op, machin

>        return true;

>      }

>  }

> +

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +rs6000_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  if (TREE_CODE (exp) == STRING_CST

> +      && (STRICT_ALIGNMENT || !optimize_size))

> +    return MAX (align, BITS_PER_WORD);

> +  return align;

> +}

>

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

> Index: gcc/config/riscv/riscv.h

> ===================================================================

> --- gcc/config/riscv/riscv.h    2017-09-15 14:47:33.176332447 +0100

> +++ gcc/config/riscv/riscv.h    2017-09-22 17:37:26.776614386 +0100

> @@ -152,22 +152,6 @@ #define STRICT_ALIGNMENT TARGET_STRICT_A

>

>  #define PCC_BITFIELD_TYPE_MATTERS 1

>

> -/* If defined, a C expression to compute the alignment given to a

> -   constant that is being placed in memory.  CONSTANT is the constant

> -   and ALIGN is the alignment that the object would ordinarily have.

> -   The value of this macro is used instead of that alignment to align

> -   the object.

> -

> -   If this macro is not defined, then ALIGN is used.

> -

> -   The typical use of this macro is to increase alignment for string

> -   constants to be word aligned so that `strcpy' calls that copy

> -   constants can be done inline.  */

> -

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)                                 \

> -  ((TREE_CODE (EXP) == STRING_CST  || TREE_CODE (EXP) == CONSTRUCTOR)  \

> -   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

> -

>  /* If defined, a C expression to compute the alignment for a static

>     variable.  TYPE is the data type, and ALIGN is the alignment that

>     the object would ordinarily have.  The value of this macro is used

> Index: gcc/config/riscv/riscv.c

> ===================================================================

> --- gcc/config/riscv/riscv.c    2017-09-15 13:56:20.282148920 +0100

> +++ gcc/config/riscv/riscv.c    2017-09-22 17:37:26.776614386 +0100

> @@ -3995,6 +3995,17 @@ riscv_can_change_mode_class (machine_mod

>    return !reg_classes_intersect_p (FP_REGS, rclass);

>  }

>

> +

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +riscv_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  if (TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)

> +    return MAX (align, BITS_PER_WORD);

> +  return align;

> +}

> +

>  /* Initialize the GCC target structure.  */

>  #undef TARGET_ASM_ALIGNED_HI_OP

>  #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"

> @@ -4142,6 +4153,9 @@ #define TARGET_SECONDARY_MEMORY_NEEDED r

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS riscv_can_change_mode_class

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT riscv_constant_alignment

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-riscv.h"

> Index: gcc/config/rs6000/rs6000.h

> ===================================================================

> --- gcc/config/rs6000/rs6000.h  2017-09-15 14:47:33.177332340 +0100

> +++ gcc/config/rs6000/rs6000.h  2017-09-22 17:37:26.779614386 +0100

> @@ -950,14 +950,6 @@ enum data_align { align_abi, align_opt,

>  #define LOCAL_ALIGNMENT(TYPE, ALIGN)                           \

>    rs6000_data_alignment (TYPE, ALIGN, align_both)

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)                           \

> -  (TREE_CODE (EXP) == STRING_CST                                \

> -   && (STRICT_ALIGNMENT || !optimize_size)                       \

> -   && (ALIGN) < BITS_PER_WORD                                    \

> -   ? BITS_PER_WORD                                               \

> -   : (ALIGN))

> -

>  /* Make arrays of chars word-aligned for the same reasons.  */

>  #define DATA_ALIGNMENT(TYPE, ALIGN) \

>    rs6000_data_alignment (TYPE, ALIGN, align_opt)

> Index: gcc/config/rs6000/rs6000.c

> ===================================================================

> --- gcc/config/rs6000/rs6000.c  2017-09-22 17:31:56.427058675 +0100

> +++ gcc/config/rs6000/rs6000.c  2017-09-22 17:37:26.779614386 +0100

> @@ -1974,6 +1974,9 @@ #define TARGET_SLOW_UNALIGNED_ACCESS rs6

>

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS rs6000_can_change_mode_class

> +

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT rs6000_constant_alignment

>

>

>  /* Processor table.  */

> @@ -39128,6 +39131,17 @@ rs6000_optab_supported_p (int op, machin

>        return true;

>      }

>  }

> +

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +rs6000_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  if (TREE_CODE (exp) == STRING_CST

> +      && (STRICT_ALIGNMENT || !optimize_size))

> +    return MAX (align, BITS_PER_WORD);

> +  return align;

> +}

>

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

> Index: gcc/config/s390/s390.h

> ===================================================================

> --- gcc/config/s390/s390.h      2017-09-15 14:47:33.178332233 +0100

> +++ gcc/config/s390/s390.h      2017-09-22 17:37:26.781614386 +0100

> @@ -315,7 +315,6 @@ #define BIGGEST_ALIGNMENT 64

>  #define EMPTY_FIELD_BOUNDARY 32

>

>  /* Alignment on even addresses for LARL instruction.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN) (ALIGN) < 16 ? 16 : (ALIGN)

>  #define DATA_ABI_ALIGNMENT(TYPE, ALIGN) (ALIGN) < 16 ? 16 : (ALIGN)

>

>  /* Alignment is not required by the hardware.  */

> Index: gcc/config/s390/s390.c

> ===================================================================

> --- gcc/config/s390/s390.c      2017-09-21 11:53:16.508848803 +0100

> +++ gcc/config/s390/s390.c      2017-09-22 17:37:26.781614386 +0100

> @@ -15906,6 +15906,15 @@ s390_vector_alignment (const_tree type)

>    return MIN (64, tree_to_shwi (TYPE_SIZE (type)));

>  }

>

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  Alignment on even addresses for

> +   LARL instruction.  */

> +

> +static HOST_WIDE_INT

> +s390_constant_alignment (const_tree, HOST_WIDE_INT align)

> +{

> +  return MAX (align, 16);

> +}

> +

>  #ifdef HAVE_AS_MACHINE_MACHINEMODE

>  /* Implement TARGET_ASM_FILE_START.  */

>  static void

> @@ -16325,6 +16334,9 @@ #define TARGET_OPTION_RESTORE s390_funct

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS s390_can_change_mode_class

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT s390_constant_alignment

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-s390.h"

> Index: gcc/config/sh/sh.h

> ===================================================================

> --- gcc/config/sh/sh.h  2017-09-15 14:47:33.178332233 +0100

> +++ gcc/config/sh/sh.h  2017-09-22 17:37:26.782614386 +0100

> @@ -462,12 +462,6 @@ #define BIGGEST_ALIGNMENT  (TARGET_ALIGN

>  /* The best alignment to use in cases where we have a choice.  */

>  #define FASTEST_ALIGNMENT (32)

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN) \

> -  ((TREE_CODE (EXP) == STRING_CST      \

> -    && (ALIGN) < FASTEST_ALIGNMENT)    \

> -    ? FASTEST_ALIGNMENT : (ALIGN))

> -

>  /* get_mode_alignment assumes complex values are always held in multiple

>     registers, but that is not the case on the SH; CQImode and CHImode are

>     held in a single integer register.  */

> Index: gcc/config/sh/sh.c

> ===================================================================

> --- gcc/config/sh/sh.c  2017-09-15 13:56:20.288149017 +0100

> +++ gcc/config/sh/sh.c  2017-09-22 17:37:26.782614386 +0100

> @@ -657,6 +657,9 @@ #define TARGET_MODES_TIEABLE_P sh_modes_

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS sh_can_change_mode_class

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>

> Index: gcc/config/sparc/sparc.h

> ===================================================================

> --- gcc/config/sparc/sparc.h    2017-09-15 14:47:33.178332233 +0100

> +++ gcc/config/sparc/sparc.h    2017-09-22 17:37:26.784614385 +0100

> @@ -579,12 +579,6 @@ #define MAX_FIXED_MODE_SIZE GET_MODE_BIT

>  #define STACK_SAVEAREA_MODE(LEVEL) \

>    ((LEVEL) == SAVE_NONLOCAL ? (TARGET_ARCH64 ? TImode : DImode) : Pmode)

>

> -/* Make strings word-aligned so strcpy from constants will be faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  ((TREE_CODE (EXP) == STRING_CST      \

> -    && (ALIGN) < FASTEST_ALIGNMENT)    \

> -   ? FASTEST_ALIGNMENT : (ALIGN))

> -

>  /* Make arrays of chars word-aligned for the same reasons.  */

>  #define DATA_ALIGNMENT(TYPE, ALIGN)            \

>    (TREE_CODE (TYPE) == ARRAY_TYPE              \

> Index: gcc/config/sparc/sparc.c

> ===================================================================

> --- gcc/config/sparc/sparc.c    2017-09-21 11:53:16.532263818 +0100

> +++ gcc/config/sparc/sparc.c    2017-09-22 17:37:26.784614385 +0100

> @@ -684,6 +684,7 @@ static bool sparc_hard_regno_mode_ok (un

>  static bool sparc_modes_tieable_p (machine_mode, machine_mode);

>  static bool sparc_can_change_mode_class (machine_mode, machine_mode,

>                                          reg_class_t);

> +static HOST_WIDE_INT sparc_constant_alignment (const_tree, HOST_WIDE_INT);

>

>  #ifdef SUBTARGET_ATTRIBUTE_TABLE

>  /* Table of valid machine attributes.  */

> @@ -925,6 +926,9 @@ #define TARGET_MODES_TIEABLE_P sparc_mod

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS sparc_can_change_mode_class

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT sparc_constant_alignment

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  /* Return the memory reference contained in X if any, zero otherwise.  */

> @@ -13429,4 +13433,14 @@ sparc_can_change_mode_class (machine_mod

>    return true;

>  }

>

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +sparc_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  if (TREE_CODE (exp) == STRING_CST)

> +    return MAX (align, FASTEST_ALIGNMENT);

> +  return align;

> +}

> +

>  #include "gt-sparc.h"

> Index: gcc/config/spu/spu.h

> ===================================================================

> --- gcc/config/spu/spu.h        2017-09-15 15:37:22.133931616 +0100

> +++ gcc/config/spu/spu.h        2017-09-22 17:37:26.785614385 +0100

> @@ -96,7 +96,6 @@ #define MINIMUM_ATOMIC_ALIGNMENT 128

>     on the stack.  (Except a bug (?) allows some stack objects to be

>     unaligned.)  */

>  #define DATA_ALIGNMENT(TYPE,ALIGN) ((ALIGN) > 128 ? (ALIGN) : 128)

> -#define CONSTANT_ALIGNMENT(TYPE,ALIGN) ((ALIGN) > 128 ? (ALIGN) : 128)

>  #define LOCAL_ALIGNMENT(TYPE,ALIGN) ((ALIGN) > 128 ? (ALIGN) : 128)

>

>  #define EMPTY_FIELD_BOUNDARY 32

> Index: gcc/config/spu/spu.c

> ===================================================================

> --- gcc/config/spu/spu.c        2017-09-21 22:36:18.178401236 +0100

> +++ gcc/config/spu/spu.c        2017-09-22 17:37:26.785614385 +0100

> @@ -4159,7 +4159,7 @@ spu_encode_section_info (tree decl, rtx

>     which is both 16-byte aligned and padded to a 16-byte boundary.  This

>     would make it safe to store with a single instruction.

>     We guarantee the alignment and padding for static objects by aligning

> -   all of them to 16-bytes. (DATA_ALIGNMENT and CONSTANT_ALIGNMENT.)

> +   all of them to 16-bytes. (DATA_ALIGNMENT and TARGET_CONSTANT_ALIGNMENT.)

>     FIXME: We currently cannot guarantee this for objects on the stack

>     because assign_parm_setup_stack calls assign_stack_local with the

>     alignment of the parameter mode and in that case the alignment never

> @@ -7193,6 +7193,18 @@ spu_truly_noop_truncation (unsigned int

>  {

>    return inprec <= 32 && outprec <= inprec;

>  }

> +

> +/* Implement TARGET_CONSTANT_ALIGNMENT.

> +

> +   Make all static objects 16-byte aligned.  This allows us to assume

> +   they are also padded to 16 bytes, which means we can use a single

> +   load or store instruction to access them.  */

> +

> +static HOST_WIDE_INT

> +spu_constant_alignment (const_tree, HOST_WIDE_INT align)

> +{

> +  return MAX (align, 128);

> +}

>

>  /*  Table of machine attributes.  */

>  static const struct attribute_spec spu_attribute_table[] =

> @@ -7433,6 +7445,9 @@ #define TARGET_CAN_CHANGE_MODE_CLASS spu

>  #undef TARGET_TRULY_NOOP_TRUNCATION

>  #define TARGET_TRULY_NOOP_TRUNCATION spu_truly_noop_truncation

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT spu_constant_alignment

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-spu.h"

> Index: gcc/config/stormy16/stormy16.h

> ===================================================================

> --- gcc/config/stormy16/stormy16.h      2017-09-15 14:47:33.179332125 +0100

> +++ gcc/config/stormy16/stormy16.h      2017-09-22 17:37:26.785614385 +0100

> @@ -87,10 +87,6 @@ #define DATA_ALIGNMENT(TYPE, ALIGN)          \

>     && TYPE_MODE (TREE_TYPE (TYPE)) == QImode   \

>     && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

>

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  (TREE_CODE (EXP) == STRING_CST       \

> -   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

> -

>  #define STRICT_ALIGNMENT 1

>

>  #define PCC_BITFIELD_TYPE_MATTERS 1

> Index: gcc/config/stormy16/stormy16.c

> ===================================================================

> --- gcc/config/stormy16/stormy16.c      2017-09-04 11:50:08.540041564 +0100

> +++ gcc/config/stormy16/stormy16.c      2017-09-22 17:37:26.785614385 +0100

> @@ -2715,6 +2715,9 @@ #define TARGET_HARD_REGNO_MODE_OK xstorm

>  #undef TARGET_MODES_TIEABLE_P

>  #define TARGET_MODES_TIEABLE_P xstormy16_modes_tieable_p

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-stormy16.h"

> Index: gcc/config/tilegx/tilegx.h

> ===================================================================

> --- gcc/config/tilegx/tilegx.h  2017-09-15 14:47:33.180332018 +0100

> +++ gcc/config/tilegx/tilegx.h  2017-09-22 17:37:26.786614385 +0100

> @@ -94,13 +94,6 @@ #define FASTEST_ALIGNMENT 64

>  #define BIGGEST_FIELD_ALIGNMENT 128

>  #define WIDEST_HARDWARE_FP_SIZE 64

>

> -/* Make strings word-aligned so strcpy from constants will be

> -   faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  ((TREE_CODE (EXP) == STRING_CST      \

> -    && (ALIGN) < FASTEST_ALIGNMENT)    \

> -   ? FASTEST_ALIGNMENT : (ALIGN))

> -

>  /* Make arrays of chars word-aligned for the same reasons.  */

>  #define DATA_ALIGNMENT(TYPE, ALIGN)            \

>    (TREE_CODE (TYPE) == ARRAY_TYPE              \

> Index: gcc/config/tilegx/tilegx.c

> ===================================================================

> --- gcc/config/tilegx/tilegx.c  2017-09-15 14:47:33.180332018 +0100

> +++ gcc/config/tilegx/tilegx.c  2017-09-22 17:37:26.786614385 +0100

> @@ -5734,6 +5734,9 @@ #define TARGET_CAN_USE_DOLOOP_P can_use_

>  #undef  TARGET_TRULY_NOOP_TRUNCATION

>  #define TARGET_TRULY_NOOP_TRUNCATION tilegx_truly_noop_truncation

>

> +#undef  TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-tilegx.h"

> Index: gcc/config/tilepro/tilepro.h

> ===================================================================

> --- gcc/config/tilepro/tilepro.h        2017-09-15 14:47:33.180332018 +0100

> +++ gcc/config/tilepro/tilepro.h        2017-09-22 17:37:26.787614385 +0100

> @@ -58,13 +58,6 @@ #define PCC_BITFIELD_TYPE_MATTERS 1

>  #define FASTEST_ALIGNMENT 32

>  #define BIGGEST_FIELD_ALIGNMENT 64

>

> -/* Make strings word-aligned so strcpy from constants will be

> -   faster.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)  \

> -  ((TREE_CODE (EXP) == STRING_CST      \

> -    && (ALIGN) < FASTEST_ALIGNMENT)    \

> -   ? FASTEST_ALIGNMENT : (ALIGN))

> -

>  /* Make arrays of chars word-aligned for the same reasons.  */

>  #define DATA_ALIGNMENT(TYPE, ALIGN)            \

>    (TREE_CODE (TYPE) == ARRAY_TYPE              \

> Index: gcc/config/tilepro/tilepro.c

> ===================================================================

> --- gcc/config/tilepro/tilepro.c        2017-09-04 08:30:09.354408112 +0100

> +++ gcc/config/tilepro/tilepro.c        2017-09-22 17:37:26.786614385 +0100

> @@ -5091,6 +5091,9 @@ #define TARGET_ASM_FILE_END tilepro_file

>  #undef  TARGET_CAN_USE_DOLOOP_P

>  #define TARGET_CAN_USE_DOLOOP_P can_use_doloop_if_innermost

>

> +#undef  TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  #include "gt-tilepro.h"

> Index: gcc/config/visium/visium.h

> ===================================================================

> --- gcc/config/visium/visium.h  2017-09-15 14:47:33.181331910 +0100

> +++ gcc/config/visium/visium.h  2017-09-22 17:37:26.787614385 +0100

> @@ -236,16 +236,6 @@ #define BIGGEST_ALIGNMENT 32

>     this macro is used instead of that alignment to align the object. */

>  #define DATA_ALIGNMENT(TYPE,ALIGN) visium_data_alignment (TYPE, ALIGN)

>

> -/* `CONSTANT_ALIGNMENT (CONSTANT, BASIC-ALIGN)`

> -

> -   If defined, a C expression to compute the alignment given to a

> -   constant that is being placed in memory.  CONSTANT is the constant

> -   and BASIC-ALIGN is the alignment that the object would ordinarily

> -   have.  The value of this macro is used instead of that alignment to

> -   align the object. */

> -#define CONSTANT_ALIGNMENT(EXP,ALIGN) \

> -  visium_data_alignment (TREE_TYPE (EXP), ALIGN)

> -

>  /* `LOCAL_ALIGNMENT (TYPE, BASIC-ALIGN)`

>

>     If defined, a C expression to compute the alignment for a variable

> Index: gcc/config/visium/visium.c

> ===================================================================

> --- gcc/config/visium/visium.c  2017-09-15 13:56:20.293149098 +0100

> +++ gcc/config/visium/visium.c  2017-09-22 17:37:26.787614385 +0100

> @@ -237,6 +237,8 @@ static bool visium_modes_tieable_p (mach

>  static bool visium_can_change_mode_class (machine_mode, machine_mode,

>                                           reg_class_t);

>

> +static HOST_WIDE_INT visium_constant_alignment (const_tree, HOST_WIDE_INT);

> +

>  /* Setup the global target hooks structure.  */

>

>  #undef  TARGET_MAX_ANCHOR_OFFSET

> @@ -360,6 +362,9 @@ #define TARGET_MODES_TIEABLE_P visium_mo

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS visium_can_change_mode_class

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT visium_constant_alignment

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>  namespace {

> @@ -834,6 +839,14 @@ visium_data_alignment (tree type, unsign

>    return align;

>  }

>

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +visium_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  return visium_data_alignment (TREE_TYPE (exp), align);

> +}

> +

>  /* Helper function for HARD_REGNO_RENAME_OK (FROM, TO).  Return non-zero if

>     it is OK to rename a hard register FROM to another hard register TO.  */

>

> Index: gcc/config/xtensa/xtensa.h

> ===================================================================

> --- gcc/config/xtensa/xtensa.h  2017-09-15 14:47:33.181331910 +0100

> +++ gcc/config/xtensa/xtensa.h  2017-09-22 17:37:26.788614385 +0100

> @@ -169,17 +169,6 @@ #define PROMOTE_MODE(MODE, UNSIGNEDP, TY

>     bitfields and the structures that contain them.  */

>  #define PCC_BITFIELD_TYPE_MATTERS 1

>

> -/* Align string constants and constructors to at least a word boundary.

> -   The typical use of this macro is to increase alignment for string

> -   constants to be word aligned so that 'strcpy' calls that copy

> -   constants can be done inline.  */

> -#define CONSTANT_ALIGNMENT(EXP, ALIGN)                                 \

> -  (!optimize_size &&                                                   \

> -   (TREE_CODE (EXP) == STRING_CST || TREE_CODE (EXP) == CONSTRUCTOR)   \

> -   && (ALIGN) < BITS_PER_WORD                                          \

> -       ? BITS_PER_WORD                                                 \

> -       : (ALIGN))

> -

>  /* Align arrays, unions and records to at least a word boundary.

>     One use of this macro is to increase alignment of medium-size

>     data to make it all fit in fewer cache lines.  Another is to

> Index: gcc/config/xtensa/xtensa.c

> ===================================================================

> --- gcc/config/xtensa/xtensa.c  2017-09-12 14:29:25.261529490 +0100

> +++ gcc/config/xtensa/xtensa.c  2017-09-22 17:37:26.788614385 +0100

> @@ -181,6 +181,7 @@ static void xtensa_conditional_register_

>  static unsigned int xtensa_hard_regno_nregs (unsigned int, machine_mode);

>  static bool xtensa_hard_regno_mode_ok (unsigned int, machine_mode);

>  static bool xtensa_modes_tieable_p (machine_mode, machine_mode);

> +static HOST_WIDE_INT xtensa_constant_alignment (const_tree, HOST_WIDE_INT);

>

>

>

> @@ -317,6 +318,9 @@ #define TARGET_HARD_REGNO_MODE_OK xtensa

>  #undef TARGET_MODES_TIEABLE_P

>  #define TARGET_MODES_TIEABLE_P xtensa_modes_tieable_p

>

> +#undef TARGET_CONSTANT_ALIGNMENT

> +#define TARGET_CONSTANT_ALIGNMENT xtensa_constant_alignment

> +

>  struct gcc_target targetm = TARGET_INITIALIZER;

>

>

> @@ -4380,4 +4384,19 @@ enum reg_class xtensa_regno_to_class (in

>      return regno_to_class[regno];

>  }

>

> +/* Implement TARGET_CONSTANT_ALIGNMENT.  Align string constants and

> +   constructors to at least a word boundary.  The typical use of this

> +   macro is to increase alignment for string constants to be word

> +   aligned so that 'strcpy' calls that copy constants can be done

> +   inline.  */

> +

> +static HOST_WIDE_INT

> +xtensa_constant_alignment (const_tree exp, HOST_WIDE_INT align)

> +{

> +  if ((TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)

> +      && !optimize_size)

> +    return MAX (align, BITS_PER_WORD);

> +  return align;

> +}

> +

>  #include "gt-xtensa.h"

> Index: gcc/system.h

> ===================================================================

> --- gcc/system.h        2017-09-15 15:37:22.136931501 +0100

> +++ gcc/system.h        2017-09-22 17:37:26.790614385 +0100

> @@ -915,7 +915,7 @@ #define realloc xrealloc

>         MODES_TIEABLE_P FUNCTION_ARG_PADDING SLOW_UNALIGNED_ACCESS      \

>         HARD_REGNO_NREGS SECONDARY_MEMORY_NEEDED_MODE                   \

>         SECONDARY_MEMORY_NEEDED CANNOT_CHANGE_MODE_CLASS                \

> -       TRULY_NOOP_TRUNCATION FUNCTION_ARG_OFFSET

> +       TRULY_NOOP_TRUNCATION FUNCTION_ARG_OFFSET CONSTANT_ALIGNMENT

>

>  /* Target macros only used for code built for the target, that have

>     moved to libgcc-tm.h or have never been present elsewhere.  */
Richard Sandiford Oct. 1, 2017, 4:17 p.m. UTC | #6
Richard Biener <richard.guenther@gmail.com> writes:
> On Fri, Sep 22, 2017 at 6:42 PM, Richard Sandiford

> <richard.sandiford@linaro.org> wrote:

>> Richard Biener <richard.guenther@gmail.com> writes:

>>> On Thu, Sep 21, 2017 at 2:56 PM, Richard Sandiford

>>> <richard.sandiford@linaro.org> wrote:

>>>> Richard Biener <richard.guenther@gmail.com> writes:

>>>>> On September 20, 2017 2:36:03 PM GMT+02:00, Richard Sandiford

>>>>> <richard.sandiford@linaro.org> wrote:

>>>>>>When forcing a constant of mode MODE into memory, force_const_mem

>>>>>>asks the frontend to provide the type associated with that mode.

>>>>>>In principle type_for_mode is allowed to return null, and although

>>>>>>one use site correctly handled that, the other didn't.

>>>>>>

>>>>>>I think there's agreement that it's bogus to use type_for_mode for

>>>>>>this kind of thing, since it forces frontends to handle types that

>>>>>>don't exist in that language.  See e.g. http://gcc.gnu.org/PR46805

>>>>>>where the Go frontend was forced to handle vector types even though

>>>>>>Go doesn't have vector types.

>>>>>>

>>>>>>Also, the frontends use code like:

>>>>>>

>>>>>>  else if (VECTOR_MODE_P (mode))

>>>>>>    {

>>>>>>      machine_mode inner_mode = GET_MODE_INNER (mode);

>>>>>>      tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);

>>>>>>      if (inner_type != NULL_TREE)

>>>>>>        return build_vector_type_for_mode (inner_type, mode);

>>>>>>    }

>>>>>>

>>>>>>and there's no guarantee that every vector mode M used by backend

>>>>>>rtl has an associated vector type whose TYPE_MODE is M.  I think

>>>>>>really the type_for_mode hook should only return trees that _do_ have

>>>>>>the requested TYPE_MODE, but PR46805 linked above shows that this is

>>>>>>likely to have too many knock-on consequences.  It doesn't make sense

>>>>>>for force_const_mem to ask about vector modes that aren't valid for

>>>>>>vector types, so this patch handles the condition there instead.

>>>>>>

>>>>>>This is needed for SVE multi-register modes, which are modelled as

>>>>>>vector modes but are not usable as vector types.

>>>>>>

>>>>>>Tested on aarch64-linux-gnu, x86_64-linux-gnu and

>>>>>>powerpc64le-linus-gnu.

>>>>>>OK to install?

>>>>>

>>>>> I think we should get rid of the use entirely.

>>>>

>>>> I first read this as not using type_for_mode at all in force_const_mem,

>>>> which sounded like a good thing :-)

>>>

>>> That's what I meant ;)  A mode doesn't really have a type...

>>>

>>>   I tried it overnight on the usual

>>>> at-least-one-target-per-CPU set and diffing the before and after

>>>> assembly for the testsuite.  And it looks like i686 relies on this

>>>> to get an alignment of 16 rather than 4 for XFmode constants:

>>>> GET_MODE_ALIGNMENT (XFmode) == 32 (as requested by i386-modes.def),

>>>> but i386's CONSTANT_ALIGNMENT increases it to 128 for static constants.

>>>

>>> Then the issue is that CONSTANT_ALIGNMENT takes a tree and not a mode...

>>> even worse than type_for_mode is a use of make_tree!  Incidentially

>>> ix86_constant_alignment _does_ look at the mode in the end...

>>

>> OK, I guess this means another target hook conversion.  The patch

>> below converts CONSTANT_ALIGNMENT with its current interface.

>> The definition:

>>

>>   #define CONSTANT_ALIGNMENT(EXP, ALIGN) \

>>     (TREE_CODE (EXP) == STRING_CST \

>>      && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

>>

>> was very common, so the patch adds a canned definition for that,

>> called constant_alignment_word_strings.  Some ports had a variation

>> that used a port-local FASTEST_ALIGNMENT instead of BITS_PER_WORD;

>> the patch uses constant_alignment_word_strings if FASTEST_ALIGNMENT

>> was always BITS_PER_WORD and a port-local hook function otherwise.

>>

>> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.

>> Also tested by comparing the testsuite assembly output on at least one

>> target per CPU directory.  I don't think this comes under Jeff's

>> preapproval due to the constant_alignment_word_strings thing, so:

>> OK to install?

>

> Ok.


Thanks.  A bit later than intended, but here's the follow-on to add
the new rtx hook.

Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.
Also tested by comparing the testsuite assembly output on at least one
target per CPU directory.  OK to install?

Richard


2017-10-01  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
	* target.def (static_rtx_alignment): New hook.
	* targhooks.h (default_static_rtx_alignment): Declare.
	* targhooks.c (default_static_rtx_alignment): New function.
	* doc/tm.texi.in (TARGET_STATIC_RTX_ALIGNMENT): New hook.
	* doc/tm.texi: Regenerate.
	* varasm.c (force_const_mem): Use targetm.static_rtx_alignment
	instead of targetm.constant_alignment.  Remove call to
	set_mem_attributes.
	* config/cris/cris.c (TARGET_STATIC_RTX_ALIGNMENT): Redefine.
	(cris_preferred_mininum_alignment): New function, split out from...
	(cris_constant_alignment): ...here.
	(cris_static_rtx_alignment): New function.
	* config/i386/i386.c (ix86_static_rtx_alignment): New function,
	split out from...
	(ix86_constant_alignment): ...here.
	(TARGET_STATIC_RTX_ALIGNMENT): Redefine.
	* config/mmix/mmix.c (TARGET_STATIC_RTX_ALIGNMENT): Redefine.
	(mmix_static_rtx_alignment): New function.
	* config/spu/spu.c (spu_static_rtx_alignment): New function.
	(TARGET_STATIC_RTX_ALIGNMENT): Redefine.

Index: gcc/target.def
===================================================================
--- gcc/target.def	2017-09-25 17:04:16.792359030 +0100
+++ gcc/target.def	2017-10-01 17:14:18.480815538 +0100
@@ -3336,6 +3336,15 @@ HOOK_VECTOR_END (addr_space)
 #define HOOK_PREFIX "TARGET_"
 
 DEFHOOK
+(static_rtx_alignment,
+ "This hook returns the preferred alignment in bits for a\n\
+statically-allocated rtx, such as a constant pool entry.  @var{mode}\n\
+is the mode of the rtx.  The default implementation returns\n\
+@samp{GET_MODE_ALIGNMENT (@var{mode})}.",
+ HOST_WIDE_INT, (machine_mode mode),
+ default_static_rtx_alignment)
+
+DEFHOOK
 (constant_alignment,
  "This hook returns the alignment in bits of a constant that is being\n\
 placed in memory.  @var{constant} is the constant and @var{basic_align}\n\
Index: gcc/targhooks.h
===================================================================
--- gcc/targhooks.h	2017-09-25 17:04:16.793358890 +0100
+++ gcc/targhooks.h	2017-10-01 17:14:18.481821912 +0100
@@ -93,6 +93,7 @@ extern int default_builtin_vectorization
 
 extern tree default_builtin_reciprocal (tree);
 
+extern HOST_WIDE_INT default_static_rtx_alignment (machine_mode);
 extern HOST_WIDE_INT default_constant_alignment (const_tree, HOST_WIDE_INT);
 extern HOST_WIDE_INT constant_alignment_word_strings (const_tree,
 						      HOST_WIDE_INT);
Index: gcc/targhooks.c
===================================================================
--- gcc/targhooks.c	2017-09-25 17:04:16.793358890 +0100
+++ gcc/targhooks.c	2017-10-01 17:14:18.481821912 +0100
@@ -1165,6 +1165,14 @@ tree default_mangle_decl_assembler_name
    return id;
 }
 
+/* The default implementation of TARGET_STATIC_RTX_ALIGNMENT.  */
+
+HOST_WIDE_INT
+default_static_rtx_alignment (machine_mode mode)
+{
+  return GET_MODE_ALIGNMENT (mode);
+}
+
 /* The default implementation of TARGET_CONSTANT_ALIGNMENT.  */
 
 HOST_WIDE_INT
Index: gcc/doc/tm.texi.in
===================================================================
--- gcc/doc/tm.texi.in	2017-09-25 17:04:16.792359030 +0100
+++ gcc/doc/tm.texi.in	2017-10-01 17:14:18.480815538 +0100
@@ -1026,6 +1026,8 @@ On 32-bit ELF the largest supported sect
 @samp{(0x80000000 * 8)}, but this is not representable on 32-bit hosts.
 @end defmac
 
+@hook TARGET_STATIC_RTX_ALIGNMENT
+
 @defmac DATA_ALIGNMENT (@var{type}, @var{basic-align})
 If defined, a C expression to compute the alignment for a variable in
 the static store.  @var{type} is the data type, and @var{basic-align} is
Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi	2017-09-25 17:04:16.791359170 +0100
+++ gcc/doc/tm.texi	2017-10-01 17:14:18.479809163 +0100
@@ -1078,6 +1078,13 @@ On 32-bit ELF the largest supported sect
 @samp{(0x80000000 * 8)}, but this is not representable on 32-bit hosts.
 @end defmac
 
+@deftypefn {Target Hook} HOST_WIDE_INT TARGET_STATIC_RTX_ALIGNMENT (machine_mode @var{mode})
+This hook returns the preferred alignment in bits for a
+statically-allocated rtx, such as a constant pool entry.  @var{mode}
+is the mode of the rtx.  The default implementation returns
+@samp{GET_MODE_ALIGNMENT (@var{mode})}.
+@end deftypefn
+
 @defmac DATA_ALIGNMENT (@var{type}, @var{basic-align})
 If defined, a C expression to compute the alignment for a variable in
 the static store.  @var{type} is the data type, and @var{basic-align} is
Index: gcc/varasm.c
===================================================================
--- gcc/varasm.c	2017-09-25 17:04:16.793358890 +0100
+++ gcc/varasm.c	2017-10-01 17:14:18.481821912 +0100
@@ -3784,11 +3784,8 @@ force_const_mem (machine_mode mode, rtx
   *slot = desc;
 
   /* Align the location counter as required by EXP's data type.  */
-  align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
-
-  tree type = lang_hooks.types.type_for_mode (mode, 0);
-  if (type != NULL_TREE)
-    align = targetm.constant_alignment (make_tree (type, x), align);
+  machine_mode align_mode = (mode == VOIDmode ? word_mode : mode);
+  align = targetm.static_rtx_alignment (align_mode);
 
   pool->offset += (align / BITS_PER_UNIT) - 1;
   pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
@@ -3830,7 +3827,6 @@ force_const_mem (machine_mode mode, rtx
 
   /* Construct the MEM.  */
   desc->mem = def = gen_const_mem (mode, symbol);
-  set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
   set_mem_align (def, align);
 
   /* If we're dropping a label to the constant pool, make sure we
Index: gcc/config/cris/cris.c
===================================================================
--- gcc/config/cris/cris.c	2017-09-25 17:04:16.762363228 +0100
+++ gcc/config/cris/cris.c	2017-10-01 17:14:18.472764540 +0100
@@ -165,6 +165,7 @@ static bool cris_function_value_regno_p
 static void cris_file_end (void);
 static unsigned int cris_hard_regno_nregs (unsigned int, machine_mode);
 static bool cris_hard_regno_mode_ok (unsigned int, machine_mode);
+static HOST_WIDE_INT cris_static_rtx_alignment (machine_mode);
 static HOST_WIDE_INT cris_constant_alignment (const_tree, HOST_WIDE_INT);
 
 /* This is the parsed result of the "-max-stack-stackframe=" option.  If
@@ -288,6 +289,8 @@ #define TARGET_HARD_REGNO_NREGS cris_har
 #undef TARGET_HARD_REGNO_MODE_OK
 #define TARGET_HARD_REGNO_MODE_OK cris_hard_regno_mode_ok
 
+#undef TARGET_STATIC_RTX_ALIGNMENT
+#define TARGET_STATIC_RTX_ALIGNMENT cris_static_rtx_alignment
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT cris_constant_alignment
 
@@ -4329,6 +4332,26 @@ cris_hard_regno_mode_ok (unsigned int re
 	      || (regno != CRIS_MOF_REGNUM && regno != CRIS_ACR_REGNUM)));
 }
 
+/* Return the preferred minimum alignment for a static object.  */
+
+static HOST_WIDE_INT
+cris_preferred_mininum_alignment (void)
+{
+  if (!TARGET_CONST_ALIGN)
+    return 8;
+  if (TARGET_ALIGN_BY_32)
+    return 32;
+  return 16;
+}
+
+/* Implement TARGET_STATIC_RTX_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+cris_static_rtx_alignment (machine_mode mode)
+{
+  return MAX (cris_preferred_mininum_alignment (), GET_MODE_ALIGNMENT (mode));
+}
+
 /* Implement TARGET_CONSTANT_ALIGNMENT.  Note that this hook has the
    effect of making gcc believe that ALL references to constant stuff
    (in code segment, like strings) have this alignment.  That is a rather
@@ -4339,11 +4362,7 @@ cris_hard_regno_mode_ok (unsigned int re
 static HOST_WIDE_INT
 cris_constant_alignment (const_tree, HOST_WIDE_INT basic_align)
 {
-  if (!TARGET_CONST_ALIGN)
-    return basic_align;
-  if (TARGET_ALIGN_BY_32)
-    return MAX (basic_align, 32);
-  return MAX (basic_align, 16);
+  return MAX (cris_preferred_mininum_alignment (), basic_align);
 }
 
 #if 0
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c	2017-09-25 17:04:16.768362388 +0100
+++ gcc/config/i386/i386.c	2017-10-01 17:14:18.477796414 +0100
@@ -31563,6 +31563,18 @@ ix86_sched_init_global (FILE *, int, int
 }
 
 
+/* Implement TARGET_STATIC_RTX_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+ix86_static_rtx_alignment (machine_mode mode)
+{
+  if (mode == DFmode)
+    return 64;
+  if (ALIGN_MODE_128 (mode))
+    return MAX (128, GET_MODE_ALIGNMENT (mode));
+  return GET_MODE_ALIGNMENT (mode);
+}
+
 /* Implement TARGET_CONSTANT_ALIGNMENT.  */
 
 static HOST_WIDE_INT
@@ -31571,10 +31583,9 @@ ix86_constant_alignment (const_tree exp,
   if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST
       || TREE_CODE (exp) == INTEGER_CST)
     {
-      if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
-	return 64;
-      else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
-	return 128;
+      machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
+      HOST_WIDE_INT mode_align = ix86_static_rtx_alignment (mode);
+      return MAX (mode_align, align);
     }
   else if (!optimize_size && TREE_CODE (exp) == STRING_CST
 	   && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)
@@ -53605,6 +53616,8 @@ #define TARGET_HARD_REGNO_CALL_PART_CLOB
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS ix86_can_change_mode_class
 
+#undef TARGET_STATIC_RTX_ALIGNMENT
+#define TARGET_STATIC_RTX_ALIGNMENT ix86_static_rtx_alignment
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT ix86_constant_alignment
 
Index: gcc/config/mmix/mmix.c
===================================================================
--- gcc/config/mmix/mmix.c	2017-09-25 17:04:16.774361549 +0100
+++ gcc/config/mmix/mmix.c	2017-10-01 17:14:18.477796414 +0100
@@ -168,6 +168,7 @@ static void mmix_print_operand (FILE *,
 static void mmix_print_operand_address (FILE *, machine_mode, rtx);
 static bool mmix_print_operand_punct_valid_p (unsigned char);
 static void mmix_conditional_register_usage (void);
+static HOST_WIDE_INT mmix_static_rtx_alignment (machine_mode);
 static HOST_WIDE_INT mmix_constant_alignment (const_tree, HOST_WIDE_INT);
 
 /* Target structure macros.  Listed by node.  See `Using and Porting GCC'
@@ -283,6 +284,8 @@ #define TARGET_TRAMPOLINE_INIT mmix_tram
 #undef TARGET_OPTION_OVERRIDE
 #define TARGET_OPTION_OVERRIDE mmix_option_override
 
+#undef TARGET_STATIC_RTX_ALIGNMENT
+#define TARGET_STATIC_RTX_ALIGNMENT mmix_static_rtx_alignment
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT mmix_constant_alignment
 
@@ -338,6 +341,14 @@ mmix_data_alignment (tree type ATTRIBUTE
   return basic_align;
 }
 
+/* Implement TARGET_STATIC_RTX_ALIGNMENT.  */
+
+static HOST_WIDE_INT
+mmix_static_rtx_alignment (machine_mode mode)
+{
+  return MAX (GET_MODE_ALIGNMENT (mode), 32);
+}
+
 /* Implement tARGET_CONSTANT_ALIGNMENT.  */
 
 static HOST_WIDE_INT
Index: gcc/config/spu/spu.c
===================================================================
--- gcc/config/spu/spu.c	2017-09-25 17:04:16.787359730 +0100
+++ gcc/config/spu/spu.c	2017-10-01 17:14:18.478802788 +0100
@@ -7194,6 +7194,18 @@ spu_truly_noop_truncation (unsigned int
   return inprec <= 32 && outprec <= inprec;
 }
 
+/* Implement TARGET_STATIC_RTX_ALIGNMENT.
+
+   Make all static objects 16-byte aligned.  This allows us to assume
+   they are also padded to 16 bytes, which means we can use a single
+   load or store instruction to access them.  */
+
+static HOST_WIDE_INT
+spu_static_rtx_alignment (machine_mode mode)
+{
+  return MAX (GET_MODE_ALIGNMENT (mode), 128);
+}
+
 /* Implement TARGET_CONSTANT_ALIGNMENT.
 
    Make all static objects 16-byte aligned.  This allows us to assume
@@ -7445,6 +7457,8 @@ #define TARGET_CAN_CHANGE_MODE_CLASS spu
 #undef TARGET_TRULY_NOOP_TRUNCATION
 #define TARGET_TRULY_NOOP_TRUNCATION spu_truly_noop_truncation
 
+#undef TARGET_STATIC_RTX_ALIGNMENT
+#define TARGET_STATIC_RTX_ALIGNMENT spu_static_rtx_alignment
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT spu_constant_alignment
Richard Sandiford Oct. 23, 2017, 6:02 p.m. UTC | #7
Ping.

Richard Sandiford <richard.sandiford@linaro.org> writes:
> Richard Biener <richard.guenther@gmail.com> writes:

>> On Fri, Sep 22, 2017 at 6:42 PM, Richard Sandiford

>> <richard.sandiford@linaro.org> wrote:

>>> Richard Biener <richard.guenther@gmail.com> writes:

>>>> On Thu, Sep 21, 2017 at 2:56 PM, Richard Sandiford

>>>> <richard.sandiford@linaro.org> wrote:

>>>>> Richard Biener <richard.guenther@gmail.com> writes:

>>>>>> On September 20, 2017 2:36:03 PM GMT+02:00, Richard Sandiford

>>>>>> <richard.sandiford@linaro.org> wrote:

>>>>>>>When forcing a constant of mode MODE into memory, force_const_mem

>>>>>>>asks the frontend to provide the type associated with that mode.

>>>>>>>In principle type_for_mode is allowed to return null, and although

>>>>>>>one use site correctly handled that, the other didn't.

>>>>>>>

>>>>>>>I think there's agreement that it's bogus to use type_for_mode for

>>>>>>>this kind of thing, since it forces frontends to handle types that

>>>>>>>don't exist in that language.  See e.g. http://gcc.gnu.org/PR46805

>>>>>>>where the Go frontend was forced to handle vector types even though

>>>>>>>Go doesn't have vector types.

>>>>>>>

>>>>>>>Also, the frontends use code like:

>>>>>>>

>>>>>>>  else if (VECTOR_MODE_P (mode))

>>>>>>>    {

>>>>>>>      machine_mode inner_mode = GET_MODE_INNER (mode);

>>>>>>>      tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);

>>>>>>>      if (inner_type != NULL_TREE)

>>>>>>>        return build_vector_type_for_mode (inner_type, mode);

>>>>>>>    }

>>>>>>>

>>>>>>>and there's no guarantee that every vector mode M used by backend

>>>>>>>rtl has an associated vector type whose TYPE_MODE is M.  I think

>>>>>>>really the type_for_mode hook should only return trees that _do_ have

>>>>>>>the requested TYPE_MODE, but PR46805 linked above shows that this is

>>>>>>>likely to have too many knock-on consequences.  It doesn't make sense

>>>>>>>for force_const_mem to ask about vector modes that aren't valid for

>>>>>>>vector types, so this patch handles the condition there instead.

>>>>>>>

>>>>>>>This is needed for SVE multi-register modes, which are modelled as

>>>>>>>vector modes but are not usable as vector types.

>>>>>>>

>>>>>>>Tested on aarch64-linux-gnu, x86_64-linux-gnu and

>>>>>>>powerpc64le-linus-gnu.

>>>>>>>OK to install?

>>>>>>

>>>>>> I think we should get rid of the use entirely.

>>>>>

>>>>> I first read this as not using type_for_mode at all in force_const_mem,

>>>>> which sounded like a good thing :-)

>>>>

>>>> That's what I meant ;)  A mode doesn't really have a type...

>>>>

>>>>   I tried it overnight on the usual

>>>>> at-least-one-target-per-CPU set and diffing the before and after

>>>>> assembly for the testsuite.  And it looks like i686 relies on this

>>>>> to get an alignment of 16 rather than 4 for XFmode constants:

>>>>> GET_MODE_ALIGNMENT (XFmode) == 32 (as requested by i386-modes.def),

>>>>> but i386's CONSTANT_ALIGNMENT increases it to 128 for static constants.

>>>>

>>>> Then the issue is that CONSTANT_ALIGNMENT takes a tree and not a mode...

>>>> even worse than type_for_mode is a use of make_tree!  Incidentially

>>>> ix86_constant_alignment _does_ look at the mode in the end...

>>>

>>> OK, I guess this means another target hook conversion.  The patch

>>> below converts CONSTANT_ALIGNMENT with its current interface.

>>> The definition:

>>>

>>>   #define CONSTANT_ALIGNMENT(EXP, ALIGN) \

>>>     (TREE_CODE (EXP) == STRING_CST \

>>>      && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

>>>

>>> was very common, so the patch adds a canned definition for that,

>>> called constant_alignment_word_strings.  Some ports had a variation

>>> that used a port-local FASTEST_ALIGNMENT instead of BITS_PER_WORD;

>>> the patch uses constant_alignment_word_strings if FASTEST_ALIGNMENT

>>> was always BITS_PER_WORD and a port-local hook function otherwise.

>>>

>>> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.

>>> Also tested by comparing the testsuite assembly output on at least one

>>> target per CPU directory.  I don't think this comes under Jeff's

>>> preapproval due to the constant_alignment_word_strings thing, so:

>>> OK to install?

>>

>> Ok.

>

> Thanks.  A bit later than intended, but here's the follow-on to add

> the new rtx hook.

>

> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.

> Also tested by comparing the testsuite assembly output on at least one

> target per CPU directory.  OK to install?

>

> Richard

>

>

> 2017-10-01  Richard Sandiford  <richard.sandiford@linaro.org>

>

> gcc/

> 	* target.def (static_rtx_alignment): New hook.

> 	* targhooks.h (default_static_rtx_alignment): Declare.

> 	* targhooks.c (default_static_rtx_alignment): New function.

> 	* doc/tm.texi.in (TARGET_STATIC_RTX_ALIGNMENT): New hook.

> 	* doc/tm.texi: Regenerate.

> 	* varasm.c (force_const_mem): Use targetm.static_rtx_alignment

> 	instead of targetm.constant_alignment.  Remove call to

> 	set_mem_attributes.

> 	* config/cris/cris.c (TARGET_STATIC_RTX_ALIGNMENT): Redefine.

> 	(cris_preferred_mininum_alignment): New function, split out from...

> 	(cris_constant_alignment): ...here.

> 	(cris_static_rtx_alignment): New function.

> 	* config/i386/i386.c (ix86_static_rtx_alignment): New function,

> 	split out from...

> 	(ix86_constant_alignment): ...here.

> 	(TARGET_STATIC_RTX_ALIGNMENT): Redefine.

> 	* config/mmix/mmix.c (TARGET_STATIC_RTX_ALIGNMENT): Redefine.

> 	(mmix_static_rtx_alignment): New function.

> 	* config/spu/spu.c (spu_static_rtx_alignment): New function.

> 	(TARGET_STATIC_RTX_ALIGNMENT): Redefine.

>

> Index: gcc/target.def

> ===================================================================

> --- gcc/target.def	2017-09-25 17:04:16.792359030 +0100

> +++ gcc/target.def	2017-10-01 17:14:18.480815538 +0100

> @@ -3336,6 +3336,15 @@ HOOK_VECTOR_END (addr_space)

>  #define HOOK_PREFIX "TARGET_"

>  

>  DEFHOOK

> +(static_rtx_alignment,

> + "This hook returns the preferred alignment in bits for a\n\

> +statically-allocated rtx, such as a constant pool entry.  @var{mode}\n\

> +is the mode of the rtx.  The default implementation returns\n\

> +@samp{GET_MODE_ALIGNMENT (@var{mode})}.",

> + HOST_WIDE_INT, (machine_mode mode),

> + default_static_rtx_alignment)

> +

> +DEFHOOK

>  (constant_alignment,

>   "This hook returns the alignment in bits of a constant that is being\n\

>  placed in memory.  @var{constant} is the constant and @var{basic_align}\n\

> Index: gcc/targhooks.h

> ===================================================================

> --- gcc/targhooks.h	2017-09-25 17:04:16.793358890 +0100

> +++ gcc/targhooks.h	2017-10-01 17:14:18.481821912 +0100

> @@ -93,6 +93,7 @@ extern int default_builtin_vectorization

>  

>  extern tree default_builtin_reciprocal (tree);

>  

> +extern HOST_WIDE_INT default_static_rtx_alignment (machine_mode);

>  extern HOST_WIDE_INT default_constant_alignment (const_tree, HOST_WIDE_INT);

>  extern HOST_WIDE_INT constant_alignment_word_strings (const_tree,

>  						      HOST_WIDE_INT);

> Index: gcc/targhooks.c

> ===================================================================

> --- gcc/targhooks.c	2017-09-25 17:04:16.793358890 +0100

> +++ gcc/targhooks.c	2017-10-01 17:14:18.481821912 +0100

> @@ -1165,6 +1165,14 @@ tree default_mangle_decl_assembler_name

>     return id;

>  }

>  

> +/* The default implementation of TARGET_STATIC_RTX_ALIGNMENT.  */

> +

> +HOST_WIDE_INT

> +default_static_rtx_alignment (machine_mode mode)

> +{

> +  return GET_MODE_ALIGNMENT (mode);

> +}

> +

>  /* The default implementation of TARGET_CONSTANT_ALIGNMENT.  */

>  

>  HOST_WIDE_INT

> Index: gcc/doc/tm.texi.in

> ===================================================================

> --- gcc/doc/tm.texi.in	2017-09-25 17:04:16.792359030 +0100

> +++ gcc/doc/tm.texi.in	2017-10-01 17:14:18.480815538 +0100

> @@ -1026,6 +1026,8 @@ On 32-bit ELF the largest supported sect

>  @samp{(0x80000000 * 8)}, but this is not representable on 32-bit hosts.

>  @end defmac

>  

> +@hook TARGET_STATIC_RTX_ALIGNMENT

> +

>  @defmac DATA_ALIGNMENT (@var{type}, @var{basic-align})

>  If defined, a C expression to compute the alignment for a variable in

>  the static store.  @var{type} is the data type, and @var{basic-align} is

> Index: gcc/doc/tm.texi

> ===================================================================

> --- gcc/doc/tm.texi	2017-09-25 17:04:16.791359170 +0100

> +++ gcc/doc/tm.texi	2017-10-01 17:14:18.479809163 +0100

> @@ -1078,6 +1078,13 @@ On 32-bit ELF the largest supported sect

>  @samp{(0x80000000 * 8)}, but this is not representable on 32-bit hosts.

>  @end defmac

>  

> +@deftypefn {Target Hook} HOST_WIDE_INT TARGET_STATIC_RTX_ALIGNMENT (machine_mode @var{mode})

> +This hook returns the preferred alignment in bits for a

> +statically-allocated rtx, such as a constant pool entry.  @var{mode}

> +is the mode of the rtx.  The default implementation returns

> +@samp{GET_MODE_ALIGNMENT (@var{mode})}.

> +@end deftypefn

> +

>  @defmac DATA_ALIGNMENT (@var{type}, @var{basic-align})

>  If defined, a C expression to compute the alignment for a variable in

>  the static store.  @var{type} is the data type, and @var{basic-align} is

> Index: gcc/varasm.c

> ===================================================================

> --- gcc/varasm.c	2017-09-25 17:04:16.793358890 +0100

> +++ gcc/varasm.c	2017-10-01 17:14:18.481821912 +0100

> @@ -3784,11 +3784,8 @@ force_const_mem (machine_mode mode, rtx

>    *slot = desc;

>  

>    /* Align the location counter as required by EXP's data type.  */

> -  align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);

> -

> -  tree type = lang_hooks.types.type_for_mode (mode, 0);

> -  if (type != NULL_TREE)

> -    align = targetm.constant_alignment (make_tree (type, x), align);

> +  machine_mode align_mode = (mode == VOIDmode ? word_mode : mode);

> +  align = targetm.static_rtx_alignment (align_mode);

>  

>    pool->offset += (align / BITS_PER_UNIT) - 1;

>    pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);

> @@ -3830,7 +3827,6 @@ force_const_mem (machine_mode mode, rtx

>  

>    /* Construct the MEM.  */

>    desc->mem = def = gen_const_mem (mode, symbol);

> -  set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);

>    set_mem_align (def, align);

>  

>    /* If we're dropping a label to the constant pool, make sure we

> Index: gcc/config/cris/cris.c

> ===================================================================

> --- gcc/config/cris/cris.c	2017-09-25 17:04:16.762363228 +0100

> +++ gcc/config/cris/cris.c	2017-10-01 17:14:18.472764540 +0100

> @@ -165,6 +165,7 @@ static bool cris_function_value_regno_p

>  static void cris_file_end (void);

>  static unsigned int cris_hard_regno_nregs (unsigned int, machine_mode);

>  static bool cris_hard_regno_mode_ok (unsigned int, machine_mode);

> +static HOST_WIDE_INT cris_static_rtx_alignment (machine_mode);

>  static HOST_WIDE_INT cris_constant_alignment (const_tree, HOST_WIDE_INT);

>  

>  /* This is the parsed result of the "-max-stack-stackframe=" option.  If

> @@ -288,6 +289,8 @@ #define TARGET_HARD_REGNO_NREGS cris_har

>  #undef TARGET_HARD_REGNO_MODE_OK

>  #define TARGET_HARD_REGNO_MODE_OK cris_hard_regno_mode_ok

>  

> +#undef TARGET_STATIC_RTX_ALIGNMENT

> +#define TARGET_STATIC_RTX_ALIGNMENT cris_static_rtx_alignment

>  #undef TARGET_CONSTANT_ALIGNMENT

>  #define TARGET_CONSTANT_ALIGNMENT cris_constant_alignment

>  

> @@ -4329,6 +4332,26 @@ cris_hard_regno_mode_ok (unsigned int re

>  	      || (regno != CRIS_MOF_REGNUM && regno != CRIS_ACR_REGNUM)));

>  }

>  

> +/* Return the preferred minimum alignment for a static object.  */

> +

> +static HOST_WIDE_INT

> +cris_preferred_mininum_alignment (void)

> +{

> +  if (!TARGET_CONST_ALIGN)

> +    return 8;

> +  if (TARGET_ALIGN_BY_32)

> +    return 32;

> +  return 16;

> +}

> +

> +/* Implement TARGET_STATIC_RTX_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +cris_static_rtx_alignment (machine_mode mode)

> +{

> +  return MAX (cris_preferred_mininum_alignment (), GET_MODE_ALIGNMENT (mode));

> +}

> +

>  /* Implement TARGET_CONSTANT_ALIGNMENT.  Note that this hook has the

>     effect of making gcc believe that ALL references to constant stuff

>     (in code segment, like strings) have this alignment.  That is a rather

> @@ -4339,11 +4362,7 @@ cris_hard_regno_mode_ok (unsigned int re

>  static HOST_WIDE_INT

>  cris_constant_alignment (const_tree, HOST_WIDE_INT basic_align)

>  {

> -  if (!TARGET_CONST_ALIGN)

> -    return basic_align;

> -  if (TARGET_ALIGN_BY_32)

> -    return MAX (basic_align, 32);

> -  return MAX (basic_align, 16);

> +  return MAX (cris_preferred_mininum_alignment (), basic_align);

>  }

>  

>  #if 0

> Index: gcc/config/i386/i386.c

> ===================================================================

> --- gcc/config/i386/i386.c	2017-09-25 17:04:16.768362388 +0100

> +++ gcc/config/i386/i386.c	2017-10-01 17:14:18.477796414 +0100

> @@ -31563,6 +31563,18 @@ ix86_sched_init_global (FILE *, int, int

>  }

>  

>  

> +/* Implement TARGET_STATIC_RTX_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +ix86_static_rtx_alignment (machine_mode mode)

> +{

> +  if (mode == DFmode)

> +    return 64;

> +  if (ALIGN_MODE_128 (mode))

> +    return MAX (128, GET_MODE_ALIGNMENT (mode));

> +  return GET_MODE_ALIGNMENT (mode);

> +}

> +

>  /* Implement TARGET_CONSTANT_ALIGNMENT.  */

>  

>  static HOST_WIDE_INT

> @@ -31571,10 +31583,9 @@ ix86_constant_alignment (const_tree exp,

>    if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST

>        || TREE_CODE (exp) == INTEGER_CST)

>      {

> -      if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)

> -	return 64;

> -      else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)

> -	return 128;

> +      machine_mode mode = TYPE_MODE (TREE_TYPE (exp));

> +      HOST_WIDE_INT mode_align = ix86_static_rtx_alignment (mode);

> +      return MAX (mode_align, align);

>      }

>    else if (!optimize_size && TREE_CODE (exp) == STRING_CST

>  	   && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)

> @@ -53605,6 +53616,8 @@ #define TARGET_HARD_REGNO_CALL_PART_CLOB

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS ix86_can_change_mode_class

>  

> +#undef TARGET_STATIC_RTX_ALIGNMENT

> +#define TARGET_STATIC_RTX_ALIGNMENT ix86_static_rtx_alignment

>  #undef TARGET_CONSTANT_ALIGNMENT

>  #define TARGET_CONSTANT_ALIGNMENT ix86_constant_alignment

>  

> Index: gcc/config/mmix/mmix.c

> ===================================================================

> --- gcc/config/mmix/mmix.c	2017-09-25 17:04:16.774361549 +0100

> +++ gcc/config/mmix/mmix.c	2017-10-01 17:14:18.477796414 +0100

> @@ -168,6 +168,7 @@ static void mmix_print_operand (FILE *,

>  static void mmix_print_operand_address (FILE *, machine_mode, rtx);

>  static bool mmix_print_operand_punct_valid_p (unsigned char);

>  static void mmix_conditional_register_usage (void);

> +static HOST_WIDE_INT mmix_static_rtx_alignment (machine_mode);

>  static HOST_WIDE_INT mmix_constant_alignment (const_tree, HOST_WIDE_INT);

>  

>  /* Target structure macros.  Listed by node.  See `Using and Porting GCC'

> @@ -283,6 +284,8 @@ #define TARGET_TRAMPOLINE_INIT mmix_tram

>  #undef TARGET_OPTION_OVERRIDE

>  #define TARGET_OPTION_OVERRIDE mmix_option_override

>  

> +#undef TARGET_STATIC_RTX_ALIGNMENT

> +#define TARGET_STATIC_RTX_ALIGNMENT mmix_static_rtx_alignment

>  #undef TARGET_CONSTANT_ALIGNMENT

>  #define TARGET_CONSTANT_ALIGNMENT mmix_constant_alignment

>  

> @@ -338,6 +341,14 @@ mmix_data_alignment (tree type ATTRIBUTE

>    return basic_align;

>  }

>  

> +/* Implement TARGET_STATIC_RTX_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +mmix_static_rtx_alignment (machine_mode mode)

> +{

> +  return MAX (GET_MODE_ALIGNMENT (mode), 32);

> +}

> +

>  /* Implement tARGET_CONSTANT_ALIGNMENT.  */

>  

>  static HOST_WIDE_INT

> Index: gcc/config/spu/spu.c

> ===================================================================

> --- gcc/config/spu/spu.c	2017-09-25 17:04:16.787359730 +0100

> +++ gcc/config/spu/spu.c	2017-10-01 17:14:18.478802788 +0100

> @@ -7194,6 +7194,18 @@ spu_truly_noop_truncation (unsigned int

>    return inprec <= 32 && outprec <= inprec;

>  }

>  

> +/* Implement TARGET_STATIC_RTX_ALIGNMENT.

> +

> +   Make all static objects 16-byte aligned.  This allows us to assume

> +   they are also padded to 16 bytes, which means we can use a single

> +   load or store instruction to access them.  */

> +

> +static HOST_WIDE_INT

> +spu_static_rtx_alignment (machine_mode mode)

> +{

> +  return MAX (GET_MODE_ALIGNMENT (mode), 128);

> +}

> +

>  /* Implement TARGET_CONSTANT_ALIGNMENT.

>  

>     Make all static objects 16-byte aligned.  This allows us to assume

> @@ -7445,6 +7457,8 @@ #define TARGET_CAN_CHANGE_MODE_CLASS spu

>  #undef TARGET_TRULY_NOOP_TRUNCATION

>  #define TARGET_TRULY_NOOP_TRUNCATION spu_truly_noop_truncation

>  

> +#undef TARGET_STATIC_RTX_ALIGNMENT

> +#define TARGET_STATIC_RTX_ALIGNMENT spu_static_rtx_alignment

>  #undef TARGET_CONSTANT_ALIGNMENT

>  #define TARGET_CONSTANT_ALIGNMENT spu_constant_alignment

>
Richard Biener Oct. 25, 2017, 1:09 p.m. UTC | #8
On Sun, Oct 1, 2017 at 6:17 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> Richard Biener <richard.guenther@gmail.com> writes:

>> On Fri, Sep 22, 2017 at 6:42 PM, Richard Sandiford

>> <richard.sandiford@linaro.org> wrote:

>>> Richard Biener <richard.guenther@gmail.com> writes:

>>>> On Thu, Sep 21, 2017 at 2:56 PM, Richard Sandiford

>>>> <richard.sandiford@linaro.org> wrote:

>>>>> Richard Biener <richard.guenther@gmail.com> writes:

>>>>>> On September 20, 2017 2:36:03 PM GMT+02:00, Richard Sandiford

>>>>>> <richard.sandiford@linaro.org> wrote:

>>>>>>>When forcing a constant of mode MODE into memory, force_const_mem

>>>>>>>asks the frontend to provide the type associated with that mode.

>>>>>>>In principle type_for_mode is allowed to return null, and although

>>>>>>>one use site correctly handled that, the other didn't.

>>>>>>>

>>>>>>>I think there's agreement that it's bogus to use type_for_mode for

>>>>>>>this kind of thing, since it forces frontends to handle types that

>>>>>>>don't exist in that language.  See e.g. http://gcc.gnu.org/PR46805

>>>>>>>where the Go frontend was forced to handle vector types even though

>>>>>>>Go doesn't have vector types.

>>>>>>>

>>>>>>>Also, the frontends use code like:

>>>>>>>

>>>>>>>  else if (VECTOR_MODE_P (mode))

>>>>>>>    {

>>>>>>>      machine_mode inner_mode = GET_MODE_INNER (mode);

>>>>>>>      tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);

>>>>>>>      if (inner_type != NULL_TREE)

>>>>>>>        return build_vector_type_for_mode (inner_type, mode);

>>>>>>>    }

>>>>>>>

>>>>>>>and there's no guarantee that every vector mode M used by backend

>>>>>>>rtl has an associated vector type whose TYPE_MODE is M.  I think

>>>>>>>really the type_for_mode hook should only return trees that _do_ have

>>>>>>>the requested TYPE_MODE, but PR46805 linked above shows that this is

>>>>>>>likely to have too many knock-on consequences.  It doesn't make sense

>>>>>>>for force_const_mem to ask about vector modes that aren't valid for

>>>>>>>vector types, so this patch handles the condition there instead.

>>>>>>>

>>>>>>>This is needed for SVE multi-register modes, which are modelled as

>>>>>>>vector modes but are not usable as vector types.

>>>>>>>

>>>>>>>Tested on aarch64-linux-gnu, x86_64-linux-gnu and

>>>>>>>powerpc64le-linus-gnu.

>>>>>>>OK to install?

>>>>>>

>>>>>> I think we should get rid of the use entirely.

>>>>>

>>>>> I first read this as not using type_for_mode at all in force_const_mem,

>>>>> which sounded like a good thing :-)

>>>>

>>>> That's what I meant ;)  A mode doesn't really have a type...

>>>>

>>>>   I tried it overnight on the usual

>>>>> at-least-one-target-per-CPU set and diffing the before and after

>>>>> assembly for the testsuite.  And it looks like i686 relies on this

>>>>> to get an alignment of 16 rather than 4 for XFmode constants:

>>>>> GET_MODE_ALIGNMENT (XFmode) == 32 (as requested by i386-modes.def),

>>>>> but i386's CONSTANT_ALIGNMENT increases it to 128 for static constants.

>>>>

>>>> Then the issue is that CONSTANT_ALIGNMENT takes a tree and not a mode...

>>>> even worse than type_for_mode is a use of make_tree!  Incidentially

>>>> ix86_constant_alignment _does_ look at the mode in the end...

>>>

>>> OK, I guess this means another target hook conversion.  The patch

>>> below converts CONSTANT_ALIGNMENT with its current interface.

>>> The definition:

>>>

>>>   #define CONSTANT_ALIGNMENT(EXP, ALIGN) \

>>>     (TREE_CODE (EXP) == STRING_CST \

>>>      && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))

>>>

>>> was very common, so the patch adds a canned definition for that,

>>> called constant_alignment_word_strings.  Some ports had a variation

>>> that used a port-local FASTEST_ALIGNMENT instead of BITS_PER_WORD;

>>> the patch uses constant_alignment_word_strings if FASTEST_ALIGNMENT

>>> was always BITS_PER_WORD and a port-local hook function otherwise.

>>>

>>> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.

>>> Also tested by comparing the testsuite assembly output on at least one

>>> target per CPU directory.  I don't think this comes under Jeff's

>>> preapproval due to the constant_alignment_word_strings thing, so:

>>> OK to install?

>>

>> Ok.

>

> Thanks.  A bit later than intended, but here's the follow-on to add

> the new rtx hook.

>

> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.

> Also tested by comparing the testsuite assembly output on at least one

> target per CPU directory.  OK to install?


Ok, sorry for the delay.

Richard.

> Richard

>

>

> 2017-10-01  Richard Sandiford  <richard.sandiford@linaro.org>

>

> gcc/

>         * target.def (static_rtx_alignment): New hook.

>         * targhooks.h (default_static_rtx_alignment): Declare.

>         * targhooks.c (default_static_rtx_alignment): New function.

>         * doc/tm.texi.in (TARGET_STATIC_RTX_ALIGNMENT): New hook.

>         * doc/tm.texi: Regenerate.

>         * varasm.c (force_const_mem): Use targetm.static_rtx_alignment

>         instead of targetm.constant_alignment.  Remove call to

>         set_mem_attributes.

>         * config/cris/cris.c (TARGET_STATIC_RTX_ALIGNMENT): Redefine.

>         (cris_preferred_mininum_alignment): New function, split out from...

>         (cris_constant_alignment): ...here.

>         (cris_static_rtx_alignment): New function.

>         * config/i386/i386.c (ix86_static_rtx_alignment): New function,

>         split out from...

>         (ix86_constant_alignment): ...here.

>         (TARGET_STATIC_RTX_ALIGNMENT): Redefine.

>         * config/mmix/mmix.c (TARGET_STATIC_RTX_ALIGNMENT): Redefine.

>         (mmix_static_rtx_alignment): New function.

>         * config/spu/spu.c (spu_static_rtx_alignment): New function.

>         (TARGET_STATIC_RTX_ALIGNMENT): Redefine.

>

> Index: gcc/target.def

> ===================================================================

> --- gcc/target.def      2017-09-25 17:04:16.792359030 +0100

> +++ gcc/target.def      2017-10-01 17:14:18.480815538 +0100

> @@ -3336,6 +3336,15 @@ HOOK_VECTOR_END (addr_space)

>  #define HOOK_PREFIX "TARGET_"

>

>  DEFHOOK

> +(static_rtx_alignment,

> + "This hook returns the preferred alignment in bits for a\n\

> +statically-allocated rtx, such as a constant pool entry.  @var{mode}\n\

> +is the mode of the rtx.  The default implementation returns\n\

> +@samp{GET_MODE_ALIGNMENT (@var{mode})}.",

> + HOST_WIDE_INT, (machine_mode mode),

> + default_static_rtx_alignment)

> +

> +DEFHOOK

>  (constant_alignment,

>   "This hook returns the alignment in bits of a constant that is being\n\

>  placed in memory.  @var{constant} is the constant and @var{basic_align}\n\

> Index: gcc/targhooks.h

> ===================================================================

> --- gcc/targhooks.h     2017-09-25 17:04:16.793358890 +0100

> +++ gcc/targhooks.h     2017-10-01 17:14:18.481821912 +0100

> @@ -93,6 +93,7 @@ extern int default_builtin_vectorization

>

>  extern tree default_builtin_reciprocal (tree);

>

> +extern HOST_WIDE_INT default_static_rtx_alignment (machine_mode);

>  extern HOST_WIDE_INT default_constant_alignment (const_tree, HOST_WIDE_INT);

>  extern HOST_WIDE_INT constant_alignment_word_strings (const_tree,

>                                                       HOST_WIDE_INT);

> Index: gcc/targhooks.c

> ===================================================================

> --- gcc/targhooks.c     2017-09-25 17:04:16.793358890 +0100

> +++ gcc/targhooks.c     2017-10-01 17:14:18.481821912 +0100

> @@ -1165,6 +1165,14 @@ tree default_mangle_decl_assembler_name

>     return id;

>  }

>

> +/* The default implementation of TARGET_STATIC_RTX_ALIGNMENT.  */

> +

> +HOST_WIDE_INT

> +default_static_rtx_alignment (machine_mode mode)

> +{

> +  return GET_MODE_ALIGNMENT (mode);

> +}

> +

>  /* The default implementation of TARGET_CONSTANT_ALIGNMENT.  */

>

>  HOST_WIDE_INT

> Index: gcc/doc/tm.texi.in

> ===================================================================

> --- gcc/doc/tm.texi.in  2017-09-25 17:04:16.792359030 +0100

> +++ gcc/doc/tm.texi.in  2017-10-01 17:14:18.480815538 +0100

> @@ -1026,6 +1026,8 @@ On 32-bit ELF the largest supported sect

>  @samp{(0x80000000 * 8)}, but this is not representable on 32-bit hosts.

>  @end defmac

>

> +@hook TARGET_STATIC_RTX_ALIGNMENT

> +

>  @defmac DATA_ALIGNMENT (@var{type}, @var{basic-align})

>  If defined, a C expression to compute the alignment for a variable in

>  the static store.  @var{type} is the data type, and @var{basic-align} is

> Index: gcc/doc/tm.texi

> ===================================================================

> --- gcc/doc/tm.texi     2017-09-25 17:04:16.791359170 +0100

> +++ gcc/doc/tm.texi     2017-10-01 17:14:18.479809163 +0100

> @@ -1078,6 +1078,13 @@ On 32-bit ELF the largest supported sect

>  @samp{(0x80000000 * 8)}, but this is not representable on 32-bit hosts.

>  @end defmac

>

> +@deftypefn {Target Hook} HOST_WIDE_INT TARGET_STATIC_RTX_ALIGNMENT (machine_mode @var{mode})

> +This hook returns the preferred alignment in bits for a

> +statically-allocated rtx, such as a constant pool entry.  @var{mode}

> +is the mode of the rtx.  The default implementation returns

> +@samp{GET_MODE_ALIGNMENT (@var{mode})}.

> +@end deftypefn

> +

>  @defmac DATA_ALIGNMENT (@var{type}, @var{basic-align})

>  If defined, a C expression to compute the alignment for a variable in

>  the static store.  @var{type} is the data type, and @var{basic-align} is

> Index: gcc/varasm.c

> ===================================================================

> --- gcc/varasm.c        2017-09-25 17:04:16.793358890 +0100

> +++ gcc/varasm.c        2017-10-01 17:14:18.481821912 +0100

> @@ -3784,11 +3784,8 @@ force_const_mem (machine_mode mode, rtx

>    *slot = desc;

>

>    /* Align the location counter as required by EXP's data type.  */

> -  align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);

> -

> -  tree type = lang_hooks.types.type_for_mode (mode, 0);

> -  if (type != NULL_TREE)

> -    align = targetm.constant_alignment (make_tree (type, x), align);

> +  machine_mode align_mode = (mode == VOIDmode ? word_mode : mode);

> +  align = targetm.static_rtx_alignment (align_mode);

>

>    pool->offset += (align / BITS_PER_UNIT) - 1;

>    pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);

> @@ -3830,7 +3827,6 @@ force_const_mem (machine_mode mode, rtx

>

>    /* Construct the MEM.  */

>    desc->mem = def = gen_const_mem (mode, symbol);

> -  set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);

>    set_mem_align (def, align);

>

>    /* If we're dropping a label to the constant pool, make sure we

> Index: gcc/config/cris/cris.c

> ===================================================================

> --- gcc/config/cris/cris.c      2017-09-25 17:04:16.762363228 +0100

> +++ gcc/config/cris/cris.c      2017-10-01 17:14:18.472764540 +0100

> @@ -165,6 +165,7 @@ static bool cris_function_value_regno_p

>  static void cris_file_end (void);

>  static unsigned int cris_hard_regno_nregs (unsigned int, machine_mode);

>  static bool cris_hard_regno_mode_ok (unsigned int, machine_mode);

> +static HOST_WIDE_INT cris_static_rtx_alignment (machine_mode);

>  static HOST_WIDE_INT cris_constant_alignment (const_tree, HOST_WIDE_INT);

>

>  /* This is the parsed result of the "-max-stack-stackframe=" option.  If

> @@ -288,6 +289,8 @@ #define TARGET_HARD_REGNO_NREGS cris_har

>  #undef TARGET_HARD_REGNO_MODE_OK

>  #define TARGET_HARD_REGNO_MODE_OK cris_hard_regno_mode_ok

>

> +#undef TARGET_STATIC_RTX_ALIGNMENT

> +#define TARGET_STATIC_RTX_ALIGNMENT cris_static_rtx_alignment

>  #undef TARGET_CONSTANT_ALIGNMENT

>  #define TARGET_CONSTANT_ALIGNMENT cris_constant_alignment

>

> @@ -4329,6 +4332,26 @@ cris_hard_regno_mode_ok (unsigned int re

>               || (regno != CRIS_MOF_REGNUM && regno != CRIS_ACR_REGNUM)));

>  }

>

> +/* Return the preferred minimum alignment for a static object.  */

> +

> +static HOST_WIDE_INT

> +cris_preferred_mininum_alignment (void)

> +{

> +  if (!TARGET_CONST_ALIGN)

> +    return 8;

> +  if (TARGET_ALIGN_BY_32)

> +    return 32;

> +  return 16;

> +}

> +

> +/* Implement TARGET_STATIC_RTX_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +cris_static_rtx_alignment (machine_mode mode)

> +{

> +  return MAX (cris_preferred_mininum_alignment (), GET_MODE_ALIGNMENT (mode));

> +}

> +

>  /* Implement TARGET_CONSTANT_ALIGNMENT.  Note that this hook has the

>     effect of making gcc believe that ALL references to constant stuff

>     (in code segment, like strings) have this alignment.  That is a rather

> @@ -4339,11 +4362,7 @@ cris_hard_regno_mode_ok (unsigned int re

>  static HOST_WIDE_INT

>  cris_constant_alignment (const_tree, HOST_WIDE_INT basic_align)

>  {

> -  if (!TARGET_CONST_ALIGN)

> -    return basic_align;

> -  if (TARGET_ALIGN_BY_32)

> -    return MAX (basic_align, 32);

> -  return MAX (basic_align, 16);

> +  return MAX (cris_preferred_mininum_alignment (), basic_align);

>  }

>

>  #if 0

> Index: gcc/config/i386/i386.c

> ===================================================================

> --- gcc/config/i386/i386.c      2017-09-25 17:04:16.768362388 +0100

> +++ gcc/config/i386/i386.c      2017-10-01 17:14:18.477796414 +0100

> @@ -31563,6 +31563,18 @@ ix86_sched_init_global (FILE *, int, int

>  }

>

>

> +/* Implement TARGET_STATIC_RTX_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +ix86_static_rtx_alignment (machine_mode mode)

> +{

> +  if (mode == DFmode)

> +    return 64;

> +  if (ALIGN_MODE_128 (mode))

> +    return MAX (128, GET_MODE_ALIGNMENT (mode));

> +  return GET_MODE_ALIGNMENT (mode);

> +}

> +

>  /* Implement TARGET_CONSTANT_ALIGNMENT.  */

>

>  static HOST_WIDE_INT

> @@ -31571,10 +31583,9 @@ ix86_constant_alignment (const_tree exp,

>    if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST

>        || TREE_CODE (exp) == INTEGER_CST)

>      {

> -      if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)

> -       return 64;

> -      else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)

> -       return 128;

> +      machine_mode mode = TYPE_MODE (TREE_TYPE (exp));

> +      HOST_WIDE_INT mode_align = ix86_static_rtx_alignment (mode);

> +      return MAX (mode_align, align);

>      }

>    else if (!optimize_size && TREE_CODE (exp) == STRING_CST

>            && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)

> @@ -53605,6 +53616,8 @@ #define TARGET_HARD_REGNO_CALL_PART_CLOB

>  #undef TARGET_CAN_CHANGE_MODE_CLASS

>  #define TARGET_CAN_CHANGE_MODE_CLASS ix86_can_change_mode_class

>

> +#undef TARGET_STATIC_RTX_ALIGNMENT

> +#define TARGET_STATIC_RTX_ALIGNMENT ix86_static_rtx_alignment

>  #undef TARGET_CONSTANT_ALIGNMENT

>  #define TARGET_CONSTANT_ALIGNMENT ix86_constant_alignment

>

> Index: gcc/config/mmix/mmix.c

> ===================================================================

> --- gcc/config/mmix/mmix.c      2017-09-25 17:04:16.774361549 +0100

> +++ gcc/config/mmix/mmix.c      2017-10-01 17:14:18.477796414 +0100

> @@ -168,6 +168,7 @@ static void mmix_print_operand (FILE *,

>  static void mmix_print_operand_address (FILE *, machine_mode, rtx);

>  static bool mmix_print_operand_punct_valid_p (unsigned char);

>  static void mmix_conditional_register_usage (void);

> +static HOST_WIDE_INT mmix_static_rtx_alignment (machine_mode);

>  static HOST_WIDE_INT mmix_constant_alignment (const_tree, HOST_WIDE_INT);

>

>  /* Target structure macros.  Listed by node.  See `Using and Porting GCC'

> @@ -283,6 +284,8 @@ #define TARGET_TRAMPOLINE_INIT mmix_tram

>  #undef TARGET_OPTION_OVERRIDE

>  #define TARGET_OPTION_OVERRIDE mmix_option_override

>

> +#undef TARGET_STATIC_RTX_ALIGNMENT

> +#define TARGET_STATIC_RTX_ALIGNMENT mmix_static_rtx_alignment

>  #undef TARGET_CONSTANT_ALIGNMENT

>  #define TARGET_CONSTANT_ALIGNMENT mmix_constant_alignment

>

> @@ -338,6 +341,14 @@ mmix_data_alignment (tree type ATTRIBUTE

>    return basic_align;

>  }

>

> +/* Implement TARGET_STATIC_RTX_ALIGNMENT.  */

> +

> +static HOST_WIDE_INT

> +mmix_static_rtx_alignment (machine_mode mode)

> +{

> +  return MAX (GET_MODE_ALIGNMENT (mode), 32);

> +}

> +

>  /* Implement tARGET_CONSTANT_ALIGNMENT.  */

>

>  static HOST_WIDE_INT

> Index: gcc/config/spu/spu.c

> ===================================================================

> --- gcc/config/spu/spu.c        2017-09-25 17:04:16.787359730 +0100

> +++ gcc/config/spu/spu.c        2017-10-01 17:14:18.478802788 +0100

> @@ -7194,6 +7194,18 @@ spu_truly_noop_truncation (unsigned int

>    return inprec <= 32 && outprec <= inprec;

>  }

>

> +/* Implement TARGET_STATIC_RTX_ALIGNMENT.

> +

> +   Make all static objects 16-byte aligned.  This allows us to assume

> +   they are also padded to 16 bytes, which means we can use a single

> +   load or store instruction to access them.  */

> +

> +static HOST_WIDE_INT

> +spu_static_rtx_alignment (machine_mode mode)

> +{

> +  return MAX (GET_MODE_ALIGNMENT (mode), 128);

> +}

> +

>  /* Implement TARGET_CONSTANT_ALIGNMENT.

>

>     Make all static objects 16-byte aligned.  This allows us to assume

> @@ -7445,6 +7457,8 @@ #define TARGET_CAN_CHANGE_MODE_CLASS spu

>  #undef TARGET_TRULY_NOOP_TRUNCATION

>  #define TARGET_TRULY_NOOP_TRUNCATION spu_truly_noop_truncation

>

> +#undef TARGET_STATIC_RTX_ALIGNMENT

> +#define TARGET_STATIC_RTX_ALIGNMENT spu_static_rtx_alignment

>  #undef TARGET_CONSTANT_ALIGNMENT

>  #define TARGET_CONSTANT_ALIGNMENT spu_constant_alignment

>
diff mbox series

Patch

Index: gcc/varasm.c
===================================================================
--- gcc/varasm.c	2017-09-12 14:28:56.402824780 +0100
+++ gcc/varasm.c	2017-09-20 13:33:15.942547232 +0100
@@ -3785,10 +3785,17 @@  force_const_mem (machine_mode mode, rtx
   desc = ggc_alloc<constant_descriptor_rtx> ();
   *slot = desc;
 
+  tree type = NULL_TREE;
+  if (mode != VOIDmode
+      /* Don't ask the frontend about vector modes if there cannot be a
+	 VECTOR_TYPE whose TYPE_MODE is MODE.  */
+      && (!VECTOR_MODE_P (mode)
+	  || targetm.vector_mode_supported_p (mode)))
+    type = lang_hooks.types.type_for_mode (mode, 0);
+
   /* Align the location counter as required by EXP's data type.  */
   align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
 
-  tree type = lang_hooks.types.type_for_mode (mode, 0);
   if (type != NULL_TREE)
     align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
 
@@ -3832,7 +3839,8 @@  force_const_mem (machine_mode mode, rtx
 
   /* Construct the MEM.  */
   desc->mem = def = gen_const_mem (mode, symbol);
-  set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
+  if (type)
+    set_mem_attributes (def, type, 1);
   set_mem_align (def, align);
 
   /* If we're dropping a label to the constant pool, make sure we