Bernd Schmidt wrote:
> On 06/15/2010 12:06 AM, Ian Lance Taylor wrote:
> > Well, as you know, subregs have two meanings which look similar but
> > are in fact entirely different. It's valid to set subregs of the same
> > pseudo in parallel if the subregs represent different hard registers.
> > It's not valid if the subregs represent different pieces of the same
> > hard register.
>
> Are you aware of any examples of this in the compiler? The explanation
> is of course plausible, but do we know that we handle this correctly
> everywhere?
I ran into problems trying to do this on s390; that's why e.g. the
divmod patterns now look like
[(set (match_operand:TI 0 "register_operand" "=d,d")
(ior:TI
(ashift:TI
(zero_extend:TI
(mod:DI (match_operand:DI 1 "register_operand" "0,0")
(match_operand:DI 2 "general_operand" "d,RT")))
(const_int 64))
(zero_extend:TI (div:DI (match_dup 1) (match_dup 2)))))]
instead of a parallel set of two subregs. In particular, there seemed
to be problems with dataflow not recognizing a parallel set of two
subregs as actually fully setting the whole register ...
But of course, that was a long time ago, maybe the new dataflow
mechanism has fixed this now.
Bye,
Ulrich
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
[email protected]