[llvm] 4f92cf9 - [X86] combine-clmul.ll - pull out canonicalization tests from #177566 (#181820)

via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 17 06:16:43 PST 2026


Author: Simon Pilgrim
Date: 2026-02-17T14:16:29Z
New Revision: 4f92cf9599c4077c08b7fac0a21624e55da572f9

URL: https://github.com/llvm/llvm-project/commit/4f92cf9599c4077c08b7fac0a21624e55da572f9
DIFF: https://github.com/llvm/llvm-project/commit/4f92cf9599c4077c08b7fac0a21624e55da572f9.diff

LOG: [X86] combine-clmul.ll - pull out canonicalization tests from #177566 (#181820)

Added: 
    llvm/test/CodeGen/X86/combine-clmul.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/CodeGen/X86/combine-clmul.ll b/llvm/test/CodeGen/X86/combine-clmul.ll
new file mode 100644
index 0000000000000..da61c7243736e
--- /dev/null
+++ b/llvm/test/CodeGen/X86/combine-clmul.ll
@@ -0,0 +1,78 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2    | FileCheck %s --check-prefixes=CHECK,SCALAR
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2,+pclmul | FileCheck %s --check-prefixes=CHECK,SSE-PCLMUL
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2,+pclmul | FileCheck %s --check-prefixes=CHECK,SSE-PCLMUL
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2,+pclmul | FileCheck %s --check-prefixes=CHECK,AVX
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2,+vpclmulqdq  | FileCheck %s --check-prefixes=CHECK,AVX
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl,+vpclmulqdq | FileCheck %s --check-prefixes=CHECK,AVX
+
+; Test with constant 0 - should optimize to just returning 0
+define i32 @clmul_i32_zero(i32 %a) {
+; CHECK-LABEL: clmul_i32_zero:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    retq
+  %res = call i32 @llvm.clmul.i32(i32 %a, i32 0)
+  ret i32 %res
+}
+
+; Test with constant 1 - should optimize to just returning %a
+define i32 @clmul_i32_one(i32 %a) {
+; SCALAR-LABEL: clmul_i32_one:
+; SCALAR:       # %bb.0:
+; SCALAR-NEXT:    movl %edi, %eax
+; SCALAR-NEXT:    retq
+;
+; SSE-PCLMUL-LABEL: clmul_i32_one:
+; SSE-PCLMUL:       # %bb.0:
+; SSE-PCLMUL-NEXT:    movl $1, %eax
+; SSE-PCLMUL-NEXT:    movq %rax, %xmm0
+; SSE-PCLMUL-NEXT:    movd %edi, %xmm1
+; SSE-PCLMUL-NEXT:    pclmulqdq $0, %xmm0, %xmm1
+; SSE-PCLMUL-NEXT:    movq %xmm1, %rax
+; SSE-PCLMUL-NEXT:    # kill: def $eax killed $eax killed $rax
+; SSE-PCLMUL-NEXT:    retq
+;
+; AVX-LABEL: clmul_i32_one:
+; AVX:       # %bb.0:
+; AVX-NEXT:    movl $1, %eax
+; AVX-NEXT:    vmovq %rax, %xmm0
+; AVX-NEXT:    vmovd %edi, %xmm1
+; AVX-NEXT:    vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT:    vmovq %xmm0, %rax
+; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
+; AVX-NEXT:    retq
+  %res = call i32 @llvm.clmul.i32(i32 %a, i32 1)
+  ret i32 %res
+}
+
+; Test with power of 2 - should become a shift
+define i32 @clmul_i32_pow2(i32 %a) {
+; SCALAR-LABEL: clmul_i32_pow2:
+; SCALAR:       # %bb.0:
+; SCALAR-NEXT:    movl %edi, %eax
+; SCALAR-NEXT:    shll $4, %eax
+; SCALAR-NEXT:    retq
+;
+; SSE-PCLMUL-LABEL: clmul_i32_pow2:
+; SSE-PCLMUL:       # %bb.0:
+; SSE-PCLMUL-NEXT:    movl $16, %eax
+; SSE-PCLMUL-NEXT:    movq %rax, %xmm0
+; SSE-PCLMUL-NEXT:    movd %edi, %xmm1
+; SSE-PCLMUL-NEXT:    pclmulqdq $0, %xmm0, %xmm1
+; SSE-PCLMUL-NEXT:    movq %xmm1, %rax
+; SSE-PCLMUL-NEXT:    # kill: def $eax killed $eax killed $rax
+; SSE-PCLMUL-NEXT:    retq
+;
+; AVX-LABEL: clmul_i32_pow2:
+; AVX:       # %bb.0:
+; AVX-NEXT:    movl $16, %eax
+; AVX-NEXT:    vmovq %rax, %xmm0
+; AVX-NEXT:    vmovd %edi, %xmm1
+; AVX-NEXT:    vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT:    vmovq %xmm0, %rax
+; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
+; AVX-NEXT:    retq
+  %res = call i32 @llvm.clmul.i32(i32 %a, i32 16)  ; 0x10 = 1 << 4
+  ret i32 %res
+}


        


More information about the llvm-commits mailing list