On 07/01/14 23:23, Richard Biener wrote:
> On Tue, 7 Jan 2014, Kugan wrote:
[snip]
> Note that VIEW_CONVERT_EXPR is wrong here. I think you are
> handling this wrong still. From a quick look you want to avoid
> the actual promotion for
>
> reg_1 = ....
>
> when reg_1 is promoted and thus the target is (subreg:XX N).
> The RHS has been expanded in XXmode. Dependent on the value-range
> of reg_1 you want to set N to a paradoxical subreg of the expanded
> result. You can always do that if the reg is zero-extended
> and else if the MSB is not set for any of the values of reg_1.
Thanks Richard for the explanation. I just want to double confirm I
understand you correctly before I attempt to fix it. So let me try this
for the following example,
for a gimple stmt of the following from:
unsigned short _5;
short int _6;
_6 = (short int)_5;
;; _6 = (short int) _5;
target = (subreg/s/u:HI (reg:SI 110 [ D.4144 ]) 0)
temp = (subreg:HI (reg:SI 118) 0)
So, I must generate the following if it satisfies the other conditions.
(set (reg:SI 110 [ D.4144 ]) (subreg:SI temp ))
Is my understanding correct?
> I don't see how is_assigned_exp_fit_type reflects this in any way.
>
What I tried doing with the patch is:
(insn 13 12 0 (set (reg:SI 110 [ D.4144 ])
(zero_extend:SI (subreg:HI (reg:SI 118) 0))) c5.c:8 -1
(nil))
If the values in register (reg:SI 118) fits HI mode (without
overflowing), I assume that it is not necessary to just drop the higher
bits and zero_extend as done above and generate the following instead.
(insn 13 12 0 (set (reg:SI 110 [ D.4144 ])
(((reg:SI 118) 0))) c5.c:8 -1
(nil))
is_assigned_exp_fit_type just checks if the range fits (in the above
case, the value in eg:SI 118 fits HI mode) and the checks before
emit_move_insn (SUBREG_REG (target), SUBREG_REG (temp)); checks the
modes match.
Is this wrong or am I missing the whole point?
> Anyway, the patch should not introduce another if (promoted)
> case but only short-cut the final convert_move call of the existing
> one.
>
Thanks,
Kugan