Skip to content

Commit db843e5

Browse files
authored
[DAG] Add ISD::FP_TO_SINT_SAT/FP_TO_UINT_SAT handling to SelectionDAG::canCreateUndefOrPoison (llvm#154244)
Related to llvm#153366
1 parent 1eb5b18 commit db843e5

File tree

3 files changed

+85
-0
lines changed

3 files changed

+85
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5748,6 +5748,8 @@ bool SelectionDAG::canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts,
57485748
case ISD::FMA:
57495749
case ISD::FMAD:
57505750
case ISD::FP_EXTEND:
5751+
case ISD::FP_TO_SINT_SAT:
5752+
case ISD::FP_TO_UINT_SAT:
57515753
// No poison except from flags (which is handled above)
57525754
return false;
57535755

llvm/test/CodeGen/X86/fptosi-sat-vector-128.ll

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,52 @@ define <4 x i1> @test_signed_v4i1_v4f32(<4 x float> %f) nounwind {
5757
ret <4 x i1> %x
5858
}
5959

60+
define <4 x i1> @test_freeze_signed_v4i1_v4f32(<4 x float> %f) nounwind {
61+
; CHECK-LABEL: test_freeze_signed_v4i1_v4f32:
62+
; CHECK: # %bb.0:
63+
; CHECK-NEXT: movaps %xmm0, %xmm1
64+
; CHECK-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3],xmm0[3,3]
65+
; CHECK-NEXT: movss {{.*#+}} xmm2 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]
66+
; CHECK-NEXT: xorl %eax, %eax
67+
; CHECK-NEXT: ucomiss %xmm1, %xmm1
68+
; CHECK-NEXT: maxss %xmm2, %xmm1
69+
; CHECK-NEXT: xorps %xmm3, %xmm3
70+
; CHECK-NEXT: minss %xmm3, %xmm1
71+
; CHECK-NEXT: cvttss2si %xmm1, %ecx
72+
; CHECK-NEXT: cmovpl %eax, %ecx
73+
; CHECK-NEXT: movd %ecx, %xmm1
74+
; CHECK-NEXT: movaps %xmm0, %xmm4
75+
; CHECK-NEXT: unpckhpd {{.*#+}} xmm4 = xmm4[1],xmm0[1]
76+
; CHECK-NEXT: ucomiss %xmm4, %xmm4
77+
; CHECK-NEXT: maxss %xmm2, %xmm4
78+
; CHECK-NEXT: minss %xmm3, %xmm4
79+
; CHECK-NEXT: cvttss2si %xmm4, %ecx
80+
; CHECK-NEXT: cmovpl %eax, %ecx
81+
; CHECK-NEXT: movd %ecx, %xmm4
82+
; CHECK-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
83+
; CHECK-NEXT: movaps %xmm0, %xmm1
84+
; CHECK-NEXT: maxss %xmm2, %xmm1
85+
; CHECK-NEXT: minss %xmm3, %xmm1
86+
; CHECK-NEXT: cvttss2si %xmm1, %ecx
87+
; CHECK-NEXT: ucomiss %xmm0, %xmm0
88+
; CHECK-NEXT: cmovpl %eax, %ecx
89+
; CHECK-NEXT: movd %ecx, %xmm1
90+
; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
91+
; CHECK-NEXT: ucomiss %xmm0, %xmm0
92+
; CHECK-NEXT: maxss %xmm2, %xmm0
93+
; CHECK-NEXT: minss %xmm3, %xmm0
94+
; CHECK-NEXT: cvttss2si %xmm0, %ecx
95+
; CHECK-NEXT: cmovpl %eax, %ecx
96+
; CHECK-NEXT: movd %ecx, %xmm0
97+
; CHECK-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
98+
; CHECK-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]
99+
; CHECK-NEXT: movdqa %xmm1, %xmm0
100+
; CHECK-NEXT: retq
101+
%x = call <4 x i1> @llvm.fptosi.sat.v4i1.v4f32(<4 x float> %f)
102+
%y = freeze <4 x i1> %x
103+
ret <4 x i1> %y
104+
}
105+
60106
define <4 x i8> @test_signed_v4i8_v4f32(<4 x float> %f) nounwind {
61107
; CHECK-LABEL: test_signed_v4i8_v4f32:
62108
; CHECK: # %bb.0:

llvm/test/CodeGen/X86/fptoui-sat-vector-128.ll

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,43 @@ define <4 x i1> @test_unsigned_v4i1_v4f32(<4 x float> %f) nounwind {
4848
ret <4 x i1> %x
4949
}
5050

51+
define <4 x i1> @test_freeze_unsigned_v4i1_v4f32(<4 x float> %f) nounwind {
52+
; CHECK-LABEL: test_freeze_unsigned_v4i1_v4f32:
53+
; CHECK: # %bb.0:
54+
; CHECK-NEXT: movaps %xmm0, %xmm1
55+
; CHECK-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3],xmm0[3,3]
56+
; CHECK-NEXT: xorps %xmm2, %xmm2
57+
; CHECK-NEXT: maxss %xmm2, %xmm1
58+
; CHECK-NEXT: movss {{.*#+}} xmm3 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
59+
; CHECK-NEXT: minss %xmm3, %xmm1
60+
; CHECK-NEXT: cvttss2si %xmm1, %eax
61+
; CHECK-NEXT: movd %eax, %xmm1
62+
; CHECK-NEXT: movaps %xmm0, %xmm4
63+
; CHECK-NEXT: unpckhpd {{.*#+}} xmm4 = xmm4[1],xmm0[1]
64+
; CHECK-NEXT: maxss %xmm2, %xmm4
65+
; CHECK-NEXT: minss %xmm3, %xmm4
66+
; CHECK-NEXT: cvttss2si %xmm4, %eax
67+
; CHECK-NEXT: movd %eax, %xmm4
68+
; CHECK-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
69+
; CHECK-NEXT: movaps %xmm0, %xmm1
70+
; CHECK-NEXT: maxss %xmm2, %xmm1
71+
; CHECK-NEXT: minss %xmm3, %xmm1
72+
; CHECK-NEXT: cvttss2si %xmm1, %eax
73+
; CHECK-NEXT: movd %eax, %xmm1
74+
; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
75+
; CHECK-NEXT: maxss %xmm2, %xmm0
76+
; CHECK-NEXT: minss %xmm3, %xmm0
77+
; CHECK-NEXT: cvttss2si %xmm0, %eax
78+
; CHECK-NEXT: movd %eax, %xmm0
79+
; CHECK-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
80+
; CHECK-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]
81+
; CHECK-NEXT: movdqa %xmm1, %xmm0
82+
; CHECK-NEXT: retq
83+
%x = call <4 x i1> @llvm.fptoui.sat.v4i1.v4f32(<4 x float> %f)
84+
%y = freeze <4 x i1> %x
85+
ret <4 x i1> %y
86+
}
87+
5188
define <4 x i8> @test_unsigned_v4i8_v4f32(<4 x float> %f) nounwind {
5289
; CHECK-LABEL: test_unsigned_v4i8_v4f32:
5390
; CHECK: # %bb.0:

0 commit comments

Comments
 (0)