re PR target/82725 ([x86_64] internal compiler error: in change_address_1, at emit...
authorUros Bizjak <uros@gcc.gnu.org>
Mon, 30 Oct 2017 10:33:40 +0000 (11:33 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 30 Oct 2017 10:33:40 +0000 (11:33 +0100)
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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr82725.C [new file with mode: 0644]

index 72e8e2b317f8237383ec99907b1ed2e562742f5a..ffbc1fb06c250ba204613a5631a66c02fbd8a638 100644 (file)
@@ -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.
index a66b433d78d40f4b48f00c96df88d08033395f10..2de0dd0c2839f5f35016d89fdbb625d0ec3d9f84 100644 (file)
@@ -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
index cd3e7f5b01b44ac02bf1685bd11090f2e2840dad..97338fdacd03cee653386281dd89865aba86eb50 100644 (file)
@@ -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 (file)
index 0000000..c92b28a
--- /dev/null
@@ -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;
+}