@@ -451,29 +451,53 @@ define i32 @and_or_not_or8(i32 %A, i32 %B) {
451
451
define i69 @or_or_xor (i69 %A , i69 %B ) {
452
452
; CHECK-LABEL: @or_or_xor(
453
453
; CHECK-NEXT: [[I1:%.*]] = or i69 [[A:%.*]], [[B:%.*]]
454
- ; CHECK-NEXT: [[I2:%.*]] = xor i69 [[A]], [[B]]
455
- ; CHECK-NEXT: [[I3:%.*]] = or i69 [[I1]], [[I2]]
456
- ; CHECK-NEXT: ret i69 [[I3]]
454
+ ; CHECK-NEXT: ret i69 [[I1]]
457
455
;
458
456
%i1 = or i69 %A , %B
459
457
%i2 = xor i69 %A , %B
460
458
%i3 = or i69 %i1 , %i2
461
459
ret i69 %i3
462
460
}
463
461
462
+ ; (B | A) | (A ^ B) --> B | A
463
+
464
+ define i8 @or_or_xor_inner_or_commuted (i8 %A , i8 %B ) {
465
+ ; CHECK-LABEL: @or_or_xor_inner_or_commuted(
466
+ ; CHECK-NEXT: [[I1:%.*]] = or i8 [[B:%.*]], [[A:%.*]]
467
+ ; CHECK-NEXT: ret i8 [[I1]]
468
+ ;
469
+ %i1 = or i8 %B , %A
470
+ %i2 = xor i8 %A , %B
471
+ %i3 = or i8 %i1 , %i2
472
+ ret i8 %i3
473
+ }
474
+
475
+ ; (A ^ B) | (A | B) --> A | B
476
+
464
477
define <4 x i4 > @or_or_xor_commuted (<4 x i4 > %A , <4 x i4 > %B ) {
465
478
; CHECK-LABEL: @or_or_xor_commuted(
466
479
; CHECK-NEXT: [[I1:%.*]] = or <4 x i4> [[A:%.*]], [[B:%.*]]
467
- ; CHECK-NEXT: [[I2:%.*]] = xor <4 x i4> [[A]], [[B]]
468
- ; CHECK-NEXT: [[I3:%.*]] = or <4 x i4> [[I2]], [[I1]]
469
- ; CHECK-NEXT: ret <4 x i4> [[I3]]
480
+ ; CHECK-NEXT: ret <4 x i4> [[I1]]
470
481
;
471
482
%i1 = or <4 x i4 > %A , %B
472
483
%i2 = xor <4 x i4 > %A , %B
473
484
%i3 = or <4 x i4 > %i2 , %i1
474
485
ret <4 x i4 > %i3
475
486
}
476
487
488
+ ; (A ^ B) | (B | A) --> B | A
489
+
490
+ define i4 @or_or_xor_inner_or_outer_or_commuted (i4 %A , i4 %B ) {
491
+ ; CHECK-LABEL: @or_or_xor_inner_or_outer_or_commuted(
492
+ ; CHECK-NEXT: [[I1:%.*]] = or i4 [[B:%.*]], [[A:%.*]]
493
+ ; CHECK-NEXT: ret i4 [[I1]]
494
+ ;
495
+ %i1 = or i4 %B , %A
496
+ %i2 = xor i4 %A , %B
497
+ %i3 = or i4 %i2 , %i1
498
+ ret i4 %i3
499
+ }
500
+
477
501
define i32 @shifted_all_ones (i32 %shamt ) {
478
502
; CHECK-LABEL: @shifted_all_ones(
479
503
; CHECK-NEXT: ret i32 -1
0 commit comments