Hi,
I encountered below example,
<bb x>
79: r169:SI=r190:SI<<0x2
<bb y>
115: r180:SI=r180:SI+r169:SI
116: cc:CC=cmp(r181:SI,r190:SI)
117: pc={(cc:CC==0)?L125:pc}
The register r169 is only defined by insn79, so I was hoping the
reference in insn115 can be replaced by "r190<<0x2", thus saving one
instruction and one live pseudo register.
Problem is fwprop pass doesn't do this now because function
propagate_rtx_1 only returns true if PR_CAN_APPEAR is set, which is
not in this case because of below code in propagate_rtx:
flags = 0;
if (REG_P (new_rtx)
|| CONSTANT_P (new_rtx)
|| (GET_CODE (new_rtx) == SUBREG
&& REG_P (SUBREG_REG (new_rtx))
&& (GET_MODE_SIZE (mode)
<= GET_MODE_SIZE (GET_MODE (SUBREG_REG (new_rtx))))))
flags |= PR_CAN_APPEAR;
if (!for_each_rtx (&new_rtx, varying_mem_p, NULL))
flags |= PR_HANDLE_MEM;
if (speed)
flags |= PR_OPTIMIZE_FOR_SPEED;
I did experiment by setting PR_CAN_APPEAR here but fwprop doesn't work
correctly any more.
So question is Why we don't do such transformation in fwprop pass and
how should this be handled?
Thanks very much.
--
Best Regards.