https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61446

            Bug ID: 61446
           Summary: [4.10 Regression]: ICE in copyprop_hardreg_forward_1,
                    at regcprop.c with -O2 -m32 -march=corei7
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ubizjak at gmail dot com

Following testcase:

--cut here--
unsigned long long
__fixunssfdi (float a)
{
  const double dfa = a;
  const unsigned int hi = dfa / 0x1p32f;
  const unsigned int lo = dfa - (double) hi * 0x1p32f;

  return ((unsigned long long) hi << (4 * (8))) | lo;
}
--cut here--

ICEs on x86_64-pc-linux-gnu with "-O2 -m32 -march=corei7":

./cc1 -O2 -m32 -march=corei7 ree.c
 __fixunssfdi
Analyzing compilation unit
Performing interprocedural optimizations
 <*free_lang_data> <visibility> <early_local_cleanups> <*free_inline_summary>
<whole-program> <profile_estimate> <devirt> <cp> <inline> <pure-const>
<static-var> <comdats>Assembling functions:
 __fixunssfdi
ree.c: In function ‘__fixunssfdi’:
ree.c:11:1: error: insn does not satisfy its constraints:
 }
 ^
(insn 54 11 47 2 (set (reg:DI 0 ax)
        (reg:DI 21 xmm0)) ree.c:7 89 {*movdi_internal}
     (expr_list:REG_UNUSED (reg:DI 0 ax)
        (nil)))
ree.c:11:1: internal compiler error: in copyprop_hardreg_forward_1, at
regcprop.c:776
0x96bec8 _fatal_insn(char const*, rtx_def const*, char const*, int, char
const*)
        /home/uros/gcc-svn/trunk/gcc/rtl-error.c:109
0x96beef _fatal_insn_not_found(rtx_def const*, char const*, int, char const*)
        /home/uros/gcc-svn/trunk/gcc/rtl-error.c:120
0x9462a4 copyprop_hardreg_forward_1
        /home/uros/gcc-svn/trunk/gcc/regcprop.c:776
0x94645a execute
        /home/uros/gcc-svn/trunk/gcc/regcprop.c:1264
Please submit a full bug report,
...

_.split2 pass generates:

...
(insn 11 45 46 2 (set (reg/v:SI 0 ax [orig:85 hi ] [85])
        (reg:SI 2 cx [99])) ree.c:7 90 {*movsi_internal}
     (nil))
(insn 46 11 47 2 (set (reg:DI 21 xmm0 [118])
        (zero_extend:DI (reg/v:SI 0 ax [orig:85 hi ] [85]))) ree.c:10 133
{*zero_extendsidi2}
     (nil))
(insn 47 46 48 2 (set (mem/c:DI (reg/f:SI 7 sp) [0  S8 A64])
        (reg:DI 21 xmm0 [118])) ree.c:10 89 {*movdi_internal}
     (nil))
(insn 48 47 13 2 (set (reg:DF 9 st(1) [orig:101 D.1856 ] [101])
        (float:DF (mem/c:DI (reg/f:SI 7 sp) [0  S8 A64]))) ree.c:10 206
{*floatdidf2_i387}
     (nil))
...


and this sequence is transformed in _.ree pass to:

...
(insn 11 45 54 2 (set (reg:DI 21 xmm0)
        (zero_extend:DI (reg:SI 2 cx [99]))) ree.c:7 133 {*zero_extendsidi2}
     (nil))
(insn 54 11 47 2 (set (reg:DI 0 ax)
        (reg:DI 21 xmm0)) ree.c:7 -1
     (nil))
(insn 47 54 48 2 (set (mem/c:DI (reg/f:SI 7 sp) [0  S8 A64])
        (reg:DI 21 xmm0 [118])) ree.c:10 89 {*movdi_internal}
     (nil))
(insn 48 47 13 2 (set (reg:DF 9 st(1) [orig:101 D.1856 ] [101])
        (float:DF (mem/c:DI (reg/f:SI 7 sp) [0  S8 A64]))) ree.c:10 206
{*floatdidf2_i387}
     (nil))
...


(insn 54) is the problematic instruction.

Reply via email to