@@ -11844,25 +11844,38 @@ SDValue SelectionDAG::getTargetInsertSubreg(int SRIdx, const SDLoc &DL, EVT VT,
1184411844/// getNodeIfExists - Get the specified node if it's already available, or
1184511845/// else return NULL.
1184611846SDNode *SelectionDAG::getNodeIfExists(unsigned Opcode, SDVTList VTList,
11847- ArrayRef<SDValue> Ops) {
11847+ ArrayRef<SDValue> Ops,
11848+ bool AllowCommute) {
1184811849 SDNodeFlags Flags;
1184911850 if (Inserter)
1185011851 Flags = Inserter->getFlags();
11851- return getNodeIfExists(Opcode, VTList, Ops, Flags);
11852+ return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute );
1185211853}
1185311854
1185411855SDNode *SelectionDAG::getNodeIfExists(unsigned Opcode, SDVTList VTList,
1185511856 ArrayRef<SDValue> Ops,
11856- const SDNodeFlags Flags) {
11857- if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
11857+ const SDNodeFlags Flags,
11858+ bool AllowCommute) {
11859+ if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
11860+ return nullptr;
11861+
11862+ auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
1185811863 FoldingSetNodeID ID;
11859- AddNodeIDNode(ID, Opcode, VTList, Ops );
11864+ AddNodeIDNode(ID, Opcode, VTList, LookupOps );
1186011865 void *IP = nullptr;
11861- if (SDNode *E = FindNodeOrInsertPos(ID, SDLoc(), IP)) {
11866+ if (SDNode *E = FindNodeOrInsertPos(ID, IP)) {
1186211867 E->intersectFlagsWith(Flags);
1186311868 return E;
1186411869 }
11865- }
11870+ return nullptr;
11871+ };
11872+
11873+ if (SDNode *Existing = Lookup(Ops))
11874+ return Existing;
11875+
11876+ if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
11877+ return Lookup({Ops[1], Ops[0]});
11878+
1186611879 return nullptr;
1186711880}
1186811881
0 commit comments