> 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. 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. 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. -- Eric Botcazou