@@ -862,6 +862,76 @@ define i32 @freeze_uaddo(i32 %a0, i32 %a1, i8 %a2, i8 %a3) nounwind {
862862 ret i32 %r
863863}
864864
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+
865935define void @pr59676_frozen (ptr %dst , i32 %x.orig ) {
866936; X86-LABEL: pr59676_frozen:
867937; X86: # %bb.0:
0 commit comments