------- Comment #2 from carrot at google dot com 2010-07-09 00:04 ------- (In reply to comment #1) > >So in function fwprop_addr before deciding propagate an expression should we > also check if it is the only use of the corresponding def? > > It does somewhat. Though address cost might be lower for r2+r3 than just r8. > Please make sure that fwprop_addr has the correct address cost. >
It occurs before register allocation, it is hard to say (plus (reg 144) (reg 143)) is cheaper than (reg 137). But the address cost looks really strange. The arm/thumb2 address cost function is arm_arm_address_cost (rtx x) { enum rtx_code c = GET_CODE (x); if (c == PRE_INC || c == PRE_DEC || c == POST_INC || c == POST_DEC) return 0; if (c == MEM || c == LABEL_REF || c == SYMBOL_REF) return 10; if (c == PLUS) { if (GET_CODE (XEXP (x, 1)) == CONST_INT) return 2; if (ARITHMETIC_P (XEXP (x, 0)) || ARITHMETIC_P (XEXP (x, 1))) return 3; return 4; } return 6; } Give it a single register, the cost is 6. Give it the rtx (plus (reg 144) (reg 143)), the cost is 4. So a single register is more expensive than a plus expression, not reasonable. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44883