I received very helpful comments previously (https://gcc.gnu.org/ml/gcc-help/2014-08/msg00010.html). And I could successfully fuse dependent ops like following : ... r1 = (r1) op1 (const) ... ... r1 = (r1) op2 (r2) ... ... r3 = op3 (r1) ... using a define_insn pattern to a new op "testnew36". Now, How can I fuse the following stream of ops : ... op1 ... op2 (consumes result of op1) ... op3 (consumes result of op2) ... op4 (consumes result of op2) ... to the following : ... testnew36 ... testnew40 The pertinent pattern seen in .combine file is a parallel expression : (parallel [ (set (reg:DI 256 [ *_15 ]) (op3:DI (op2:DI (op1:DI (reg:DI 202 [ D.1563 ]) (const_int 4 [0x4])) (reg:DI 242 [ inbuf ])) )) (set (reg:DI 205 [ D.1566 ]) (op2:DI (op1:DI (reg:DI 202 [ D.1563 ]) (const_int 4 [0x4])) (reg:DI 242 [ inbuf ]))) ]) Is the following the correct way to do combine the four ops : 1. define a new define_insn "*matchtestnewparallel" matching the above parallel expression which substitutes the first set expression above (op1+op2+op3 combination) with testnew36 and leaves the second set expression (op1+op2) as is 2. define a new define_insn "*testnew40" pattern that matches op1 + op2 + op4 combination. (I already have a define_insn "*testnew36" pattern that matches op1+op2+op3 combo. I have done what I have just described above, but I am not quite seeing what is desirable. The order in which I defined them in the md file is - "*matchtestnewparallel", "*testnew40", "*testnew36". Either I am not doing it right or this is just not the right way to do it. Can you give me some hints please ? Thanks