Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / X86 / vec_no-common-bits.ll
blob192ec0336804f8b73c1e2e2a15a1d5025dc8b7fa
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK
4 ; In the following patterns, lhs and rhs of the or instruction have no common bits.
5 ; Therefore, "add" and "or" instructions are equal.
7 define <2 x i32> @or_and_and_rhs_neg_vec_i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> %z) {
8 ; CHECK-LABEL: or_and_and_rhs_neg_vec_i32:
9 ; CHECK:       # %bb.0:
10 ; CHECK-NEXT:    xorps %xmm0, %xmm0
11 ; CHECK-NEXT:    retq
12   %and1 = and <2 x i32> %z, %y
13   %xor = xor <2 x i32> %y, <i32 -1, i32 -1>
14   %and2 = and <2 x i32> %x, %xor
15   %or = or <2 x i32> %and1, %and2
16   %add = add <2 x i32> %and1, %and2
17   %sub = sub <2 x i32> %or, %add
18   ret <2 x i32> %sub
21 define <2 x i32> @or_and_and_lhs_neg_vec_i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> %z) {
22 ; CHECK-LABEL: or_and_and_lhs_neg_vec_i32:
23 ; CHECK:       # %bb.0:
24 ; CHECK-NEXT:    xorps %xmm0, %xmm0
25 ; CHECK-NEXT:    retq
26   %and1 = and <2 x i32> %z, %y
27   %xor = xor <2 x i32> %y, <i32 -1, i32 -1>
28   %and2 = and <2 x i32> %xor, %x
29   %or = or <2 x i32> %and1, %and2
30   %add = add <2 x i32> %and1, %and2
31   %sub = sub <2 x i32> %or, %add
32   ret <2 x i32> %sub
35 define <2 x i32> @or_and_rhs_neg_and_vec_i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> %z) {
36 ; CHECK-LABEL: or_and_rhs_neg_and_vec_i32:
37 ; CHECK:       # %bb.0:
38 ; CHECK-NEXT:    xorps %xmm0, %xmm0
39 ; CHECK-NEXT:    retq
40   %xor = xor <2 x i32> %y, <i32 -1, i32 -1>
41   %and1 = and <2 x i32> %z, %xor
42   %and2 = and <2 x i32> %x, %y
43   %or = or <2 x i32> %and1, %and2
44   %add = add <2 x i32> %and1, %and2
45   %sub = sub <2 x i32> %or, %add
46   ret <2 x i32> %sub
49 define <2 x i32> @or_and_lhs_neg_and_vec_i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> %z) {
50 ; CHECK-LABEL: or_and_lhs_neg_and_vec_i32:
51 ; CHECK:       # %bb.0:
52 ; CHECK-NEXT:    xorps %xmm0, %xmm0
53 ; CHECK-NEXT:    retq
54   %xor = xor <2 x i32> %y, <i32 -1, i32 -1>
55   %and1 = and <2 x i32> %xor, %z
56   %and2 = and <2 x i32> %x, %y
57   %or = or <2 x i32> %and1, %and2
58   %add = add <2 x i32> %and1, %and2
59   %sub = sub <2 x i32> %or, %add
60   ret <2 x i32> %sub
63 define <2 x i64> @or_and_and_rhs_neg_vec_i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %z) {
64 ; CHECK-LABEL: or_and_and_rhs_neg_vec_i64:
65 ; CHECK:       # %bb.0:
66 ; CHECK-NEXT:    xorps %xmm0, %xmm0
67 ; CHECK-NEXT:    retq
68   %and1 = and <2 x i64> %z, %y
69   %xor = xor <2 x i64> %y, <i64 -1, i64 -1>
70   %and2 = and <2 x i64> %x, %xor
71   %or = or <2 x i64> %and1, %and2
72   %add = add <2 x i64> %and1, %and2
73   %sub = sub <2 x i64> %or, %add
74   ret <2 x i64> %sub
77 define <2 x i64> @or_and_and_lhs_neg_vec_i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %z) {
78 ; CHECK-LABEL: or_and_and_lhs_neg_vec_i64:
79 ; CHECK:       # %bb.0:
80 ; CHECK-NEXT:    xorps %xmm0, %xmm0
81 ; CHECK-NEXT:    retq
82   %and1 = and <2 x i64> %z, %y
83   %xor = xor <2 x i64> %y, <i64 -1, i64 -1>
84   %and2 = and <2 x i64> %xor, %x
85   %or = or <2 x i64> %and1, %and2
86   %add = add <2 x i64> %and1, %and2
87   %sub = sub <2 x i64> %or, %add
88   ret <2 x i64> %sub
91 define <2 x i64> @or_and_rhs_neg_and_vec_i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %z) {
92 ; CHECK-LABEL: or_and_rhs_neg_and_vec_i64:
93 ; CHECK:       # %bb.0:
94 ; CHECK-NEXT:    xorps %xmm0, %xmm0
95 ; CHECK-NEXT:    retq
96   %xor = xor <2 x i64> %y, <i64 -1, i64 -1>
97   %and1 = and <2 x i64> %z, %xor
98   %and2 = and <2 x i64> %x, %y
99   %or = or <2 x i64> %and1, %and2
100   %add = add <2 x i64> %and1, %and2
101   %sub = sub <2 x i64> %or, %add
102   ret <2 x i64> %sub
105 define <2 x i64> @or_and_lhs_neg_and_vec_i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %z) {
106 ; CHECK-LABEL: or_and_lhs_neg_and_vec_i64:
107 ; CHECK:       # %bb.0:
108 ; CHECK-NEXT:    xorps %xmm0, %xmm0
109 ; CHECK-NEXT:    retq
110   %xor = xor <2 x i64> %y, <i64 -1, i64 -1>
111   %and1 = and <2 x i64> %xor, %z
112   %and2 = and <2 x i64> %x, %y
113   %or = or <2 x i64> %and1, %and2
114   %add = add <2 x i64> %and1, %and2
115   %sub = sub <2 x i64> %or, %add
116   ret <2 x i64> %sub