Committed to head and GCC 6 branch. gcc/ChangeLog:
2016-07-18 Andreas Krebbel <kreb...@linux.vnet.ibm.com> * config/s390/s390.c (s390_encode_section_info): Always set notaligned marker if mode size is 0 or no MEM_ALIGN info could be found. gcc/testsuite/ChangeLog: 2016-07-18 Andreas Krebbel <kreb...@linux.vnet.ibm.com> * gcc.target/s390/nolrl-1.c: New test. --- gcc/ChangeLog | 9 +++++++++ gcc/config/s390/s390.c | 35 ++++++++++++++------------------- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/gcc.target/s390/nolrl-1.c | 19 ++++++++++++++++++ 4 files changed, 50 insertions(+), 20 deletions(-) create mode 100644 gcc/testsuite/gcc.target/s390/nolrl-1.c 2016-07-16 John David Anglin <dang...@gcc.gnu.org> * config/pa/pa.c (hppa_profile_hook): Allocate stack space for diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 9d2b2c0..318c021 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -12412,17 +12412,14 @@ s390_encode_section_info (tree decl, rtx rtl, int first) { /* Store the alignment to be able to check if we can use a larl/load-relative instruction. We only handle the cases - that can go wrong (i.e. no FUNC_DECLs). If a symref does - not have any flag we assume it to be correctly aligned. */ - - if (DECL_ALIGN (decl) % 64) - SYMBOL_FLAG_SET_NOTALIGN8 (XEXP (rtl, 0)); - - if (DECL_ALIGN (decl) % 32) - SYMBOL_FLAG_SET_NOTALIGN4 (XEXP (rtl, 0)); - - if (DECL_ALIGN (decl) == 0 || DECL_ALIGN (decl) % 16) + that can go wrong (i.e. no FUNC_DECLs). */ + if (DECL_ALIGN (decl) == 0 + || DECL_ALIGN (decl) % 16) SYMBOL_FLAG_SET_NOTALIGN2 (XEXP (rtl, 0)); + else if (DECL_ALIGN (decl) % 32) + SYMBOL_FLAG_SET_NOTALIGN4 (XEXP (rtl, 0)); + else if (DECL_ALIGN (decl) % 64) + SYMBOL_FLAG_SET_NOTALIGN8 (XEXP (rtl, 0)); } /* Literal pool references don't have a decl so they are handled @@ -12430,18 +12427,16 @@ s390_encode_section_info (tree decl, rtx rtl, int first) entry to decide upon the alignment. */ if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF - && TREE_CONSTANT_POOL_ADDRESS_P (XEXP (rtl, 0)) - && MEM_ALIGN (rtl) != 0 - && GET_MODE_BITSIZE (GET_MODE (rtl)) != 0) + && TREE_CONSTANT_POOL_ADDRESS_P (XEXP (rtl, 0))) { - if (MEM_ALIGN (rtl) % 64) - SYMBOL_FLAG_SET_NOTALIGN8 (XEXP (rtl, 0)); - - if (MEM_ALIGN (rtl) % 32) - SYMBOL_FLAG_SET_NOTALIGN4 (XEXP (rtl, 0)); - - if (MEM_ALIGN (rtl) == 0 || MEM_ALIGN (rtl) % 16) + if (MEM_ALIGN (rtl) == 0 + || GET_MODE_SIZE (GET_MODE (rtl)) == 0 + || MEM_ALIGN (rtl) % 16) SYMBOL_FLAG_SET_NOTALIGN2 (XEXP (rtl, 0)); + else if (MEM_ALIGN (rtl) % 32) + SYMBOL_FLAG_SET_NOTALIGN4 (XEXP (rtl, 0)); + else if (MEM_ALIGN (rtl) % 64) + SYMBOL_FLAG_SET_NOTALIGN8 (XEXP (rtl, 0)); } } diff --git a/gcc/testsuite/gcc.target/s390/nolrl-1.c b/gcc/testsuite/gcc.target/s390/nolrl-1.c new file mode 100644 index 0000000..e0d1213 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/nolrl-1.c @@ -0,0 +1,19 @@ +/* Make sure the compiler does not try to use a relative long + instruction to load the string since it might not meet the + alignment requirements of the instruction. */ + +/* { dg-do compile } */ +/* { dg-options "-march=z10 -O3 -mzarch" } */ + +extern void foo (char*); + +void +bar () +{ + unsigned char z[32]; + + __builtin_memcpy (z, "\001\000\000\000", 4); + foo (z); +} + +/* { dg-final { scan-assembler-not "lrl" } } */ -- 2.9.1