aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2017-10-30 11:33:40 +0100
committerUros Bizjak <uros@gcc.gnu.org>2017-10-30 11:33:40 +0100
commit5603c1d9db454cd1f2182f5de3a32c9d1c32497e (patch)
tree58691558acbb807f3302b7373855c703b66c3144
parent87039aa26687f4611fab4d3c5abaa62d2c375899 (diff)
downloadgcc-5603c1d9db454cd1f2182f5de3a32c9d1c32497e.zip
gcc-5603c1d9db454cd1f2182f5de3a32c9d1c32497e.tar.gz
gcc-5603c1d9db454cd1f2182f5de3a32c9d1c32497e.tar.bz2
re PR target/82725 ([x86_64] internal compiler error: in change_address_1, at emit-rtl.c:2162)
PR target/82725 * config/i386/i386.c (legitimate_pic_address_disp_p): Allow UNSPEC_DTPOFF and UNSPEC_NTPOFF with SImode immediate offset. testsuite/ChangeLog: PR target/82725 * g++.dg/pr82725.C: New test. From-SVN: r254212
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.c12
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/pr82725.C16
4 files changed, 37 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 72e8e2b..ffbc1fb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-10-30 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/82725
+ * config/i386/i386.c (legitimate_pic_address_disp_p): Allow
+ UNSPEC_DTPOFF and UNSPEC_NTPOFF with SImode immediate offset.
+
2017-10-29 Jim Wilson <wilson@tuliptree.org>
* gimplify.c: Include tm_p.h.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index a66b433..2de0dd0 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -15079,10 +15079,16 @@ legitimate_pic_address_disp_p (rtx disp)
break;
op0 = XEXP (XEXP (disp, 0), 0);
op1 = XEXP (XEXP (disp, 0), 1);
- if (!CONST_INT_P (op1)
- || INTVAL (op1) >= 16*1024*1024
+ if (!CONST_INT_P (op1))
+ break;
+ if (GET_CODE (op0) == UNSPEC
+ && (XINT (op0, 1) == UNSPEC_DTPOFF
+ || XINT (op0, 1) == UNSPEC_NTPOFF)
+ && trunc_int_for_mode (INTVAL (op1), SImode) == INTVAL (op1))
+ return true;
+ if (INTVAL (op1) >= 16*1024*1024
|| INTVAL (op1) < -16*1024*1024)
- break;
+ break;
if (GET_CODE (op0) == LABEL_REF)
return true;
if (GET_CODE (op0) == CONST
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cd3e7f5..97338fd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,8 +1,12 @@
+2017-10-30 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/82725
+ * g++.dg/pr82725.C: New test.
+
2017-10-29 Jim Wilson <wilson@tuliptree.org>
* lib/gcc-dg.exp (gcc-dg-debug-runtest): Delete -gcoff.
- * lib/gfortran-dg.exp (gfortran-dg-debug-runtest): Delete
- -gcoff.
+ * lib/gfortran-dg.exp (gfortran-dg-debug-runtest): Delete -gcoff.
2017-10-28 Paolo Carlini <paolo.carlini@oracle.com>
diff --git a/gcc/testsuite/g++.dg/pr82725.C b/gcc/testsuite/g++.dg/pr82725.C
new file mode 100644
index 0000000..c92b28a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr82725.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target pie }
+// { dg-options "-O2 -fpie -mtls-direct-seg-refs" }
+
+struct string
+{
+ __SIZE_TYPE__ length;
+ const char *ptr;
+};
+
+string
+tempDir ()
+{
+ thread_local string cache;
+ return cache;
+}