redundant divmodsi4 not optimized away
Greg McGary
greg@mcgary.org
Wed Apr 28 16:58:00 GMT 2010
On 04/28/10 05:58, Michael Matz wrote:
> On Tue, 27 Apr 2010, Greg McGary wrote:
>
>> (define_insn "*udivmodsi4_libcall"
>> [(set (reg:SI 4)
>> (udiv:SI (reg:SI 1)
>> (reg:SI 2)))
>> (set (reg:SI 1)
>> (umod:SI (reg:SI 1)
>> (reg:SI 2)))
>> (clobber (reg:SI 2))
>> (clobber (reg:SI 3))
>> (clobber (reg:CC CC_REGNUM))
>> (clobber (reg:SI RETURN_POINTER_REGNUM))]
>> ""
>> "call\\t__udivmodsi4"
>> [(set_attr "length" "4")])
>>
> So, this pattern uses r2 and clobbers r2+r3. Two calls in a row can't be
> eliminated because the execution of one destroys one operand of the other
> as far as GCC knows, and the necessary copies to reload the correct value
> into r2 before the second call might confuse combine/CSE/DCE/whatever. At
> least that would be my theory to start from :)
>
The libcall insn above appears only after reload, as the result of a
split. All the CSE passes occur before reload when the insn pattern is
this:
[(set (match_operand:SI 0 "gen_reg_operand" "=r")
(udiv:SI (match_operand:SI 1 "gen_reg_operand" "r")
(match_operand:SI 2 "gen_reg_operand" "r")))
(set (match_operand:SI 3 "gen_reg_operand" "=r")
(umod:SI (match_dup 1)
(match_dup 2)))
(clobber (reg:SI 1))
(clobber (reg:SI 2))
(clobber (reg:SI 3))
(clobber (reg:SI 4))
(clobber (reg:CC CC_REGNUM))
(clobber (reg:SI RETURN_POINTER_REGNUM))]
G
More information about the Gcc
mailing list