------- Comment #2 from rakdver at gcc dot gnu dot org  2006-02-03 13:57 -------
The code looks like

(insn 86 85 77 2 (set (reg:CC 127)
        (compare:CC (reg/v:SI 125 [ ei1 ])
            (const_int 0 [0x0]))) -1 (nil)
    (nil))

(note 77 86 18 2 NOTE_INSN_LOOP_BEG)
...
a lot of insns
...
(jump_insn 21 18 88 3 (set (pc)
        (if_then_else (ne (reg:CC 127)
                (const_int 0 [0x0]))
            (label_ref:SI 88)
            (pc))) 405 {*rs6000.md:13340} (nil)
    (expr_list:REG_BR_PROB (const_int 9900 [0x26ac])
        (nil)))

The exit is invariant and insn is outside of the loop. But,
get_condition will identify it as the source of the reg:CC 127
value, which causes the ice as we did not scan insns outside
of the loop for df information.

What get_condition does seems wrong to me -- it does not check cfg
at all, in particular it ignores the backedge of the loop.  I think
the proper fix is to stop get_condition at the start of a basic block
in case it has more than one predecessor.


-- 


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

Reply via email to