[Bug target/82725] [8 Regression] [x86_64] internal compiler error: in change_address_1, at emit-rtl.c:2162
ubizjak at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sun Oct 29 07:23:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82725
--- Comment #6 from Uroš Bizjak <ubizjak at gmail dot com> ---
I'm testing following patch:
--cut here--
Index: i386.c
===================================================================
--- i386.c (revision 254199)
+++ i386.c (working copy)
@@ -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
--cut here--
As suggested, the patch allows offsetted UNSPEC_DTPOFF/UNSPEC_NTPOFF
relocations in legitimate_pic_address_disp_p. In fact, these are already
allowed in x86_64_immediate_operand, with the immediate limited to SImode
values.
More information about the Gcc-bugs
mailing list