Skip to content

Commit 9cadc4e

Browse files
Temperz87Temperz87RKSimon
authored
[DAG] SelectionDAG::canCreateUndefOrPoison - add ISD::SCMP/UCMP handling + tests (#154127)
This pr aims to resolve #152144 In SelectionDAG::canCreateUndefOrPoison the ISD::SCMP/UCMP cases are added to always return false as they cannot generate poison or undef The `freeze-binary.ll` file is now testing the SCMP/UCMP cases --------- Co-authored-by: Temperz87 <= temperz871@gmail.com> Co-authored-by: Simon Pilgrim <llvm-dev@redking.me.uk>
1 parent a1039c1 commit 9cadc4e

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5664,8 +5664,10 @@ bool SelectionDAG::canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts,
56645664
case ISD::ABDS:
56655665
case ISD::SMIN:
56665666
case ISD::SMAX:
5667+
case ISD::SCMP:
56675668
case ISD::UMIN:
56685669
case ISD::UMAX:
5670+
case ISD::UCMP:
56695671
case ISD::AND:
56705672
case ISD::XOR:
56715673
case ISD::ROTL:

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

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,76 @@ define i32 @freeze_usubo(i32 %a0, i32 %a1, i8 %a2, i8 %a3) nounwind {
924924
ret i32 %r
925925
}
926926

927+
define i32 @freeze_scmp(i32 %a0) nounwind {
928+
; X86-LABEL: freeze_scmp:
929+
; X86: # %bb.0:
930+
; X86-NEXT: movl $2, %eax
931+
; X86-NEXT: cmpl {{[0-9]+}}(%esp), %eax
932+
; X86-NEXT: setl %al
933+
; X86-NEXT: setg %cl
934+
; X86-NEXT: subb %al, %cl
935+
; X86-NEXT: movsbl %cl, %eax
936+
; X86-NEXT: negl %eax
937+
; X86-NEXT: setl %al
938+
; X86-NEXT: setg %cl
939+
; X86-NEXT: subb %al, %cl
940+
; X86-NEXT: movsbl %cl, %eax
941+
; X86-NEXT: retl
942+
;
943+
; X64-LABEL: freeze_scmp:
944+
; X64: # %bb.0:
945+
; X64-NEXT: movl $2, %eax
946+
; X64-NEXT: cmpl %edi, %eax
947+
; X64-NEXT: setl %al
948+
; X64-NEXT: setg %cl
949+
; X64-NEXT: subb %al, %cl
950+
; X64-NEXT: movsbl %cl, %eax
951+
; X64-NEXT: negl %eax
952+
; X64-NEXT: setl %al
953+
; X64-NEXT: setg %cl
954+
; X64-NEXT: subb %al, %cl
955+
; X64-NEXT: movsbl %cl, %eax
956+
; X64-NEXT: retq
957+
%x = call i32 @llvm.scmp.i32(i32 2, i32 %a0)
958+
%y = freeze i32 %x
959+
%z = call i32 @llvm.scmp.i32(i32 0, i32 %y)
960+
ret i32 %z
961+
}
962+
963+
define i32 @freeze_ucmp(i32 %a0) nounwind {
964+
; X86-LABEL: freeze_ucmp:
965+
; X86: # %bb.0:
966+
; X86-NEXT: movl $2, %eax
967+
; X86-NEXT: cmpl {{[0-9]+}}(%esp), %eax
968+
; X86-NEXT: seta %al
969+
; X86-NEXT: sbbb $0, %al
970+
; X86-NEXT: movsbl %al, %eax
971+
; X86-NEXT: cmpl $2, %eax
972+
; X86-NEXT: setae %cl
973+
; X86-NEXT: cmpl $1, %eax
974+
; X86-NEXT: sbbb $0, %cl
975+
; X86-NEXT: movsbl %cl, %eax
976+
; X86-NEXT: retl
977+
;
978+
; X64-LABEL: freeze_ucmp:
979+
; X64: # %bb.0:
980+
; X64-NEXT: movl $2, %eax
981+
; X64-NEXT: cmpl %edi, %eax
982+
; X64-NEXT: seta %al
983+
; X64-NEXT: sbbb $0, %al
984+
; X64-NEXT: movsbl %al, %eax
985+
; X64-NEXT: cmpl $2, %eax
986+
; X64-NEXT: setae %cl
987+
; X64-NEXT: cmpl $1, %eax
988+
; X64-NEXT: sbbb $0, %cl
989+
; X64-NEXT: movsbl %cl, %eax
990+
; X64-NEXT: retq
991+
%x = call i32 @llvm.ucmp.i32(i32 2, i32 %a0)
992+
%y = freeze i32 %x
993+
%z = call i32 @llvm.ucmp.i32(i32 %y, i32 1)
994+
ret i32 %z
995+
}
996+
927997
define void @pr59676_frozen(ptr %dst, i32 %x.orig) {
928998
; X86-LABEL: pr59676_frozen:
929999
; X86: # %bb.0:

0 commit comments

Comments
 (0)