Given the C code: int i; for(i = 0 ; i < 5; i++) ; the C4x generates assemble insn as follows: lda 4,ar0 L2: dbu ar0,L2 and in my platform, it generates such assemble: LDRI, R11,0 LDRI R10,5 L2: ADDI R11,1 CMP R11,5 DJNZ R10,L2 The first two insn load immediate operand 0 and operand 5 into Reg R11 and R10, the " ADDI R11,1" insn adds R11 by 1, the "CMP R11,5" insn compares R11 between 5. If I don't define "doloop_end" pattern, it generate such assemble: LDRI, R11,0 L2: ADDI R11,1 CMP R11,5 BNE L2 Obviously the "decrement_and_branch_until_zero" replace the "BNE L2" and remains the "ADDI R11,1" and " CMP R11,5" unchanged.