@@ -1171,3 +1171,77 @@ define i8 @not_ashr_wrong_const(i8 %x) {
1171
1171
%r = xor i8 %a , -2
1172
1172
ret i8 %r
1173
1173
}
1174
+
1175
+ ; (~A & B) ^ A --> (A | B)
1176
+ ; The division ops are here to thwart complexity-based canonicalization: all ops are binops.
1177
+
1178
+ define i32 @test52 (i32 %p1 , i32 %p2 ) {
1179
+ ; CHECK-LABEL: @test52(
1180
+ ; CHECK-NEXT: [[A:%.*]] = udiv i32 42, [[P1:%.*]]
1181
+ ; CHECK-NEXT: [[B:%.*]] = udiv i32 42, [[P2:%.*]]
1182
+ ; CHECK-NEXT: [[O:%.*]] = xor i32 [[A]], -1
1183
+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[B]], [[O]]
1184
+ ; CHECK-NEXT: [[Z:%.*]] = xor i32 [[R]], [[A]]
1185
+ ; CHECK-NEXT: ret i32 [[Z]]
1186
+ ;
1187
+ %a = udiv i32 42 , %p1
1188
+ %b = udiv i32 42 , %p2
1189
+ %o = xor i32 %a , -1
1190
+ %r = and i32 %o , %b
1191
+ %z = xor i32 %r , %a
1192
+ ret i32 %z
1193
+ }
1194
+
1195
+ ; (~B & A) ^ B --> (A | B)
1196
+ ; The division ops are here to thwart complexity-based canonicalization: all ops are binops.
1197
+
1198
+ define i32 @test53 (i32 %p1 , i32 %p2 ) {
1199
+ ; CHECK-LABEL: @test53(
1200
+ ; CHECK-NEXT: [[A:%.*]] = udiv i32 42, [[P1:%.*]]
1201
+ ; CHECK-NEXT: [[B:%.*]] = udiv i32 42, [[P2:%.*]]
1202
+ ; CHECK-NEXT: [[O:%.*]] = xor i32 [[B]], -1
1203
+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[A]], [[O]]
1204
+ ; CHECK-NEXT: [[Z:%.*]] = xor i32 [[R]], [[B]]
1205
+ ; CHECK-NEXT: ret i32 [[Z]]
1206
+ ;
1207
+ %a = udiv i32 42 , %p1
1208
+ %b = udiv i32 42 , %p2
1209
+ %o = xor i32 %b , -1
1210
+ %r = and i32 %o , %a
1211
+ %z = xor i32 %r , %b
1212
+ ret i32 %z
1213
+ }
1214
+
1215
+ define i32 @test54 (i32 %p1 , i32 %p2 ) {
1216
+ ; CHECK-LABEL: @test54(
1217
+ ; CHECK-NEXT: [[A:%.*]] = udiv i32 42, [[P1:%.*]]
1218
+ ; CHECK-NEXT: [[B:%.*]] = udiv i32 42, [[P2:%.*]]
1219
+ ; CHECK-NEXT: [[O:%.*]] = xor i32 [[A]], -1
1220
+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[B]], [[O]]
1221
+ ; CHECK-NEXT: [[Z:%.*]] = xor i32 [[R]], [[A]]
1222
+ ; CHECK-NEXT: ret i32 [[Z]]
1223
+ ;
1224
+ %a = udiv i32 42 , %p1
1225
+ %b = udiv i32 42 , %p2
1226
+ %o = xor i32 %a , -1
1227
+ %r = and i32 %b , %o
1228
+ %z = xor i32 %r , %a
1229
+ ret i32 %z
1230
+ }
1231
+
1232
+ define i32 @test55 (i32 %p1 , i32 %p2 ) {
1233
+ ; CHECK-LABEL: @test55(
1234
+ ; CHECK-NEXT: [[A:%.*]] = udiv i32 42, [[P1:%.*]]
1235
+ ; CHECK-NEXT: [[B:%.*]] = udiv i32 42, [[P2:%.*]]
1236
+ ; CHECK-NEXT: [[O:%.*]] = xor i32 [[A]], -1
1237
+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[B]], [[O]]
1238
+ ; CHECK-NEXT: [[Z:%.*]] = xor i32 [[A]], [[R]]
1239
+ ; CHECK-NEXT: ret i32 [[Z]]
1240
+ ;
1241
+ %a = udiv i32 42 , %p1
1242
+ %b = udiv i32 42 , %p2
1243
+ %o = xor i32 %a , -1
1244
+ %r = and i32 %o , %b
1245
+ %z = xor i32 %a , %r
1246
+ ret i32 %z
1247
+ }
0 commit comments