http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52698
--- Comment #4 from Uros Bizjak <ubizjak at gmail dot com> 2012-03-25 19:00:10
UTC ---
(In reply to comment #0)
> [hjl@gnu-mic-2 gcc]$ cat /tmp/x.c
> extern void abort (void);
> static __thread unsigned char foo [32]
> __attribute__ ((tls_model ("initial-exec"), aligned (sizeof (void *))));
> void
> test2 (void)
> {
> unsigned int s;
> for (s = 0; s < sizeof (foo); ++s)
> {
> if (foo [s] != s)
> abort ();
> foo [s] = sizeof (foo) - s;
> }
> }
> [hjl@gnu-mic-2 gcc]$ ./xgcc -B./ -mx32 -O2 -S /tmp/x.c -maddress-mode=long
> /tmp/x.c: In function \u2018test2\u2019:
> /tmp/x.c:14:1: error: insn does not satisfy its constraints:
> (insn 52 78 53 5 (set (mem/j:QI (plus:DI (plus:DI (reg:DI 37 r8)
> (reg:DI 38 r9))
> (reg:DI 2 cx [orig:98 D.1709 ] [98])) [0 foo S1 A8])
> (reg:QI 1 dx [100])) /tmp/x.c:12 66 {*movqi_internal}
> (nil))
> /tmp/x.c:14:1: internal compiler error: in reload_cse_simplify_operands, at
> postreload.c:403
> Please submit a full bug report,
> with preprocessed source if appropriate.
> See <http://gcc.gnu.org/bugs.html> for instructions.
> [hjl@gnu-mic-2 gcc]$ ./xgcc -B./ -mx32 -O2 -S /tmp/x.c -maddress-mode=short
> [hjl@gnu-mic-2 gcc]$
The problem is that reload generates invalid RTX address:
(plus:DI (plus:DI (zero_extend:DI (unspec:SI [
(const_int 0 [0])
] UNSPEC_TP))
(reg:DI 97))
(reg:DI 2 cx [orig:98 D.1709 ] [98]))
invalid in the sense, that we got pseudo in the strict mode. This is rejected
by ix86_legitimate_address_p, so reload uses bigger hammer and reloads all
components in registers:
Reloads for insn # 52
Reload 0: reload_in (DI) = (zero_extend:DI (unspec:SI [
(const_int 0 [0])
] UNSPEC_TP))
INDEX_REGS, RELOAD_FOR_OPERAND_ADDRESS (opnum = 0)
reload_in_reg: (zero_extend:DI (unspec:SI [
(const_int 0 [0])
] UNSPEC_TP))
reload_reg_rtx: (reg:DI 37 r8)
Reload 1: reload_in (DI) = (reg:DI 97)
GENERAL_REGS, RELOAD_FOR_OPERAND_ADDRESS (opnum = 0)
reload_in_reg: (reg:DI 97)
reload_reg_rtx: (reg:DI 38 r9)
Unfortunately, this creates invalid address with three-register addressing.
BTW: -mx32 just uncovered this problem, it can happen also for plain x86_32 or
x86_64 where segment registers are involved.