------- Comment #3 from carrot at google dot com 2010-03-26 06:42 ------- There are 2 problems with csa for arm:
1. In function rest_of_handle_stack_adjustments: if (!ACCUMULATE_OUTGOING_ARGS) { ... } ACCUMULATE_OUTGOING_ARGS is defined to 1 in arm.h, so this pass is not applied to arm back end. 2. Even if I change the condition to enable it, the stack adjustments are still not combined. Following are related insns: ... (insn/f 117 116 118 2 src/t9.c:5 (set (reg/f:SI 13 sp) (plus:SI (reg/f:SI 13 sp) (const_int -12 [0xfffffffffffffff4]))) -1 (nil)) (insn 118 117 119 2 src/t9.c:5 (set (mem:BLK (scratch) [0 A8]) (unspec:BLK [ (reg/f:SI 13 sp) (reg/f:SI 7 r7) ] 5)) -1 (nil)) (insn/f 119 118 120 2 src/t9.c:5 (set (reg/f:SI 7 r7) (plus:SI (reg/f:SI 13 sp) (const_int 0 [0x0]))) -1 (nil)) ... (insn 55 50 57 2 src/t9.c:7 (set (reg/f:SI 13 sp) (plus:SI (reg/f:SI 13 sp) (const_int -48 [0xffffffffffffffd0]))) 4 {*arm_addsi3} (nil)) ... Among them insn 118 trigger the following code in function combine_stack_adjustments_for_block, and prevent the combine of stack adjustment codes. It is emitted along with insn 117. /* Otherwise, we were not able to process the instruction. Do not continue collecting data across such a one. */ if (last_sp_set && (CALL_P (insn) || reg_mentioned_p (stack_pointer_rtx, PATTERN (insn)))) { /* Clear the collected stack references. */ ... } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43513