Hi :
I am studying IRA right now (GCC4.4.1,mips32 target),
for following piece of code:
long long func(int a, int b)
{
long long r = (long long)a * (long long)b;
return r;
}
the asm generated on mips is like:
mult $5,$4
mfhi $5
mflo $2
j $31
move $3,$5 <----------unnecessary move insn
Please note the unnecessary move insn.
RTL list before subreg1 and IRA pass are like:
--------------------------------------------before subreg1
(insn 7 4 8 2 mult-problem.c:2 (set (reg:DI 196)
(mult:DI (sign_extend:DI (reg/v:SI 195 [ b ]))
(sign_extend:DI (reg/v:SI 194 [ a ])))) 50 {mulsidi3_32bit} (nil))
(insn 8 7 12 2 mult-problem.c:2 (set (reg:DI 193 [ <result> ])
(reg:DI 196)) 282 {*movdi_32bit} (nil))
(insn 12 8 18 2 mult-problem.c:6 (set (reg/i:DI 2 $2)
(reg:DI 193 [ <result> ])) 282 {*movdi_32bit} (nil))
--------------------------------------------before IRA
(insn 7 4 25 2 mult-problem.c:2 (set (reg:DI 196)
(mult:DI (sign_extend:DI (reg:SI 5 $5 [ b ]))
(sign_extend:DI (reg:SI 4 $4 [ a ])))) 50 {mulsidi3_32bit}
(expr_list:REG_DEAD (reg:SI 5 $5 [ b ])
(expr_list:REG_DEAD (reg:SI 4 $4 [ a ])
(nil))))
(insn 25 7 26 2 mult-problem.c:6 (set (reg:SI 2 $2)
(subreg:SI (reg:DI 196) 0)) 287 {*movsi_internal} (nil))
(insn 26 25 18 2 mult-problem.c:6 (set (reg:SI 3 $3 [+4 ])
(subreg:SI (reg:DI 196) 4)) 287 {*movsi_internal}
(expr_list:REG_DEAD (reg:DI 196)
(nil)))
---end
Seems DImode split prevents IRA allocating $2/$3 directly
by introducing conflicts between $196 and $2/3 in (insn 25/26).
Wondering whether possible to handle multi-word mode with more accuracy,
in either subreg or IRA pass?
Thanks in advance.
--
Best Regards.