@@ -88,7 +88,7 @@ define i1 @cmpeq_xor_cst1_commuted(i32 %a, i32 %b) {
88
88
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP1]], 10
89
89
; CHECK-NEXT: ret i1 [[CMP]]
90
90
;
91
- %b2 = mul i32 %b , %b ; thwart complexity-based canonicalization
91
+ %b2 = mul i32 %b , %b ; thwart complexity-based canonicalization
92
92
%c = xor i32 %a , 10
93
93
%cmp = icmp eq i32 %b2 , %c
94
94
ret i1 %cmp
@@ -145,3 +145,43 @@ entry:
145
145
%cmp = icmp ne <2 x i8 > %xor , <i8 9 , i8 79 >
146
146
ret <2 x i1 > %cmp
147
147
}
148
+
149
+ declare void @use.i8 (i8 )
150
+ define i1 @fold_xorC_eq0_multiuse (i8 %x , i8 %y ) {
151
+ ; CHECK-LABEL: @fold_xorC_eq0_multiuse(
152
+ ; CHECK-NEXT: [[XX:%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
153
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XX]], 0
154
+ ; CHECK-NEXT: call void @use.i8(i8 [[XX]])
155
+ ; CHECK-NEXT: ret i1 [[R]]
156
+ ;
157
+ %xx = xor i8 %x , %y
158
+ %r = icmp eq i8 %xx , 0
159
+ call void @use.i8 (i8 %xx )
160
+ ret i1 %r
161
+ }
162
+
163
+ define i1 @fold_xorC_eq1_multiuse_fail (i8 %x , i8 %y ) {
164
+ ; CHECK-LABEL: @fold_xorC_eq1_multiuse_fail(
165
+ ; CHECK-NEXT: [[XX:%.*]] = xor i8 [[X:%.*]], [[Y:%.*]]
166
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XX]], 1
167
+ ; CHECK-NEXT: call void @use.i8(i8 [[XX]])
168
+ ; CHECK-NEXT: ret i1 [[R]]
169
+ ;
170
+ %xx = xor i8 %x , %y
171
+ %r = icmp eq i8 %xx , 1
172
+ call void @use.i8 (i8 %xx )
173
+ ret i1 %r
174
+ }
175
+
176
+ define i1 @fold_xorC_neC_multiuse (i8 %x ) {
177
+ ; CHECK-LABEL: @fold_xorC_neC_multiuse(
178
+ ; CHECK-NEXT: [[XX:%.*]] = xor i8 [[X:%.*]], 45
179
+ ; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[XX]], 67
180
+ ; CHECK-NEXT: call void @use.i8(i8 [[XX]])
181
+ ; CHECK-NEXT: ret i1 [[R]]
182
+ ;
183
+ %xx = xor i8 %x , 45
184
+ %r = icmp ne i8 %xx , 67
185
+ call void @use.i8 (i8 %xx )
186
+ ret i1 %r
187
+ }
0 commit comments