@@ -117,3 +117,56 @@ define <2 x i32> @mask_one_bit_splat(<2 x i32> %x, <2 x i32>* %p) {
117
117
%r = call <2 x i32 > @llvm.ctpop.v2i32 (<2 x i32 > %a )
118
118
ret <2 x i32 > %r
119
119
}
120
+
121
+ define i32 @_parity_of_not (i32 %x ) {
122
+ ; CHECK-LABEL: @_parity_of_not(
123
+ ; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[X:%.*]], -1
124
+ ; CHECK-NEXT: [[CNT:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[NEG]]), !range [[RNG1:![0-9]+]]
125
+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[CNT]], 1
126
+ ; CHECK-NEXT: ret i32 [[R]]
127
+ ;
128
+ %neg = xor i32 %x , -1
129
+ %cnt = tail call i32 @llvm.ctpop.i32 (i32 %neg )
130
+ %r = and i32 %cnt , 1
131
+ ret i32 %r
132
+ }
133
+
134
+
135
+ define <2 x i32 > @_parity_of_not_vec (<2 x i32 > %x ) {
136
+ ; CHECK-LABEL: @_parity_of_not_vec(
137
+ ; CHECK-NEXT: [[NEG:%.*]] = xor <2 x i32> [[X:%.*]], <i32 -1, i32 -1>
138
+ ; CHECK-NEXT: [[CNT:%.*]] = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> [[NEG]])
139
+ ; CHECK-NEXT: [[R:%.*]] = and <2 x i32> [[CNT]], <i32 1, i32 1>
140
+ ; CHECK-NEXT: ret <2 x i32> [[R]]
141
+ ;
142
+ %neg = xor <2 x i32 > %x , <i32 -1 ,i32 -1 >
143
+ %cnt = tail call <2 x i32 > @llvm.ctpop.v2i32 (<2 x i32 > %neg )
144
+ %r = and <2 x i32 > %cnt , <i32 1 ,i32 1 >
145
+ ret <2 x i32 > %r
146
+ }
147
+
148
+ define <2 x i32 > @_parity_of_not_undef (<2 x i32 > %x ) {
149
+ ; CHECK-LABEL: @_parity_of_not_undef(
150
+ ; CHECK-NEXT: [[NEG:%.*]] = xor <2 x i32> [[X:%.*]], <i32 undef, i32 -1>
151
+ ; CHECK-NEXT: [[CNT:%.*]] = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> [[NEG]])
152
+ ; CHECK-NEXT: [[R:%.*]] = and <2 x i32> [[CNT]], <i32 1, i32 1>
153
+ ; CHECK-NEXT: ret <2 x i32> [[R]]
154
+ ;
155
+ %neg = xor <2 x i32 > %x , <i32 undef ,i32 -1 >
156
+ %cnt = tail call <2 x i32 > @llvm.ctpop.v2i32 (<2 x i32 > %neg )
157
+ %r = and <2 x i32 > %cnt , <i32 1 ,i32 1 >
158
+ ret <2 x i32 > %r
159
+ }
160
+
161
+ define <2 x i32 > @_parity_of_not_undef2 (<2 x i32 > %x ) {
162
+ ; CHECK-LABEL: @_parity_of_not_undef2(
163
+ ; CHECK-NEXT: [[NEG:%.*]] = xor <2 x i32> [[X:%.*]], <i32 -1, i32 -1>
164
+ ; CHECK-NEXT: [[CNT:%.*]] = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> [[NEG]])
165
+ ; CHECK-NEXT: [[R:%.*]] = and <2 x i32> [[CNT]], <i32 1, i32 undef>
166
+ ; CHECK-NEXT: ret <2 x i32> [[R]]
167
+ ;
168
+ %neg = xor <2 x i32 > %x , <i32 -1 ,i32 -1 >
169
+ %cnt = tail call <2 x i32 > @llvm.ctpop.v2i32 (<2 x i32 > %neg )
170
+ %r = and <2 x i32 > %cnt , <i32 1 ,i32 undef >
171
+ ret <2 x i32 > %r
172
+ }
0 commit comments