Hi, In scan_one_insn, gcc checks whether an insn loads a parameter from its stack slot, and then record the fact by decrease the memory cost.
What I do not understand is the check condition like below checks the REG_EQUIV note, rather than checking memory access using stack pointer directly. if (set != 0 && REG_P (SET_DEST (set)) && MEM_P (SET_SRC (set)) && (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != NULL_RTX && ((MEM_P (XEXP (note, 0))) || (CONSTANT_P (XEXP (note, 0)) && targetm.legitimate_constant_p (GET_MODE (SET_DEST (set)), XEXP (note, 0)) && REG_N_SETS (REGNO (SET_DEST (set))) == 1))) So what's the connection between REG_EQUIV and stack slot for parameters? I noticed from below dumps of IRA pass, seems the annotated insn is not load parameter from stack, but it is treated as the check condition. Why? Dump of IRA: (insn 121 118 122 6 (set (reg/f:SI 252 [ l_curve ]) (mem/f/c:SI (reg/f:SI 230) [7 l_curve+0 S4 A32])) bezier01/bmark_lite.c:246 186 {*thumb1_movsi_insn} (expr_list:REG_EQUIV (mem/f/c:SI (reg/f:SI 230) [7 l_curve+0 S4 A32]) (expr_list:REG_EQUAL (mem/f/c:SI (symbol_ref:SI ("l_curve") [flags 0x80] <var_decl 0xb768d0c0 l_curve>) [7 l_curve+0 S4 A32]) (nil)))) I am not sure if I missed something important, please help. Thanks very much. -- Best Regards.