Skip to content

Commit 2a95cfd

Browse files
committed
Add early-out if the load isn't a simple XMM/YMM load to reduce if depth
1 parent 86244ad commit 2a95cfd

File tree

1 file changed

+28
-27
lines changed

1 file changed

+28
-27
lines changed

llvm/lib/Target/X86/X86ISelDAGToDAG.cpp

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,33 +1041,34 @@ void X86DAGToDAGISel::PreprocessISelDAG() {
10411041
// load, then just extract the lower subvector and avoid the second load.
10421042
auto *Ld = cast<LoadSDNode>(N);
10431043
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;
10711072
}
10721073
}
10731074
break;

0 commit comments

Comments
 (0)