https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93611

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Created attachment 47788
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47788&action=edit
gcc10-pr93611.patch

Ugh, this is nasty.  The problem is that splitting works by clearing
recog_data.insn and then performing various recog_data.operand elt changes,
trying to match various splitters.  That works fine, because if somebody does
extract_insn_cached afterwards, it will not use cache and will extract it
again.
The problem is that two of the i386.md splitters have conditions that
ultimately call extract_insn_cached, so if we are unlucky, try to match
splitter with that condition (which sets recog_data.insn to the current
instruction), that condition fails and we continue looking for further matching
splitters, we modify recog_data.operand again, but the generated split_insns
doesn't expect something modifies recog_data.insn.  So, when after splitting
some other pass performs extract_insn_cached, it can see a match, but
recog_data.operand array contains garbage from the failed attempts to split,
yet recog_data.insn says it is correct.

Reply via email to