------- Comment #7 from jakub at gcc dot gnu dot org 2010-03-18 07:16 ------- BTW, if the PRE_MODIFY representation doesn't work well, I'd say just using a PARALLEL with what the insn really does and checking that in the match_parallel predicate probably wouldn't clash with anything else. If it would, you'd need to insert one UNSPEC somewhere. The comments say that currently the pattern looks like: (parallel [ (set (mem:BLK (pre_dec:BLK (reg:SI sp))) (unspec:BLK [(reg:SI r4)] UNSPEC_PUSH_MULT)) (use (reg:SI 11 fp)) (use (reg:SI 12 ip)) (use (reg:SI 14 lr)) (use (reg:SI 15 pc)) ]) with the REG_FRAME_RELATED_EXPR: (sequence [ (set (reg:SI sp) (plus:SI (reg:SI sp) (const_int -20))) (set (mem:SI (reg:SI sp)) (reg:SI r4)) (set (mem:SI (plus:SI (reg:SI sp) (const_int 4))) (reg:SI fp)) (set (mem:SI (plus:SI (reg:SI sp) (const_int 8))) (reg:SI ip)) (set (mem:SI (plus:SI (reg:SI sp) (const_int 12))) (reg:SI lr)) ]) So, would a parallel like: (parallel [ (set (mem:SI (plus:SI (reg:SI sp) (const_int -20))) (reg:SI r4)) (set (mem:SI (plus:SI (reg:SI sp) (const_int -16))) (reg:SI fp)) (set (mem:SI (plus:SI (reg:SI sp) (const_int -12))) (reg:SI ip)) (set (mem:SI (plus:SI (reg:SI sp) (const_int -8))) (reg:SI lr)) (set (mem:SI (plus:SI (reg:SI sp) (const_int -4))) (reg:SI pc)) (set (reg:SI sp) (plus:SI (reg:SI sp) (const_int -20))) ]) be unique? match_parallel would verify the form (that the first sp offset matches the negative stack adjustment, that it is multiple of reg size, that the last adjustment is -word size, that the offsets are consecutive etc. Alternatively surround the first set's RHS reg into UNSPEC.
-- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43399