@@ -675,6 +675,9 @@ bool DAGTypeLegalizer::ScalarizeVectorOperand(SDNode *N, unsigned OpNo) {
675
675
case ISD::BITCAST:
676
676
Res = ScalarizeVecOp_BITCAST (N);
677
677
break ;
678
+ case ISD::INSERT_SUBVECTOR:
679
+ Res = ScalarizeVecOp_INSERT_SUBVECTOR (N, OpNo);
680
+ break ;
678
681
case ISD::ANY_EXTEND:
679
682
case ISD::ZERO_EXTEND:
680
683
case ISD::SIGN_EXTEND:
@@ -766,6 +769,24 @@ SDValue DAGTypeLegalizer::ScalarizeVecOp_BITCAST(SDNode *N) {
766
769
N->getValueType (0 ), Elt);
767
770
}
768
771
772
+ // / If the value to subvector is a vector that needs to be scalarized, it must
773
+ // / be <1 x ty>. Return the element instead.
774
+ SDValue DAGTypeLegalizer::ScalarizeVecOp_INSERT_SUBVECTOR (SDNode *N,
775
+ unsigned OpNo) {
776
+ // If the destination vector is unary, we can just return the source vector
777
+ auto src = GetScalarizedVector (N->getOperand (1 ));
778
+ if (OpNo == 0 ) {
779
+ return src;
780
+ }
781
+
782
+ auto dest = N->getOperand (0 );
783
+ auto idx = N->getOperand (2 );
784
+ return DAG.getNode (ISD::INSERT_VECTOR_ELT, SDLoc (N), N->getValueType (0 ), dest,
785
+ src, idx);
786
+
787
+ return GetScalarizedVector (src);
788
+ }
789
+
769
790
// / If the input is a vector that needs to be scalarized, it must be <1 x ty>.
770
791
// / Do the operation on the element instead.
771
792
SDValue DAGTypeLegalizer::ScalarizeVecOp_UnaryOp (SDNode *N) {
@@ -5891,8 +5912,11 @@ SDValue DAGTypeLegalizer::WidenVecRes_SETCC(SDNode *N) {
5891
5912
InOp1 = GetWidenedVector (InOp1);
5892
5913
InOp2 = GetWidenedVector (InOp2);
5893
5914
} else {
5894
- InOp1 = DAG.WidenVector (InOp1, SDLoc (N));
5895
- InOp2 = DAG.WidenVector (InOp2, SDLoc (N));
5915
+ do {
5916
+ InOp1 = DAG.WidenVector (InOp1, SDLoc (N));
5917
+ InOp2 = DAG.WidenVector (InOp2, SDLoc (N));
5918
+ } while (ElementCount::isKnownLT (
5919
+ InOp1.getValueType ().getVectorElementCount (), WidenEC));
5896
5920
}
5897
5921
5898
5922
// Assume that the input and output will be widen appropriately. If not,
0 commit comments