Skip to content

Commit f56c768

Browse files
committed
[TEST] Drop SSE41 constraints
1 parent 5e164e0 commit f56c768

File tree

2 files changed

+64
-90
lines changed

2 files changed

+64
-90
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24633,18 +24633,12 @@ SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
2463324633
// If we have SSE41/AVX, we can use a variable vector select (VBLENDV)
2463424634
// instead of 3 logic instructions for size savings and potentially speed.
2463524635
// Unfortunately, there is no scalar form of VBLENDV.
24636-
24636+
//
2463724637
// If either operand is a +0.0 constant, don't try this. We can expect to
2463824638
// optimize away at least one of the logic instructions later in that
2463924639
// case, so that sequence would be faster than a variable blend.
24640-
24641-
// BLENDV was introduced with SSE 4.1, but the 2 register form implicitly
24642-
// uses XMM0 as the selection register. That may need just as many
24643-
// instructions as the AND/ANDN/OR sequence due to register moves, so
24644-
// only attempt this if at least one of ops (+ condition) are one use.
2464524640
if (Subtarget.hasSSE41() && !isNullFPConstant(Op1) &&
24646-
!isNullFPConstant(Op2) &&
24647-
(Subtarget.hasAVX() || Op1->hasOneUse() || Op2->hasOneUse())) {
24641+
!isNullFPConstant(Op2)) {
2464824642
// Convert to vectors, do a VSELECT, and convert back to scalar.
2464924643
// All of the conversions should be optimized away.
2465024644
MVT VecVT = VT == MVT::f32 ? MVT::v4f32 : MVT::v2f64;

llvm/test/CodeGen/X86/sse-minmax.ll

Lines changed: 62 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,11 @@ define double @olt_inverse(double %x, double %y) {
8080
define double @oge(double %x, double %y) {
8181
; STRICT-LABEL: oge:
8282
; STRICT: # %bb.0:
83-
; STRICT-NEXT: movapd %xmm1, %xmm2
84-
; STRICT-NEXT: cmplesd %xmm0, %xmm2
85-
; STRICT-NEXT: andpd %xmm2, %xmm0
86-
; STRICT-NEXT: andnpd %xmm1, %xmm2
87-
; STRICT-NEXT: orpd %xmm2, %xmm0
83+
; STRICT-NEXT: movapd %xmm0, %xmm2
84+
; STRICT-NEXT: movapd %xmm1, %xmm0
85+
; STRICT-NEXT: cmplesd %xmm2, %xmm0
86+
; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1
87+
; STRICT-NEXT: movapd %xmm1, %xmm0
8888
; STRICT-NEXT: retq
8989
;
9090
; RELAX-LABEL: oge:
@@ -100,10 +100,9 @@ define double @ole(double %x, double %y) {
100100
; STRICT-LABEL: ole:
101101
; STRICT: # %bb.0:
102102
; STRICT-NEXT: movapd %xmm0, %xmm2
103-
; STRICT-NEXT: cmplesd %xmm1, %xmm2
104-
; STRICT-NEXT: andpd %xmm2, %xmm0
105-
; STRICT-NEXT: andnpd %xmm1, %xmm2
106-
; STRICT-NEXT: orpd %xmm2, %xmm0
103+
; STRICT-NEXT: cmplesd %xmm1, %xmm0
104+
; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1
105+
; STRICT-NEXT: movapd %xmm1, %xmm0
107106
; STRICT-NEXT: retq
108107
;
109108
; RELAX-LABEL: ole:
@@ -118,11 +117,10 @@ define double @ole(double %x, double %y) {
118117
define double @oge_inverse(double %x, double %y) {
119118
; STRICT-LABEL: oge_inverse:
120119
; STRICT: # %bb.0:
121-
; STRICT-NEXT: movapd %xmm1, %xmm2
122-
; STRICT-NEXT: cmplesd %xmm0, %xmm2
123-
; STRICT-NEXT: andpd %xmm2, %xmm1
124-
; STRICT-NEXT: andnpd %xmm0, %xmm2
125-
; STRICT-NEXT: orpd %xmm1, %xmm2
120+
; STRICT-NEXT: movapd %xmm0, %xmm2
121+
; STRICT-NEXT: movapd %xmm1, %xmm0
122+
; STRICT-NEXT: cmplesd %xmm2, %xmm0
123+
; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
126124
; STRICT-NEXT: movapd %xmm2, %xmm0
127125
; STRICT-NEXT: retq
128126
;
@@ -145,10 +143,8 @@ define double @ole_inverse(double %x, double %y) {
145143
; STRICT-LABEL: ole_inverse:
146144
; STRICT: # %bb.0:
147145
; STRICT-NEXT: movapd %xmm0, %xmm2
148-
; STRICT-NEXT: cmplesd %xmm1, %xmm2
149-
; STRICT-NEXT: andpd %xmm2, %xmm1
150-
; STRICT-NEXT: andnpd %xmm0, %xmm2
151-
; STRICT-NEXT: orpd %xmm1, %xmm2
146+
; STRICT-NEXT: cmplesd %xmm1, %xmm0
147+
; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
152148
; STRICT-NEXT: movapd %xmm2, %xmm0
153149
; STRICT-NEXT: retq
154150
;
@@ -333,10 +329,9 @@ define double @ugt(double %x, double %y) {
333329
; STRICT-LABEL: ugt:
334330
; STRICT: # %bb.0:
335331
; STRICT-NEXT: movapd %xmm0, %xmm2
336-
; STRICT-NEXT: cmpnlesd %xmm1, %xmm2
337-
; STRICT-NEXT: andpd %xmm2, %xmm0
338-
; STRICT-NEXT: andnpd %xmm1, %xmm2
339-
; STRICT-NEXT: orpd %xmm2, %xmm0
332+
; STRICT-NEXT: cmpnlesd %xmm1, %xmm0
333+
; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1
334+
; STRICT-NEXT: movapd %xmm1, %xmm0
340335
; STRICT-NEXT: retq
341336
;
342337
; RELAX-LABEL: ugt:
@@ -351,11 +346,11 @@ define double @ugt(double %x, double %y) {
351346
define double @ult(double %x, double %y) {
352347
; STRICT-LABEL: ult:
353348
; STRICT: # %bb.0:
354-
; STRICT-NEXT: movapd %xmm1, %xmm2
355-
; STRICT-NEXT: cmpnlesd %xmm0, %xmm2
356-
; STRICT-NEXT: andpd %xmm2, %xmm0
357-
; STRICT-NEXT: andnpd %xmm1, %xmm2
358-
; STRICT-NEXT: orpd %xmm2, %xmm0
349+
; STRICT-NEXT: movapd %xmm0, %xmm2
350+
; STRICT-NEXT: movapd %xmm1, %xmm0
351+
; STRICT-NEXT: cmpnlesd %xmm2, %xmm0
352+
; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1
353+
; STRICT-NEXT: movapd %xmm1, %xmm0
359354
; STRICT-NEXT: retq
360355
;
361356
; RELAX-LABEL: ult:
@@ -371,10 +366,8 @@ define double @ugt_inverse(double %x, double %y) {
371366
; STRICT-LABEL: ugt_inverse:
372367
; STRICT: # %bb.0:
373368
; STRICT-NEXT: movapd %xmm0, %xmm2
374-
; STRICT-NEXT: cmpnlesd %xmm1, %xmm2
375-
; STRICT-NEXT: andpd %xmm2, %xmm1
376-
; STRICT-NEXT: andnpd %xmm0, %xmm2
377-
; STRICT-NEXT: orpd %xmm1, %xmm2
369+
; STRICT-NEXT: cmpnlesd %xmm1, %xmm0
370+
; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
378371
; STRICT-NEXT: movapd %xmm2, %xmm0
379372
; STRICT-NEXT: retq
380373
;
@@ -396,11 +389,10 @@ define double @ugt_inverse(double %x, double %y) {
396389
define double @ult_inverse(double %x, double %y) {
397390
; STRICT-LABEL: ult_inverse:
398391
; STRICT: # %bb.0:
399-
; STRICT-NEXT: movapd %xmm1, %xmm2
400-
; STRICT-NEXT: cmpnlesd %xmm0, %xmm2
401-
; STRICT-NEXT: andpd %xmm2, %xmm1
402-
; STRICT-NEXT: andnpd %xmm0, %xmm2
403-
; STRICT-NEXT: orpd %xmm1, %xmm2
392+
; STRICT-NEXT: movapd %xmm0, %xmm2
393+
; STRICT-NEXT: movapd %xmm1, %xmm0
394+
; STRICT-NEXT: cmpnlesd %xmm2, %xmm0
395+
; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
404396
; STRICT-NEXT: movapd %xmm2, %xmm0
405397
; STRICT-NEXT: retq
406398
;
@@ -738,12 +730,12 @@ define double @olt_inverse_y(double %x) {
738730
define double @oge_y(double %x) {
739731
; STRICT-LABEL: oge_y:
740732
; STRICT: # %bb.0:
741-
; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
742-
; STRICT-NEXT: movapd %xmm1, %xmm2
743-
; STRICT-NEXT: cmplesd %xmm0, %xmm2
744-
; STRICT-NEXT: andpd %xmm2, %xmm0
745-
; STRICT-NEXT: andnpd %xmm1, %xmm2
746-
; STRICT-NEXT: orpd %xmm2, %xmm0
733+
; STRICT-NEXT: movapd %xmm0, %xmm1
734+
; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
735+
; STRICT-NEXT: cmplesd %xmm1, %xmm0
736+
; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
737+
; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
738+
; STRICT-NEXT: movapd %xmm2, %xmm0
747739
; STRICT-NEXT: retq
748740
;
749741
; RELAX-LABEL: oge_y:
@@ -758,12 +750,11 @@ define double @oge_y(double %x) {
758750
define double @ole_y(double %x) {
759751
; STRICT-LABEL: ole_y:
760752
; STRICT: # %bb.0:
761-
; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
762-
; STRICT-NEXT: movapd %xmm0, %xmm2
763-
; STRICT-NEXT: cmplesd %xmm1, %xmm2
764-
; STRICT-NEXT: andpd %xmm2, %xmm0
765-
; STRICT-NEXT: andnpd %xmm1, %xmm2
766-
; STRICT-NEXT: orpd %xmm2, %xmm0
753+
; STRICT-NEXT: movapd %xmm0, %xmm1
754+
; STRICT-NEXT: cmplesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
755+
; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
756+
; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
757+
; STRICT-NEXT: movapd %xmm2, %xmm0
767758
; STRICT-NEXT: retq
768759
;
769760
; RELAX-LABEL: ole_y:
@@ -778,12 +769,10 @@ define double @ole_y(double %x) {
778769
define double @oge_inverse_y(double %x) {
779770
; STRICT-LABEL: oge_inverse_y:
780771
; STRICT: # %bb.0:
781-
; STRICT-NEXT: movsd {{.*#+}} xmm2 = [-0.0E+0,0.0E+0]
782-
; STRICT-NEXT: movapd %xmm2, %xmm1
783-
; STRICT-NEXT: cmplesd %xmm0, %xmm1
784-
; STRICT-NEXT: andpd %xmm1, %xmm2
785-
; STRICT-NEXT: andnpd %xmm0, %xmm1
786-
; STRICT-NEXT: orpd %xmm2, %xmm1
772+
; STRICT-NEXT: movapd %xmm0, %xmm1
773+
; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
774+
; STRICT-NEXT: cmplesd %xmm1, %xmm0
775+
; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
787776
; STRICT-NEXT: movapd %xmm1, %xmm0
788777
; STRICT-NEXT: retq
789778
;
@@ -806,12 +795,9 @@ define double @oge_inverse_y(double %x) {
806795
define double @ole_inverse_y(double %x) {
807796
; STRICT-LABEL: ole_inverse_y:
808797
; STRICT: # %bb.0:
809-
; STRICT-NEXT: movsd {{.*#+}} xmm2 = [-0.0E+0,0.0E+0]
810798
; STRICT-NEXT: movapd %xmm0, %xmm1
811-
; STRICT-NEXT: cmplesd %xmm2, %xmm1
812-
; STRICT-NEXT: andpd %xmm1, %xmm2
813-
; STRICT-NEXT: andnpd %xmm0, %xmm1
814-
; STRICT-NEXT: orpd %xmm2, %xmm1
799+
; STRICT-NEXT: cmplesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
800+
; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
815801
; STRICT-NEXT: movapd %xmm1, %xmm0
816802
; STRICT-NEXT: retq
817803
;
@@ -834,12 +820,11 @@ define double @ole_inverse_y(double %x) {
834820
define double @ugt_y(double %x) {
835821
; STRICT-LABEL: ugt_y:
836822
; STRICT: # %bb.0:
837-
; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
838-
; STRICT-NEXT: movapd %xmm0, %xmm2
839-
; STRICT-NEXT: cmpnlesd %xmm1, %xmm2
840-
; STRICT-NEXT: andpd %xmm2, %xmm0
841-
; STRICT-NEXT: andnpd %xmm1, %xmm2
842-
; STRICT-NEXT: orpd %xmm2, %xmm0
823+
; STRICT-NEXT: movapd %xmm0, %xmm1
824+
; STRICT-NEXT: cmpnlesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
825+
; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
826+
; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
827+
; STRICT-NEXT: movapd %xmm2, %xmm0
843828
; STRICT-NEXT: retq
844829
;
845830
; RELAX-LABEL: ugt_y:
@@ -854,12 +839,12 @@ define double @ugt_y(double %x) {
854839
define double @ult_y(double %x) {
855840
; STRICT-LABEL: ult_y:
856841
; STRICT: # %bb.0:
857-
; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
858-
; STRICT-NEXT: movapd %xmm1, %xmm2
859-
; STRICT-NEXT: cmpnlesd %xmm0, %xmm2
860-
; STRICT-NEXT: andpd %xmm2, %xmm0
861-
; STRICT-NEXT: andnpd %xmm1, %xmm2
862-
; STRICT-NEXT: orpd %xmm2, %xmm0
842+
; STRICT-NEXT: movapd %xmm0, %xmm1
843+
; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
844+
; STRICT-NEXT: cmpnlesd %xmm1, %xmm0
845+
; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
846+
; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
847+
; STRICT-NEXT: movapd %xmm2, %xmm0
863848
; STRICT-NEXT: retq
864849
;
865850
; RELAX-LABEL: ult_y:
@@ -874,12 +859,9 @@ define double @ult_y(double %x) {
874859
define double @ugt_inverse_y(double %x) {
875860
; STRICT-LABEL: ugt_inverse_y:
876861
; STRICT: # %bb.0:
877-
; STRICT-NEXT: movsd {{.*#+}} xmm2 = [-0.0E+0,0.0E+0]
878862
; STRICT-NEXT: movapd %xmm0, %xmm1
879-
; STRICT-NEXT: cmpnlesd %xmm2, %xmm1
880-
; STRICT-NEXT: andpd %xmm1, %xmm2
881-
; STRICT-NEXT: andnpd %xmm0, %xmm1
882-
; STRICT-NEXT: orpd %xmm2, %xmm1
863+
; STRICT-NEXT: cmpnlesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
864+
; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
883865
; STRICT-NEXT: movapd %xmm1, %xmm0
884866
; STRICT-NEXT: retq
885867
;
@@ -902,12 +884,10 @@ define double @ugt_inverse_y(double %x) {
902884
define double @ult_inverse_y(double %x) {
903885
; STRICT-LABEL: ult_inverse_y:
904886
; STRICT: # %bb.0:
905-
; STRICT-NEXT: movsd {{.*#+}} xmm2 = [-0.0E+0,0.0E+0]
906-
; STRICT-NEXT: movapd %xmm2, %xmm1
907-
; STRICT-NEXT: cmpnlesd %xmm0, %xmm1
908-
; STRICT-NEXT: andpd %xmm1, %xmm2
909-
; STRICT-NEXT: andnpd %xmm0, %xmm1
910-
; STRICT-NEXT: orpd %xmm2, %xmm1
887+
; STRICT-NEXT: movapd %xmm0, %xmm1
888+
; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
889+
; STRICT-NEXT: cmpnlesd %xmm1, %xmm0
890+
; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
911891
; STRICT-NEXT: movapd %xmm1, %xmm0
912892
; STRICT-NEXT: retq
913893
;

0 commit comments

Comments
 (0)