@@ -822,3 +822,95 @@ neg_bb:
822
822
nonneg_bb:
823
823
ret i16 0
824
824
}
825
+
826
+ ; 'or' of 1 and operand with no lowest bit set is 'inc'
827
+ define i8 @negation_of_increment_via_or_with_no_common_bits_set (i8 %x , i8 %y ) {
828
+ ; CHECK-LABEL: @negation_of_increment_via_or_with_no_common_bits_set(
829
+ ; CHECK-NEXT: [[T0:%.*]] = shl i8 [[Y:%.*]], 1
830
+ ; CHECK-NEXT: [[T1:%.*]] = or i8 [[T0]], 1
831
+ ; CHECK-NEXT: [[T2:%.*]] = sub i8 [[X:%.*]], [[T1]]
832
+ ; CHECK-NEXT: ret i8 [[T2]]
833
+ ;
834
+ %t0 = shl i8 %y , 1
835
+ %t1 = or i8 %t0 , 1
836
+ %t2 = sub i8 %x , %t1
837
+ ret i8 %t2
838
+ }
839
+ define i8 @negation_of_increment_via_or_with_no_common_bits_set_extrause (i8 %x , i8 %y ) {
840
+ ; CHECK-LABEL: @negation_of_increment_via_or_with_no_common_bits_set_extrause(
841
+ ; CHECK-NEXT: [[T0:%.*]] = shl i8 [[Y:%.*]], 1
842
+ ; CHECK-NEXT: [[T1:%.*]] = or i8 [[T0]], 1
843
+ ; CHECK-NEXT: call void @use8(i8 [[T1]])
844
+ ; CHECK-NEXT: [[T2:%.*]] = sub i8 [[X:%.*]], [[T1]]
845
+ ; CHECK-NEXT: ret i8 [[T2]]
846
+ ;
847
+ %t0 = shl i8 %y , 1
848
+ %t1 = or i8 %t0 , 1
849
+ call void @use8 (i8 %t1 )
850
+ %t2 = sub i8 %x , %t1
851
+ ret i8 %t2
852
+ }
853
+ define i8 @negation_of_increment_via_or_common_bits_set (i8 %x , i8 %y ) {
854
+ ; CHECK-LABEL: @negation_of_increment_via_or_common_bits_set(
855
+ ; CHECK-NEXT: [[T0:%.*]] = shl i8 [[Y:%.*]], 1
856
+ ; CHECK-NEXT: [[T1:%.*]] = or i8 [[T0]], 3
857
+ ; CHECK-NEXT: [[T2:%.*]] = sub i8 [[X:%.*]], [[T1]]
858
+ ; CHECK-NEXT: ret i8 [[T2]]
859
+ ;
860
+ %t0 = shl i8 %y , 1
861
+ %t1 = or i8 %t0 , 3
862
+ %t2 = sub i8 %x , %t1
863
+ ret i8 %t2
864
+ }
865
+
866
+ ; 'or' of operands with no common bits set is 'add'
867
+ define i8 @add_via_or_with_no_common_bits_set (i8 %x , i8 %y ) {
868
+ ; CHECK-LABEL: @add_via_or_with_no_common_bits_set(
869
+ ; CHECK-NEXT: [[T0:%.*]] = sub i8 0, [[Y:%.*]]
870
+ ; CHECK-NEXT: call void @use8(i8 [[T0]])
871
+ ; CHECK-NEXT: [[T1:%.*]] = shl i8 [[T0]], 2
872
+ ; CHECK-NEXT: [[T2:%.*]] = or i8 [[T1]], 3
873
+ ; CHECK-NEXT: [[T3:%.*]] = sub i8 [[X:%.*]], [[T2]]
874
+ ; CHECK-NEXT: ret i8 [[T3]]
875
+ ;
876
+ %t0 = sub i8 0 , %y
877
+ call void @use8 (i8 %t0 )
878
+ %t1 = shl i8 %t0 , 2
879
+ %t2 = or i8 %t1 , 3
880
+ %t3 = sub i8 %x , %t2
881
+ ret i8 %t3
882
+ }
883
+ define i8 @add_via_or_with_common_bit_maybe_set (i8 %x , i8 %y ) {
884
+ ; CHECK-LABEL: @add_via_or_with_common_bit_maybe_set(
885
+ ; CHECK-NEXT: [[T0:%.*]] = sub i8 0, [[Y:%.*]]
886
+ ; CHECK-NEXT: call void @use8(i8 [[T0]])
887
+ ; CHECK-NEXT: [[T1:%.*]] = shl i8 [[T0]], 2
888
+ ; CHECK-NEXT: [[T2:%.*]] = or i8 [[T1]], 4
889
+ ; CHECK-NEXT: [[T3:%.*]] = sub i8 [[X:%.*]], [[T2]]
890
+ ; CHECK-NEXT: ret i8 [[T3]]
891
+ ;
892
+ %t0 = sub i8 0 , %y
893
+ call void @use8 (i8 %t0 )
894
+ %t1 = shl i8 %t0 , 2
895
+ %t2 = or i8 %t1 , 4
896
+ %t3 = sub i8 %x , %t2
897
+ ret i8 %t3
898
+ }
899
+ define i8 @add_via_or_with_no_common_bits_set_extrause (i8 %x , i8 %y ) {
900
+ ; CHECK-LABEL: @add_via_or_with_no_common_bits_set_extrause(
901
+ ; CHECK-NEXT: [[T0:%.*]] = sub i8 0, [[Y:%.*]]
902
+ ; CHECK-NEXT: call void @use8(i8 [[T0]])
903
+ ; CHECK-NEXT: [[T1:%.*]] = shl i8 [[T0]], 2
904
+ ; CHECK-NEXT: [[T2:%.*]] = or i8 [[T1]], 3
905
+ ; CHECK-NEXT: call void @use8(i8 [[T2]])
906
+ ; CHECK-NEXT: [[T3:%.*]] = sub i8 [[X:%.*]], [[T2]]
907
+ ; CHECK-NEXT: ret i8 [[T3]]
908
+ ;
909
+ %t0 = sub i8 0 , %y
910
+ call void @use8 (i8 %t0 )
911
+ %t1 = shl i8 %t0 , 2
912
+ %t2 = or i8 %t1 , 3
913
+ call void @use8 (i8 %t2 )
914
+ %t3 = sub i8 %x , %t2
915
+ ret i8 %t3
916
+ }
0 commit comments