@@ -862,6 +862,76 @@ define i32 @freeze_uaddo(i32 %a0, i32 %a1, i8 %a2, i8 %a3) nounwind {
862
862
ret i32 %r
863
863
}
864
864
865
+ define i32 @freeze_ssubo (i32 %a0 , i32 %a1 , i8 %a2 , i8 %a3 ) nounwind {
866
+ ; X86-LABEL: freeze_ssubo:
867
+ ; X86: # %bb.0:
868
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
869
+ ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx
870
+ ; X86-NEXT: xorl %ecx, %ecx
871
+ ; X86-NEXT: addb {{[0-9]+}}(%esp), %dl
872
+ ; X86-NEXT: setb %cl
873
+ ; X86-NEXT: andl $1, %ecx
874
+ ; X86-NEXT: subl %ecx, %eax
875
+ ; X86-NEXT: subl {{[0-9]+}}(%esp), %eax
876
+ ; X86-NEXT: retl
877
+ ;
878
+ ; X64-LABEL: freeze_ssubo:
879
+ ; X64: # %bb.0:
880
+ ; X64-NEXT: movl %edi, %eax
881
+ ; X64-NEXT: xorl %edi, %edi
882
+ ; X64-NEXT: addb %cl, %dl
883
+ ; X64-NEXT: setb %dil
884
+ ; X64-NEXT: andl $1, %edi
885
+ ; X64-NEXT: subl %edi, %eax
886
+ ; X64-NEXT: subl %esi, %eax
887
+ ; X64-NEXT: retq
888
+ %b = call {i8 , i1 } @llvm.uadd.with.overflow.i8 (i8 %a2 , i8 %a3 )
889
+ %b.o = extractvalue {i8 , i1 } %b , 1
890
+ %x = zext i1 %b.o to i32
891
+
892
+ %f0 = freeze i32 %a0
893
+ %o = call {i32 , i1 } @llvm.ssub.with.overflow.i32 (i32 %f0 , i32 %x )
894
+ %f = freeze {i32 , i1 } %o
895
+ %v = extractvalue {i32 , i1 } %f , 0
896
+ %r = sub i32 %v , %a1
897
+ ret i32 %r
898
+ }
899
+
900
+ define i32 @freeze_usubo (i32 %a0 , i32 %a1 , i8 %a2 , i8 %a3 ) nounwind {
901
+ ; X86-LABEL: freeze_usubo:
902
+ ; X86: # %bb.0:
903
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
904
+ ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx
905
+ ; X86-NEXT: xorl %ecx, %ecx
906
+ ; X86-NEXT: addb {{[0-9]+}}(%esp), %dl
907
+ ; X86-NEXT: setb %cl
908
+ ; X86-NEXT: andl $1, %ecx
909
+ ; X86-NEXT: subl %ecx, %eax
910
+ ; X86-NEXT: subl {{[0-9]+}}(%esp), %eax
911
+ ; X86-NEXT: retl
912
+ ;
913
+ ; X64-LABEL: freeze_usubo:
914
+ ; X64: # %bb.0:
915
+ ; X64-NEXT: movl %edi, %eax
916
+ ; X64-NEXT: xorl %edi, %edi
917
+ ; X64-NEXT: addb %cl, %dl
918
+ ; X64-NEXT: setb %dil
919
+ ; X64-NEXT: andl $1, %edi
920
+ ; X64-NEXT: subl %edi, %eax
921
+ ; X64-NEXT: subl %esi, %eax
922
+ ; X64-NEXT: retq
923
+ %b = call {i8 , i1 } @llvm.uadd.with.overflow.i8 (i8 %a2 , i8 %a3 )
924
+ %b.o = extractvalue {i8 , i1 } %b , 1
925
+ %x = zext i1 %b.o to i32
926
+
927
+ %f0 = freeze i32 %a0
928
+ %o = call {i32 , i1 } @llvm.usub.with.overflow.i32 (i32 %f0 , i32 %x )
929
+ %f = freeze {i32 , i1 } %o
930
+ %v = extractvalue {i32 , i1 } %f , 0
931
+ %r = sub i32 %v , %a1
932
+ ret i32 %r
933
+ }
934
+
865
935
define void @pr59676_frozen (ptr %dst , i32 %x.orig ) {
866
936
; X86-LABEL: pr59676_frozen:
867
937
; X86: # %bb.0:
0 commit comments