Hi,
I am working on a private port and getting an ICE in valid code. This
mainly is because of the following ( which is a part of the entire
dump of RTL of the source file)

(insn 13 8 14 2 /fc3/testcases/reduce/testcase-min.i:8 (set (reg:SI 138)
        (const_int 0 [0x0])) 44 {*movsi} (expr_list:REG_LIBCALL_ID
(const_int 0 [0x0])
        (nil)))

(insn 14 13 15 2 /fc3/testcases/reduce/testcase-min.i:8 (set (reg:SI 1 $c1)
        (reg/f:SI 112 *fp*)) 44 {*movsi} (expr_list:REG_LIBCALL_ID
(const_int 1 [0x1])
        (insn_list:REG_LIBCALL 17 (nil))))

(insn 15 14 16 2 /fc3/testcases/reduce/testcase-min.i:8 (set (reg:SI 2 $c2)
        (reg:SI 138)) 44 {*movsi} (expr_list:REG_LIBCALL_ID (const_int 1 [0x1])
        (nil)))

(call_insn 16 15 18 2 /fc3/testcases/reduce/testcase-min.i:8 (parallel [
            (call (mem:SI (symbol_ref:SI ("__floatsisf") [flags 0x41])
[0 S4 A32])
                (const_int 0 [0x0]))
            (use (const_int 0 [0x0]))
            (clobber (reg:SI 31 $link))
        ]) 41 {*call_direct} (expr_list:REG_LIBCALL_ID (const_int 1 [0x1])
        (expr_list:REG_EH_REGION (const_int -1 [0xffffffff])
            (nil)))
    (expr_list:REG_DEP_TRUE (use (reg:SI 2 $c2))
        (expr_list:REG_DEP_TRUE (use (reg:SI 1 $c1))
            (nil))))

(insn 18 16 17 2 /fc3/testcases/reduce/testcase-min.i:8 (clobber
(reg:SF 139)) -1 (expr_list:REG_LIBCALL_ID (const_int 1 [0x1])
        (nil)))

(insn 17 18 19 2 /fc3/testcases/reduce/testcase-min.i:8 (set
(subreg:SI (reg:SF 139) 0)
        (mem/c/i:SI (reg/f:SI 112 *fp*) [2 S4 A32])) 44 {*movsi}
(expr_list:REG_LIBCALL_ID (const_int 1 [0x1])
        (insn_list:REG_RETVAL 14 (expr_list:REG_EQUAL (float:SF (reg:SI 138))
                (nil))))


Note the REG_EQUAL note of insn 17. cse tries to replace reg:SI 138
with a constant and because of insn 13, the note becomes (float:SF
(const_int 0)) which in turn cse converts into

REG_EQUAL (const_double:SF 0 [0x0] 0.0 [0x0.0p+0])

and when CONST_DOUBLE_LOW is done on the above, the compiler crashes -

" internal compiler error: RTL check: expected code 'const_double' and
mode 'VOID', have code 'const_double' and mode 'SF' in plus_constant,
at explow.c:103"

i.e the compiler is crashing after converting a const_int to an SFmode value.

Could this possibly be a generic issue or a problem with my backend (
as in will I need to define movsf in my backend, which isnt defined at
present ) ?

Regret the rather verbose post.

Thanks in advance,
Pranav

Reply via email to