On 4/6/23 04:15, Eric Botcazou wrote:
Originally I didn't really see this as an operation. But the more and
more I ponder it feels like it's an operation and thus should be subject
to WORD_REGISTER_OPERATIONS.
While it's not really binding on RTL semantics, if we look at how some
architectures implement reg->reg copies, they're actually implemented
with an ADD or IOR -- so a real operation under the hood.
If we accept a subreg copy as an operation and thus subject to
WORD_REGISTER_OPERATIONS then that would seem to imply the combine is
the real problem here. Otherwise dse is the culprit.
Yes, I agree that there is an ambiguity for subreg copy operations. At some
point I tried to define what register operations are and added a predicate to
that effect (word_register_operation_p ); while it returns true for SUBREG,
it's an opt-out predicate so this does not mean much.
Yea, I saw word_register_operation_p. I was hesitant to treat it as a
canonical definition of what ops are and are not subject to
WORD_REGISTER_OPERATIONS.
I don't think that DSE does anything wrong: as I wrote in the PR, defining
WORD_REGISTER_OPERATIONS should not prevent any particular form of RTL.
That was the conclusion I'd come to, predicated on treating SUBREGs as
affected by WORD_REGISTER_OPERATIONS.
I therefore think that the problem is in the combiner and probably in the
intermediate step shown by Jakub:
"Then after that try_combine we do:
13325 record_value_for_reg (dest, record_dead_insn,
13326 WORD_REGISTER_OPERATIONS
13327 && word_register_operation_p (SET_SRC
(setter))
13328 && paradoxical_subreg_p (SET_DEST
(setter))
13329 ? SET_SRC (setter)
13330 : gen_lowpart (GET_MODE (dest),
13331 SET_SRC (setter)));
and the 3 conditions are true here and so record value of the whole setter.
That then records among other things nonzero_bits as 0x8084c."
That's a recent addition of mine (ae20d760b1ed69f631c3bf9351bf7e5005d52297)
and I think that it probably abuses WORD_REGISTER_OPERATIONS and should either
be reverted or restricted to the load case documented in its comment. I can
provide testing on SPARC if need be.
I think that's the job for today. Pan2, Jakub and myself have all
zero'd in on this code in combine.
jeff