Hi! On Wed, Jun 14, 2023 at 05:26:52PM +0800, Jiufu Guo wrote: > Richard Biener <rguent...@suse.de> writes: > >> 3. "set (mem/c:DI (reg/f:DI 1 1) unspec:DI (const_int 0 [0]) > >> UNSPEC_TIE". > >> This avoids using BLK on unspec, but using DI. > > > > That gives the MEM a size which means we can interpret the (set ..) > > as killing a specific area of memory, enabling DSE of earlier > > stores. > > Oh, thanks! > While with 'unspec:DI', I'm wondering if it means this 'set' would > do some special things other than pure 'set' to the memory.
No, that is not what unspec means. It just means "some DImode value I'm not telling you anything about". If to get that value there is some important work done (that should not be oprimised away, say) you need unspec_volatile, which means just that: there is an unspecified side effect done by that insn, so it has to be done on the real machine exactly like on the abstract C machine, so the insn has big restrictions on being moved and removed etc. We can replace the RHS of (almost) *every* set with an unspec, and the compiler would still work, just would generate pretty lousy code. But at least CSE and DSE (and everything else purely dataflow) would still work :-) Segher