Hi,
Segher Boessenkool <seg...@kernel.crashing.org> writes: > On Thu, Jun 15, 2023 at 03:00:40PM +0800, Jiufu Guo wrote: >> >> This is the existing pattern. It may be read as an action >> >> to clean an unknown-size memory block. >> > >> > Including a size zero memory block, yes. BLKmode was originally to do >> > things like bcopy (before modern names like memcpy were more usually >> > used), and those very much need size zero as well.h >> >> The size is possible to be zero. No asm code needs to >> be generated for "set 'const_int 0' to zero size memory"". >> stack_tie does not generate any real code. It seems ok :) >> >> While, it may not be zero size mem. This may be a concern. >> This is one reason that I would like to have an unspec_tie. > > It very much *can* be a zero size mem, that is perfectly find for > mem:BLK. There is still one concern: how to distinguish stack_tie from other insn. For example, below fake pattern: (define_insn "xx_cleanmem" [(parallel: [(set (mem:BLK (xxx)) (const_int 0)) (XXX/use "const_int_operand" "n")])]... To avoid this pattern to be recognized as 'stack_tie', 'unspec_tie' was came to mind. > >> Another reason is unspec:blk is used but various ports :) > > unspec:BLK is undefined. BLKmode is allowed on mem only. > >> >> 2. "set (mem/c:BLK (reg/f:DI 1 1) unspec:blk (const_int 0 [0]) >> >> UNSPEC_TIE". >> >> Current patch is using this one. >> > >> > What would be the semantics of that? Just the same as the current stuff >> > I'd say, or less? It cannot be more! >> >> The semantic that I trying to achieve is "this is a special >> insn, not only a normal set to unknown size mem". > > What does that *mean*? "Special instruction"? What would what code do > for that? What would the RTL mean? > >> As you explained before on 'unspec:DI', the unspec would >> just decorate the set_src part: something DI value with >> machine-specific operation. > > An unspec is an operation on its operands, giving some (in this case) > DImode value. There is nothing special about that operation, it can be > optimised like any other, it's just not specified what exactly that > value is (to the generic compiler, the backend itself can very much > optimise stuff with it). > >> But, since 'tie_operand' is checked for this insn. >> If 'tie_operand' checks UNPSEC_TIE, then the insn >> with UNPSEC_TIE is 'a special insn'. Or interpret >> the semantic of this insn as: this insn stack_ite >> indicates "set/operate a zero size block". > > tie_operand is a predicate. The predicate of an insn has to return 1, > or the insn is not recognised. You can do the same in insn conditions > always (in principle anyway). Thank you very much for your detailed and patient explanation! BR, Jeff (Jiufu Guo) > > > Segher