@@ -66,6 +66,22 @@ define i1 @icmp_xor_v4i32(<4 x i32> %a) {
66
66
ret i1 %r
67
67
}
68
68
69
+ define i1 @icmp_samesign_xor_v4i32 (<4 x i32 > %a ) {
70
+ ; CHECK-LABEL: @icmp_samesign_xor_v4i32(
71
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt <4 x i32> [[A:%.*]], <i32 poison, i32 -8, i32 poison, i32 42>
72
+ ; CHECK-NEXT: [[SHIFT:%.*]] = shufflevector <4 x i1> [[TMP1]], <4 x i1> poison, <4 x i32> <i32 poison, i32 3, i32 poison, i32 poison>
73
+ ; CHECK-NEXT: [[TMP2:%.*]] = xor <4 x i1> [[SHIFT]], [[TMP1]]
74
+ ; CHECK-NEXT: [[R:%.*]] = extractelement <4 x i1> [[TMP2]], i64 1
75
+ ; CHECK-NEXT: ret i1 [[R]]
76
+ ;
77
+ %e1 = extractelement <4 x i32 > %a , i32 3
78
+ %e2 = extractelement <4 x i32 > %a , i32 1
79
+ %cmp1 = icmp samesign ugt i32 %e1 , 42
80
+ %cmp2 = icmp sgt i32 %e2 , -8
81
+ %r = xor i1 %cmp1 , %cmp2
82
+ ret i1 %r
83
+ }
84
+
69
85
; add is not canonical (should be xor), but that is ok.
70
86
71
87
define i1 @icmp_add_v8i32 (<8 x i32 > %a ) {
@@ -146,6 +162,27 @@ define i1 @icmp_xor_v4i32_multiuse(<4 x i32> %a) {
146
162
ret i1 %r
147
163
}
148
164
165
+ define i1 @icmp_samesign_xor_v4i32_multiuse (<4 x i32 > %a ) {
166
+ ; CHECK-LABEL: @icmp_samesign_xor_v4i32_multiuse(
167
+ ; CHECK-NEXT: [[E2:%.*]] = extractelement <4 x i32> [[A:%.*]], i32 1
168
+ ; CHECK-NEXT: call void @use(i32 [[E2]])
169
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt <4 x i32> [[A]], <i32 poison, i32 -8, i32 poison, i32 42>
170
+ ; CHECK-NEXT: [[SHIFT:%.*]] = shufflevector <4 x i1> [[TMP1]], <4 x i1> poison, <4 x i32> <i32 poison, i32 3, i32 poison, i32 poison>
171
+ ; CHECK-NEXT: [[TMP2:%.*]] = xor <4 x i1> [[SHIFT]], [[TMP1]]
172
+ ; CHECK-NEXT: [[R:%.*]] = extractelement <4 x i1> [[TMP2]], i64 1
173
+ ; CHECK-NEXT: call void @use(i1 [[R]])
174
+ ; CHECK-NEXT: ret i1 [[R]]
175
+ ;
176
+ %e1 = extractelement <4 x i32 > %a , i32 3
177
+ %e2 = extractelement <4 x i32 > %a , i32 1
178
+ call void @use (i32 %e2 )
179
+ %cmp1 = icmp sgt i32 %e1 , 42
180
+ %cmp2 = icmp samesign ugt i32 %e2 , -8
181
+ %r = xor i1 %cmp1 , %cmp2
182
+ call void @use (i1 %r )
183
+ ret i1 %r
184
+ }
185
+
149
186
; Negative test - this could CSE/simplify.
150
187
151
188
define i1 @same_extract_index (<4 x i32 > %a ) {
0 commit comments