[llvm] [PreISelIntrinsicLowering] Lower bounded memcpy/memmove to masked load/store (PR #212710)

via llvm-commits llvm-commits at lists.llvm.org
Sun Sep 13 06:34:34 PDT 2026


Harishankar14 wrote:

```
.att_syntax
	.file	"test.cpp"
	.section	.rodata,"a", at progbits
	.p2align	6, 0x0                          # -- Begin function _Z8memcpy64PvPKvm
.LCPI0_0:
	.quad	0                               # 0x0
	.quad	1                               # 0x1
	.quad	2                               # 0x2
	.quad	3                               # 0x3
	.quad	4                               # 0x4
	.quad	5                               # 0x5
	.quad	6                               # 0x6
	.quad	7                               # 0x7
.LCPI0_1:
	.quad	8                               # 0x8
	.quad	9                               # 0x9
	.quad	10                              # 0xa
	.quad	11                              # 0xb
	.quad	12                              # 0xc
	.quad	13                              # 0xd
	.quad	14                              # 0xe
	.quad	15                              # 0xf
.LCPI0_2:
	.quad	16                              # 0x10
	.quad	17                              # 0x11
	.quad	18                              # 0x12
	.quad	19                              # 0x13
	.quad	20                              # 0x14
	.quad	21                              # 0x15
	.quad	22                              # 0x16
	.quad	23                              # 0x17
.LCPI0_3:
	.quad	24                              # 0x18
	.quad	25                              # 0x19
	.quad	26                              # 0x1a
	.quad	27                              # 0x1b
	.quad	28                              # 0x1c
	.quad	29                              # 0x1d
	.quad	30                              # 0x1e
	.quad	31                              # 0x1f
.LCPI0_4:
	.quad	32                              # 0x20
	.quad	33                              # 0x21
	.quad	34                              # 0x22
	.quad	35                              # 0x23
	.quad	36                              # 0x24
	.quad	37                              # 0x25
	.quad	38                              # 0x26
	.quad	39                              # 0x27
.LCPI0_5:
	.quad	40                              # 0x28
	.quad	41                              # 0x29
	.quad	42                              # 0x2a
	.quad	43                              # 0x2b
	.quad	44                              # 0x2c
	.quad	45                              # 0x2d
	.quad	46                              # 0x2e
	.quad	47                              # 0x2f
.LCPI0_6:
	.quad	48                              # 0x30
	.quad	49                              # 0x31
	.quad	50                              # 0x32
	.quad	51                              # 0x33
	.quad	52                              # 0x34
	.quad	53                              # 0x35
	.quad	54                              # 0x36
	.quad	55                              # 0x37
.LCPI0_7:
	.quad	56                              # 0x38
	.quad	57                              # 0x39
	.quad	58                              # 0x3a
	.quad	59                              # 0x3b
	.quad	60                              # 0x3c
	.quad	61                              # 0x3d
	.quad	62                              # 0x3e
	.quad	63                              # 0x3f
	.text
	.globl	_Z8memcpy64PvPKvm
	.prefalign	4, .Lfunc_end0, nop
	.type	_Z8memcpy64PvPKvm, at function
_Z8memcpy64PvPKvm:                      # @_Z8memcpy64PvPKvm
	.cfi_startproc
# %bb.0:                                # %entry
	testq	%rdx, %rdx
	je	.LBB0_2
# %bb.1:                                # %if.end
	vpbroadcastq	%rdx, %zmm0
	vpcmpnleuq	.LCPI0_0(%rip), %zmm0, %k0
	vpcmpnleuq	.LCPI0_1(%rip), %zmm0, %k1
	vpcmpnleuq	.LCPI0_3(%rip), %zmm0, %k2
	vpcmpnleuq	.LCPI0_7(%rip), %zmm0, %k3
	kunpckbw	%k0, %k1, %k0
	vpcmpnleuq	.LCPI0_2(%rip), %zmm0, %k1
	kunpckbw	%k1, %k2, %k1
	vpcmpnleuq	.LCPI0_5(%rip), %zmm0, %k2
	kunpckwd	%k0, %k1, %k0
	vpcmpnleuq	.LCPI0_4(%rip), %zmm0, %k1
	kunpckbw	%k1, %k2, %k1
	vpcmpnleuq	.LCPI0_6(%rip), %zmm0, %k2
	kunpckbw	%k2, %k3, %k2
	kunpckwd	%k1, %k2, %k1
	kunpckdq	%k0, %k1, %k1
	vmovdqu8	(%rsi), %zmm0 {%k1} {z}
	vmovdqu8	%zmm0, (%rdi) {%k1}
.LBB0_2:                                # %return
	vzeroupper
	retq
.Lfunc_end0:
	.size	_Z8memcpy64PvPKvm, .Lfunc_end0-_Z8memcpy64PvPKvm
	.cfi_endproc
                                        # -- End function
	.section	.rodata,"a", at progbits
	.p2align	6, 0x0                          # -- Begin function _Z9memmove64PvPKvm
.LCPI1_0:
	.quad	0                               # 0x0
	.quad	1                               # 0x1
	.quad	2                               # 0x2
	.quad	3                               # 0x3
	.quad	4                               # 0x4
	.quad	5                               # 0x5
	.quad	6                               # 0x6
	.quad	7                               # 0x7
.LCPI1_1:
	.quad	8                               # 0x8
	.quad	9                               # 0x9
	.quad	10                              # 0xa
	.quad	11                              # 0xb
	.quad	12                              # 0xc
	.quad	13                              # 0xd
	.quad	14                              # 0xe
	.quad	15                              # 0xf
.LCPI1_2:
	.quad	16                              # 0x10
	.quad	17                              # 0x11
	.quad	18                              # 0x12
	.quad	19                              # 0x13
	.quad	20                              # 0x14
	.quad	21                              # 0x15
	.quad	22                              # 0x16
	.quad	23                              # 0x17
.LCPI1_3:
	.quad	24                              # 0x18
	.quad	25                              # 0x19
	.quad	26                              # 0x1a
	.quad	27                              # 0x1b
	.quad	28                              # 0x1c
	.quad	29                              # 0x1d
	.quad	30                              # 0x1e
	.quad	31                              # 0x1f
.LCPI1_4:
	.quad	32                              # 0x20
	.quad	33                              # 0x21
	.quad	34                              # 0x22
	.quad	35                              # 0x23
	.quad	36                              # 0x24
	.quad	37                              # 0x25
	.quad	38                              # 0x26
	.quad	39                              # 0x27
.LCPI1_5:
	.quad	40                              # 0x28
	.quad	41                              # 0x29
	.quad	42                              # 0x2a
	.quad	43                              # 0x2b
	.quad	44                              # 0x2c
	.quad	45                              # 0x2d
	.quad	46                              # 0x2e
	.quad	47                              # 0x2f
.LCPI1_6:
	.quad	48                              # 0x30
	.quad	49                              # 0x31
	.quad	50                              # 0x32
	.quad	51                              # 0x33
	.quad	52                              # 0x34
	.quad	53                              # 0x35
	.quad	54                              # 0x36
	.quad	55                              # 0x37
.LCPI1_7:
	.quad	56                              # 0x38
	.quad	57                              # 0x39
	.quad	58                              # 0x3a
	.quad	59                              # 0x3b
	.quad	60                              # 0x3c
	.quad	61                              # 0x3d
	.quad	62                              # 0x3e
	.quad	63                              # 0x3f
	.text
	.globl	_Z9memmove64PvPKvm
	.prefalign	4, .Lfunc_end1, nop
	.type	_Z9memmove64PvPKvm, at function
_Z9memmove64PvPKvm:                     # @_Z9memmove64PvPKvm
	.cfi_startproc
# %bb.0:                                # %entry
	testq	%rdx, %rdx
	je	.LBB1_2
# %bb.1:                                # %if.end
	vpbroadcastq	%rdx, %zmm0
	vpcmpnleuq	.LCPI1_0(%rip), %zmm0, %k0
	vpcmpnleuq	.LCPI1_1(%rip), %zmm0, %k1
	vpcmpnleuq	.LCPI1_3(%rip), %zmm0, %k2
	vpcmpnleuq	.LCPI1_7(%rip), %zmm0, %k3
	kunpckbw	%k0, %k1, %k0
	vpcmpnleuq	.LCPI1_2(%rip), %zmm0, %k1
	kunpckbw	%k1, %k2, %k1
	vpcmpnleuq	.LCPI1_5(%rip), %zmm0, %k2
	kunpckwd	%k0, %k1, %k0
	vpcmpnleuq	.LCPI1_4(%rip), %zmm0, %k1
	kunpckbw	%k1, %k2, %k1
	vpcmpnleuq	.LCPI1_6(%rip), %zmm0, %k2
	kunpckbw	%k2, %k3, %k2
	kunpckwd	%k1, %k2, %k1
	kunpckdq	%k0, %k1, %k1
	vmovdqu8	(%rsi), %zmm0 {%k1} {z}
	vmovdqu8	%zmm0, (%rdi) {%k1}
.LBB1_2:                                # %return
	vzeroupper
	retq
.Lfunc_end1:
	.size	_Z9memmove64PvPKvm, .Lfunc_end1-_Z9memmove64PvPKvm
	.cfi_endproc
                                        # -- End function
	.globl	_Z15memcpy64_avx512PvPKvm       # -- Begin function _Z15memcpy64_avx512PvPKvm
	.prefalign	4, .Lfunc_end2, nop
	.type	_Z15memcpy64_avx512PvPKvm, at function
_Z15memcpy64_avx512PvPKvm:              # @_Z15memcpy64_avx512PvPKvm
	.cfi_startproc
# %bb.0:                                # %entry
	testq	%rdx, %rdx
	je	.LBB2_2
# %bb.1:                                # %if.end
	movq	$-1, %rax
	bzhiq	%rdx, %rax, %rax
	kmovq	%rax, %k1
	vmovdqu8	(%rsi), %zmm0 {%k1} {z}
	vmovdqu8	%zmm0, (%rdi) {%k1}
.LBB2_2:                                # %return
	vzeroupper
	retq
.Lfunc_end2:
	.size	_Z15memcpy64_avx512PvPKvm, .Lfunc_end2-_Z15memcpy64_avx512PvPKvm
	.cfi_endproc
                                        # -- End function
	.ident	"clang version 24.0.0git (https://github.com/Harishankar14/llvm-project.git 3fb7712079cd4c812a67e6bfc85fb973483a25e4)"
	.section	".note.GNU-stack","", at progbits
	.addrsig
```

@arsenm  @RKSimon  Looks ugly, but  solving #222659  can ease things, and make it better 

https://github.com/llvm/llvm-project/pull/212710


More information about the llvm-commits mailing list