We accept reg + sym_ref as valid address if sym_ref is a literal pool
reference knowing that it will be rewritten as r13 + reg + offset.
However, annotate_constant_pool_refs was never able to handle that.
With the patch only single sym_refs are accepted.
Regression tested on s390x.
2017-03-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
PR target/79904
* config/s390/s390.c (s390_decompose_address): Reject reg +
sym_ref literal pool references.
gcc/testsuite/ChangeLog:
2017-03-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* gcc.dg/ubsan/pr79904-2.c: New test.
From-SVN: r246443
displacements by basing them off the base register. */
if (disp && GET_CODE (disp) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (disp))
{
- /* Either base or index must be free to hold the base register. */
- if (!base)
- base = fake_pool_base, literal_pool = true;
- else if (!indx)
- indx = fake_pool_base, literal_pool = true;
- else
- return false;
+ if (base || indx)
+ return false;
+
+ base = fake_pool_base, literal_pool = true;
/* Mark up the displacement. */
disp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, disp),
+2017-03-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
+
+ * gcc.dg/ubsan/pr79904-2.c: New test.
+
2017-03-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
PR target/79893
--- /dev/null
+/* PR sanitizer/79904 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=signed-integer-overflow" } */
+
+typedef signed char V __attribute__((vector_size (8)));
+
+void
+foo (V *a)
+{
+ *a = *a * (V) { 3, 4, 5, 6, 7, 8, 9, 10 };
+}