https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95218
--- Comment #10 from rguenther at suse dot de <rguenther at suse dot de> --- On Wed, 20 May 2020, ubizjak at gmail dot com wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95218 > > Uroš Bizjak <ubizjak at gmail dot com> changed: > > What |Removed |Added > ---------------------------------------------------------------------------- > CC| |law at gcc dot gnu.org, > | |rsandifo at gcc dot gnu.org > > --- Comment #9 from Uroš Bizjak <ubizjak at gmail dot com> --- > (In reply to Uroš Bizjak from comment #7) > > Ooh, yes :( > > > > '(use X)' > > Represents the use of the value of X. It indicates that the value > > in X at this point in the program is needed, even though it may not > > be apparent why this is so. Therefore, the compiler will not > > attempt to delete previous instructions whose only effect is to > > store a value in X. X must be a 'reg' expression. > > > > Partial revert is in works. > > Actually, no. The above applies to single (use ...) RTX, not (use ...) as part > of a parallel. There are plenty of uses of memory_operands in i386.md: > > (define_insn "fix_truncdi_i387" > [(set (match_operand:DI 0 "nonimmediate_operand" "=m") > (fix:DI (match_operand 1 "register_operand" "f"))) > (use (match_operand:HI 2 "memory_operand" "m")) > (use (match_operand:HI 3 "memory_operand" "m")) > (clobber (match_scratch:XF 4 "=&f"))] > > Let's ask experts. The question is what should the (use ...) do? Allow the splitter to use its contents? I guess that's reasonable interpretation though I thought (use ...) apply only to register liveness computation and not to memory. But what do I know about RTL ;)