------- Comment #5 from ubizjak at gmail dot com  2009-08-01 22:25 -------
The backtrace:

#0  fancy_abort (file=0xc59e30 "../../gcc-svn/trunk/gcc/reg-stack.c", line=741,
function=0xc5a5f0 "get_hard_regnum") at
../../gcc-svn/trunk/gcc/diagnostic.c:729
#1  0x0000000000708a5e in get_hard_regnum (regstack=<value optimized out>,
reg=<value optimized out>) at ../../gcc-svn/trunk/gcc/reg-stack.c:741
#2  0x000000000070b6cd in subst_stack_regs_pat (insn=0x7ffff28ba960,
regstack=0x7fffffffddd0, pat=<value optimized out>) at
../../gcc-svn/trunk/gcc/reg-stack.c:1889
#3  0x000000000070c703 in subst_stack_regs (insn=0x7ffff28ba960,
regstack=0x7fffffffddd0) at ../../gcc-svn/trunk/gcc/reg-stack.c:2319

We call get_hard_regnum() with:

(gdb) p debug_rtx (*dest)
(pc)

that register comes as a target from insn:

(jump_insn:TI 52 50 56 11 test.c:32 (parallel [
            (set (pc)
                (if_then_else (le (reg/v:SF 9 st(1) [orig:64 move ] [64])
                        (reg:SF 8 st [80]))
                    (label_ref:SI 60)
                    (pc)))
            (clobber (reg:CCFP 18 fpsr))
            (clobber (reg:CCFP 17 flags))
            (clobber (reg:HI 0 ax))
        ]) 626 {*fp_jcc_3_387} (expr_list:REG_DEAD (reg/v:SF 9 st(1) [orig:64
move ] [64])

So, this part of reg-stack.c is kind of wrong:

            /* If the comparison operator is an FP comparison operator,
               it is handled correctly by compare_for_stack_reg () who
               will move the destination to the top of stack. But if the
               comparison operator is not an FP comparison operator, we
               have to handle it here.  */
            if (get_hard_regnum (regstack, *dest) >= FIRST_STACK_REG
                && REGNO (*dest) != regstack->reg[regstack->top])


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40934

Reply via email to