This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: conflicts between combine and pre global passes?
> I noticed that global passes before combine, like loop-invariant/cprop/cse2
> some time have conflicts with combine.
> The combine pass can only operates with basic block, while these global
> passes move insns across basic block and left no description info.
>
> For example, a case I encountered.
>
> (insn 77 75 78 8 (set (reg:SI 171)
> (const_int 9999 [0x270f])) diffmeasure/verify.c:157 176
> {*thumb1_movsi_insn}
> (nil))
>
> (insn 78 77 79 8 (set (reg:SI 172)
> (const_int 0 [0])) diffmeasure/verify.c:157 176
> {*thumb1_movsi_insn} (nil))
>
> (insn 79 78 80 8 (set (reg:SI 170)
> (plus:SI (plus:SI (reg:SI 172)
> (reg:SI 172))
> (geu:SI (reg:SI 171)
> (reg/v:SI 138 [ num ])))) diffmeasure/verify.c:157 226
> {thumb1_addsi3_addgeu}
> (expr_list:REG_DEAD (reg:SI 172)
> (expr_list:REG_DEAD (reg:SI 171)
> (expr_list:REG_EQUAL (geu:SI (const_int 9999 [0x270f])
> (reg/v:SI 138 [ num ]))
> (nil)))))
>
> (insn 80 79 81 8 (set (reg:QI 169)
> (subreg:QI (reg:SI 170) 0)) diffmeasure/verify.c:157 187
> {*thumb1_movqi_insn}
> (expr_list:REG_DEAD (reg:SI 170)
> (nil)))
>
> (insn 81 80 82 8 (set (reg:SI 173)
> (zero_extend:SI (reg:QI 169))) diffmeasure/verify.c:157 158
> {*thumb1_zero_extendqisi2_v6}
> (expr_list:REG_DEAD (reg:QI 169)
> (nil)))
>
> (jump_insn 82 81 124 8 (set (pc)
> (if_then_else (eq (reg:SI 173)
> (const_int 0 [0]))
> (label_ref:SI 129)
> (pc))) diffmeasure/verify.c:157 196 {cbranchsi4_insn}
> (expr_list:REG_DEAD (reg:SI 173)
> (expr_list:REG_BR_PROB (const_int 900 [0x384])
> (nil)))
> -> 129)
>
> can be combined into :
> (insn 77 75 78 8 (set (reg:SI 171)
> (const_int 9999 [0x270f])) diffmeasure/verify.c:157 176
> {*thumb1_movsi_insn}
> (nil))
>
> (note 78 77 79 8 NOTE_INSN_DELETED)
>
> (note 79 78 80 8 NOTE_INSN_DELETED)
>
> (note 80 79 81 8 NOTE_INSN_DELETED)
>
> (note 81 80 82 8 NOTE_INSN_DELETED)
>
> (jump_insn 82 81 124 8 (set (pc)
> (if_then_else (ltu (reg:SI 171)
> (reg/v:SI 138 [ num ]))
> (label_ref:SI 129)
> (pc))) diffmeasure/verify.c:157 196 {cbranchsi4_insn}
> (expr_list:REG_DEAD (reg:SI 171)
> (expr_list:REG_BR_PROB (const_int 900 [0x384])
> (nil)))
> -> 129)
>
> BUT, if pre-combine passes propagate register 172 in insn79 and delete
> insn78, the resulting instructions will not be combined.
The example doesn't seem to illustrate to the problem though, since propagating
reg 172 into insn 179 is a purely local change. In any case, you first need to
understand why combine fails, then find out whether this is generic problem or
a problem more specific to the port, in which case you can try to add patterns
and/or splitters to help combine.
--
Eric Botcazou