@@ -802,6 +802,66 @@ define i32 @freeze_fshr(i32 %a0, i32 %a1, i32 %a2) nounwind {
802802 ret i32 %z
803803}
804804
805+ define i32 @freeze_saddo (i32 %a0 , i32 %a1 , i8 %a2 , i8 %a3 ) nounwind {
806+ ; X86-LABEL: freeze_saddo:
807+ ; X86: # %bb.0:
808+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
809+ ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
810+ ; X86-NEXT: addb {{[0-9]+}}(%esp), %cl
811+ ; X86-NEXT: adcl $0, %eax
812+ ; X86-NEXT: addl {{[0-9]+}}(%esp), %eax
813+ ; X86-NEXT: retl
814+ ;
815+ ; X64-LABEL: freeze_saddo:
816+ ; X64: # %bb.0:
817+ ; X64-NEXT: # kill: def $esi killed $esi def $rsi
818+ ; X64-NEXT: # kill: def $edi killed $edi def $rdi
819+ ; X64-NEXT: addb %cl, %dl
820+ ; X64-NEXT: adcl $0, %edi
821+ ; X64-NEXT: leal (%rdi,%rsi), %eax
822+ ; X64-NEXT: retq
823+ %b = call {i8 , i1 } @llvm.uadd.with.overflow.i8 (i8 %a2 , i8 %a3 )
824+ %b.o = extractvalue {i8 , i1 } %b , 1
825+ %x = zext i1 %b.o to i32
826+
827+ %f0 = freeze i32 %a0
828+ %o = call {i32 , i1 } @llvm.sadd.with.overflow.i32 (i32 %f0 , i32 %x )
829+ %f = freeze {i32 , i1 } %o
830+ %v = extractvalue {i32 , i1 } %f , 0
831+ %r = add i32 %v , %a1
832+ ret i32 %r
833+ }
834+
835+ define i32 @freeze_uaddo (i32 %a0 , i32 %a1 , i8 %a2 , i8 %a3 ) nounwind {
836+ ; X86-LABEL: freeze_uaddo:
837+ ; X86: # %bb.0:
838+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
839+ ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
840+ ; X86-NEXT: addb {{[0-9]+}}(%esp), %cl
841+ ; X86-NEXT: adcl $0, %eax
842+ ; X86-NEXT: addl {{[0-9]+}}(%esp), %eax
843+ ; X86-NEXT: retl
844+ ;
845+ ; X64-LABEL: freeze_uaddo:
846+ ; X64: # %bb.0:
847+ ; X64-NEXT: # kill: def $esi killed $esi def $rsi
848+ ; X64-NEXT: # kill: def $edi killed $edi def $rdi
849+ ; X64-NEXT: addb %cl, %dl
850+ ; X64-NEXT: adcl $0, %edi
851+ ; X64-NEXT: leal (%rdi,%rsi), %eax
852+ ; X64-NEXT: retq
853+ %b = call {i8 , i1 } @llvm.uadd.with.overflow.i8 (i8 %a2 , i8 %a3 )
854+ %b.o = extractvalue {i8 , i1 } %b , 1
855+ %x = zext i1 %b.o to i32
856+
857+ %f0 = freeze i32 %a0
858+ %o = call {i32 , i1 } @llvm.uadd.with.overflow.i32 (i32 %f0 , i32 %x )
859+ %f = freeze {i32 , i1 } %o
860+ %v = extractvalue {i32 , i1 } %f , 0
861+ %r = add i32 %v , %a1
862+ ret i32 %r
863+ }
864+
805865define void @pr59676_frozen (ptr %dst , i32 %x.orig ) {
806866; X86-LABEL: pr59676_frozen:
807867; X86: # %bb.0:
0 commit comments