https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88473
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |kyukhin at gcc dot gnu.org, | |uros at gcc dot gnu.org, | |vmakarov at gcc dot gnu.org --- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- The *s on the =k, km *mov{di,si}_internal patterns (which I've copied to the *zero_extend?i?i2 patterns) were introduced in https://gcc.gnu.org/ml/gcc-patches/2014-08/msg01113.html but there wasn't any discussion on why that has been introduced. Was that a fear that the register allocator will start using the mask registers for cases like memory1 = memory2 | memory3; instead of the GPRs? I'd say it would be useful to slightly disparage transfers from GPRs to mask registers and back and perhaps also slightly disparate mask stores into memory if needed to prevent using mask registers for the logical ops or shifts with only memory arguments and keep the rest of the alternative constaints (like =k, km) without any modifiers. And if that works, change the mask intrinsics to be normal arithmetics instead of special builtins with UNSPECs at RTL. Thoughts on that?