Skip to content

Commit f226852

Browse files
committed
[X86] Add test coverage to show failure to push freeze through ssubo/usubo nodes (+carry variants)
Test coverage to pull out the overflow handling from #145939
1 parent 338dee0 commit f226852

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

llvm/test/CodeGen/X86/freeze-binary.ll

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
865935
define void @pr59676_frozen(ptr %dst, i32 %x.orig) {
866936
; X86-LABEL: pr59676_frozen:
867937
; X86: # %bb.0:

0 commit comments

Comments
 (0)