From: Andreas Krebbel Date: Mon, 18 Jul 2016 10:47:09 +0000 (+0000) Subject: S/390: Fix alignment check for literal pool references. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=54158a1aa94f7b75f59d6ca8d6ca7ebfc11e1673;p=gcc.git S/390: Fix alignment check for literal pool references. gcc/ChangeLog: 2016-07-18 Andreas Krebbel * 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 * gcc.target/s390/nolrl-1.c: New test. From-SVN: r238427 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1f3fabf321b..55a8771bdf1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-07-18 Andreas Krebbel + + * 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. + 2016-07-18 Richard Biener PR tree-optimization/71893 diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 9d2b2c0cadd..318c021290f 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/ChangeLog b/gcc/testsuite/ChangeLog index 9568baa7e74..f0032870fc9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-07-18 Andreas Krebbel + + * gcc.target/s390/nolrl-1.c: New test. + 2016-07-17 Fritz Reese PR fortran/71523 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 00000000000..e0d1213f78f --- /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" } } */