@@ -1041,33 +1041,34 @@ void X86DAGToDAGISel::PreprocessISelDAG() {
1041
1041
// load, then just extract the lower subvector and avoid the second load.
1042
1042
auto *Ld = cast<LoadSDNode>(N);
1043
1043
MVT VT = N->getSimpleValueType (0 );
1044
- if (ISD::isNormalLoad (Ld) && Ld->isSimple () &&
1045
- (VT.is128BitVector () || VT.is256BitVector ())) {
1046
- SDValue Ptr = Ld->getBasePtr ();
1047
- SDValue Chain = Ld->getChain ();
1048
- for (SDNode *User : Ptr->uses ()) {
1049
- auto *UserLd = dyn_cast<LoadSDNode>(N);
1050
- MVT UserVT = User->getSimpleValueType (0 );
1051
- if (User != N && UserLd && ISD::isNormalLoad (User) &&
1052
- UserLd->getBasePtr () == Ptr && UserLd->getChain () == Chain &&
1053
- !User->hasAnyUseOfValue (1 ) &&
1054
- (UserVT.is256BitVector () || UserVT.is512BitVector ()) &&
1055
- UserVT.getSizeInBits () > VT.getSizeInBits ()) {
1056
- SDLoc dl (N);
1057
- unsigned NumSubElts =
1058
- VT.getSizeInBits () / UserVT.getScalarSizeInBits ();
1059
- MVT SubVT = MVT::getVectorVT (UserVT.getScalarType (), NumSubElts);
1060
- SDValue Extract = CurDAG->getNode (ISD::EXTRACT_SUBVECTOR, dl, SubVT,
1061
- SDValue (User, 0 ),
1062
- CurDAG->getIntPtrConstant (0 , dl));
1063
- SDValue Res = CurDAG->getBitcast (VT, Extract);
1064
- --I;
1065
- SDValue To[] = {Res, SDValue (UserLd, 1 )};
1066
- CurDAG->ReplaceAllUsesWith (N, To);
1067
- ++I;
1068
- MadeChange = true ;
1069
- continue ;
1070
- }
1044
+ if (!ISD::isNormalLoad (Ld) || !Ld->isSimple () ||
1045
+ !(VT.is128BitVector () || VT.is256BitVector ()))
1046
+ break ;
1047
+
1048
+ SDValue Ptr = Ld->getBasePtr ();
1049
+ SDValue Chain = Ld->getChain ();
1050
+ for (SDNode *User : Ptr->uses ()) {
1051
+ auto *UserLd = dyn_cast<LoadSDNode>(N);
1052
+ MVT UserVT = User->getSimpleValueType (0 );
1053
+ if (User != N && UserLd && ISD::isNormalLoad (User) &&
1054
+ UserLd->getBasePtr () == Ptr && UserLd->getChain () == Chain &&
1055
+ !User->hasAnyUseOfValue (1 ) &&
1056
+ (UserVT.is256BitVector () || UserVT.is512BitVector ()) &&
1057
+ UserVT.getSizeInBits () > VT.getSizeInBits ()) {
1058
+ SDLoc dl (N);
1059
+ unsigned NumSubElts =
1060
+ VT.getSizeInBits () / UserVT.getScalarSizeInBits ();
1061
+ MVT SubVT = MVT::getVectorVT (UserVT.getScalarType (), NumSubElts);
1062
+ SDValue Extract = CurDAG->getNode (ISD::EXTRACT_SUBVECTOR, dl, SubVT,
1063
+ SDValue (User, 0 ),
1064
+ CurDAG->getIntPtrConstant (0 , dl));
1065
+ SDValue Res = CurDAG->getBitcast (VT, Extract);
1066
+ --I;
1067
+ SDValue To[] = {Res, SDValue (UserLd, 1 )};
1068
+ CurDAG->ReplaceAllUsesWith (N, To);
1069
+ ++I;
1070
+ MadeChange = true ;
1071
+ continue ;
1071
1072
}
1072
1073
}
1073
1074
break ;
0 commit comments