[llvm] 0c7380e - [DAG] Add or(and(x,c1),and(or(x,y),c2)) tests

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 17 10:52:05 PDT 2022


Author: Simon Pilgrim
Date: 2022-07-17T18:22:55+01:00
New Revision: 0c7380ebbd657cd10c265ae2944e859268312a11

URL: https://github.com/llvm/llvm-project/commit/0c7380ebbd657cd10c265ae2944e859268312a11
DIFF: https://github.com/llvm/llvm-project/commit/0c7380ebbd657cd10c265ae2944e859268312a11.diff

LOG: [DAG] Add or(and(x,c1),and(or(x,y),c2)) tests

Tests for the fold suggested in D77804

Added: 
    

Modified: 
    llvm/test/CodeGen/X86/combine-or.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/CodeGen/X86/combine-or.ll b/llvm/test/CodeGen/X86/combine-or.ll
index cbad9c92f48ed..d451eed3b7eb8 100644
--- a/llvm/test/CodeGen/X86/combine-or.ll
+++ b/llvm/test/CodeGen/X86/combine-or.ll
@@ -489,3 +489,130 @@ define <4 x i32> @or_zext_v4i16(<4 x i16> %a0) {
   ret <4 x i32> %2
 }
 
+; FIXME: fold (or (and X, C1), (and (or X, Y), C2)) -> (or (and X, C1|C2), (and Y, C2))
+
+define i32 @or_and_and_i32(i32 %x, i32 %y) {
+; CHECK-LABEL: or_and_and_i32:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi
+; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
+; CHECK-NEXT:    orl %edi, %esi
+; CHECK-NEXT:    andl $8, %edi
+; CHECK-NEXT:    andl $-11, %esi
+; CHECK-NEXT:    leal (%rsi,%rdi), %eax
+; CHECK-NEXT:    retq
+  %xy = or i32 %x, %y
+  %mx = and i32 %x, 8
+  %mxy = and i32 %xy, -11
+  %r = or i32 %mx, %mxy
+  ret i32 %r
+}
+
+define i64 @or_and_and_commute_i64(i64 %x, i64 %y) {
+; CHECK-LABEL: or_and_and_commute_i64:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    movq %rsi, %rax
+; CHECK-NEXT:    orq %rdi, %rax
+; CHECK-NEXT:    andl $8, %edi
+; CHECK-NEXT:    andq $-3, %rax
+; CHECK-NEXT:    orq %rdi, %rax
+; CHECK-NEXT:    retq
+  %xy = or i64 %x, %y
+  %mx = and i64 %x, 8
+  %mxy = and i64 %xy, -3
+  %r = or i64 %mxy, %mx
+  ret i64 %r
+}
+
+define <4 x i32> @or_and_and_v4i32(<4 x i32> %x, <4 x i32> %y) {
+; CHECK-LABEL: or_and_and_v4i32:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    orps %xmm0, %xmm1
+; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; CHECK-NEXT:    orps %xmm1, %xmm0
+; CHECK-NEXT:    retq
+  %xy = or <4 x i32> %x, %y
+  %mx = and <4 x i32> %x, <i32 2, i32 4, i32 8, i32 16>
+  %mxy = and <4 x i32> %xy, <i32 1, i32 -1, i32 -5, i32 -25>
+  %r = or <4 x i32> %mx, %mxy
+  ret <4 x i32> %r
+}
+
+define i32 @or_and_and_multiuse_i32(i32 %x, i32 %y) nounwind {
+; CHECK-LABEL: or_and_and_multiuse_i32:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pushq %rbx
+; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi
+; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
+; CHECK-NEXT:    orl %edi, %esi
+; CHECK-NEXT:    andl $8, %edi
+; CHECK-NEXT:    andl $-11, %esi
+; CHECK-NEXT:    leal (%rdi,%rsi), %ebx
+; CHECK-NEXT:    movl %esi, %edi
+; CHECK-NEXT:    callq use_i32 at PLT
+; CHECK-NEXT:    movl %ebx, %eax
+; CHECK-NEXT:    popq %rbx
+; CHECK-NEXT:    retq
+  %xy = or i32 %x, %y
+  %mx = and i32 %x, 8
+  %mxy = and i32 %xy, -11
+  %r = or i32 %mx, %mxy
+  call void @use_i32(i32 %mxy)
+  ret i32 %r
+}
+
+define i32 @or_and_multiuse_and_i32(i32 %x, i32 %y) nounwind {
+; CHECK-LABEL: or_and_multiuse_and_i32:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pushq %rbx
+; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi
+; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
+; CHECK-NEXT:    orl %edi, %esi
+; CHECK-NEXT:    andl $8, %edi
+; CHECK-NEXT:    andl $-11, %esi
+; CHECK-NEXT:    leal (%rsi,%rdi), %ebx
+; CHECK-NEXT:    # kill: def $edi killed $edi killed $rdi
+; CHECK-NEXT:    callq use_i32 at PLT
+; CHECK-NEXT:    movl %ebx, %eax
+; CHECK-NEXT:    popq %rbx
+; CHECK-NEXT:    retq
+  %xy = or i32 %x, %y
+  %mx = and i32 %x, 8
+  %mxy = and i32 %xy, -11
+  %r = or i32 %mx, %mxy
+  call void @use_i32(i32 %mx)
+  ret i32 %r
+}
+
+define i32 @or_and_multiuse_and_multiuse_i32(i32 %x, i32 %y) nounwind {
+; CHECK-LABEL: or_and_multiuse_and_multiuse_i32:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pushq %rbp
+; CHECK-NEXT:    pushq %rbx
+; CHECK-NEXT:    pushq %rax
+; CHECK-NEXT:    movl %esi, %ebx
+; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
+; CHECK-NEXT:    orl %edi, %ebx
+; CHECK-NEXT:    andl $8, %edi
+; CHECK-NEXT:    andl $-11, %ebx
+; CHECK-NEXT:    leal (%rdi,%rbx), %ebp
+; CHECK-NEXT:    # kill: def $edi killed $edi killed $rdi
+; CHECK-NEXT:    callq use_i32 at PLT
+; CHECK-NEXT:    movl %ebx, %edi
+; CHECK-NEXT:    callq use_i32 at PLT
+; CHECK-NEXT:    movl %ebp, %eax
+; CHECK-NEXT:    addq $8, %rsp
+; CHECK-NEXT:    popq %rbx
+; CHECK-NEXT:    popq %rbp
+; CHECK-NEXT:    retq
+  %xy = or i32 %x, %y
+  %mx = and i32 %x, 8
+  %mxy = and i32 %xy, -11
+  %r = or i32 %mx, %mxy
+  call void @use_i32(i32 %mx)
+  call void @use_i32(i32 %mxy)
+  ret i32 %r
+}
+
+declare void @use_i32(i32)


        


More information about the llvm-commits mailing list