4343#include " llvm/CodeGenTypes/MachineValueType.h"
4444#include " llvm/Support/Debug.h"
4545#include < cassert>
46- #include < iostream >
46+ #include < set >
4747
4848#define GET_GICOMBINER_DEPS
4949#include " AArch64GenPostLegalizeGICombiner.inc"
@@ -146,6 +146,8 @@ bool matchCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
146146 undefinedValues.clear ();
147147 unmergedValues.clear ();
148148
149+ std::set<int > knownRegs;
150+
149151 for (auto Use : MI.all_uses ()) {
150152 auto *Def = getDefIgnoringCopies (Use.getReg (), MRI);
151153
@@ -170,15 +172,19 @@ bool matchCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
170172 unmergedValues.clear ();
171173 return false ;
172174 }
173-
174- unmergedValues.push_back (Def->getOperand (2 ).getReg ());
175+ if (knownRegs.find (Def->getOperand (2 ).getReg ().id ()) == knownRegs.end ()) {
176+ knownRegs.insert (Def->getOperand (2 ).getReg ().id ());
177+ unmergedValues.push_back (Def->getOperand (2 ).getReg ());
178+ }
179+ else
180+ continue ;
175181
176182 break ;
177183 }
178184 }
179185
180- if (!(undefinedValues.size () == 2 && unmergedValues.size () == 2 ) &&
181- !(undefinedValues.size () == 0 && unmergedValues.size () == 4 )) {
186+ if (!(undefinedValues.size () == 2 && unmergedValues.size () == 1 ) &&
187+ !(undefinedValues.size () == 0 && unmergedValues.size () == 2 )) {
182188 undefinedValues.clear ();
183189 unmergedValues.clear ();
184190 return false ;
@@ -193,7 +199,7 @@ void applyCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
193199 SmallVectorImpl<Register> &undefinedValues) {
194200 B.setInstrAndDebugLoc (MI);
195201
196- if (unmergedValues.size () == 2 ) {
202+ if (unmergedValues.size () == 1 ) {
197203 auto llt = LLT::fixed_vector (
198204 undefinedValues.size (),
199205 LLT::scalar (MRI.getType (unmergedValues[0 ]).getScalarSizeInBits ()));
@@ -202,8 +208,9 @@ void applyCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
202208 B.buildBuildVector (DefVec, undefinedValues);
203209 B.buildConcatVectors (MI.getOperand (0 ), {unmergedValues[0 ], DefVec});
204210 } else {
211+ return ;
205212 B.buildConcatVectors (MI.getOperand (0 ),
206- {unmergedValues[0 ], unmergedValues[3 ]});
213+ {unmergedValues[0 ], unmergedValues[1 ]});
207214 }
208215
209216 MI.eraseFromParent ();
0 commit comments