I am looking at how the MIPS backend handles division. For the compiler
configuration in question (mipsel-linux) division operations trap on
division by zero. This is handled in mips_output_division in mips.c
where we unconditionally emit a conditional trap.
I would like to change it so that if the divisor is not zero, the
conditional trap would be omitted. I am looking at this small test program:
int divtest(int x, int y)
{
if (y == 0)
return 45;
else
return x / y;
}
If I set a breakpoint in mips_output_division, I can print out the
operands for the division operation:
(gdb) p operands[2]
$6 = (rtx) 0x2aaaae155aa0
(gdb) pr
(reg/v:SI 5 $5 [orig:196 y ] [196])
Q1: Is it possible to get to the VRP information from this rtx? How?
If the VRP information is available, it would be nice to |define_expand
for the division/conditional trap and perhaps let the compiler schedule
the trap. However the define_expand documentation states that the
condition for the define_expand cannot depend on the data in the insn
being matched. That would seem to imply that the expansion cannot be
dependent on the VRP information.
Q2: Is that correct, and why?
Q3: Would it be better to do this at the tree level instead of rtl?
Thanks in advance,
David Daney
|