@@ -137,22 +137,37 @@ bool isZeroExtended(Register R, MachineRegisterInfo &MRI) {
137137 return MRI.getVRegDef (R)->getOpcode () == TargetOpcode::G_ZEXT;
138138}
139139
140+ // This patten aims to match the following shape to avoid extra mov instructions
141+ // G_BUILD_VECTOR(
142+ // G_UNMERGE_VALUES(src, 0)
143+ // G_UNMERGE_VALUES(src, 1)
144+ // G_IMPLICIT_DEF
145+ // G_IMPLICIT_DEF
146+ // )
147+ // ->
148+ // G_CONCAT_VECTORS(
149+ // G_BUILD_VECTOR(
150+ // G_IMPLICIT_DEF
151+ // G_IMPLICIT_DEF
152+ // )
153+ // src
154+ // )
140155bool matchCombineBuildUnmerge (MachineInstr &MI, MachineRegisterInfo &MRI,
141- SmallVectorImpl<Register> &unmergeSrc ,
142- SmallVectorImpl<Register> &undefinedValues ) {
156+ SmallVectorImpl<Register> &UnmergeSrc ,
157+ SmallVectorImpl<Register> &UndefinedValues ) {
143158 assert (MI.getOpcode () == TargetOpcode::G_BUILD_VECTOR);
144159
145- undefinedValues .clear ();
146- unmergeSrc .clear ();
160+ UndefinedValues .clear ();
161+ UnmergeSrc .clear ();
147162
148- std::set<int > knownRegs ;
163+ std::set<int > KnownRegs ;
149164
150165 for (auto Use : MI.all_uses ()) {
151166 auto *Def = getDefIgnoringCopies (Use.getReg (), MRI);
152167
153168 if (!Def) {
154- undefinedValues .clear ();
155- unmergeSrc .clear ();
169+ UndefinedValues .clear ();
170+ UnmergeSrc .clear ();
156171 return false ;
157172 }
158173
@@ -162,33 +177,33 @@ bool matchCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
162177 default :
163178 return false ;
164179 case TargetOpcode::G_IMPLICIT_DEF:
165- undefinedValues .push_back (Use.getReg ());
180+ UndefinedValues .push_back (Use.getReg ());
166181 break ;
167182 case TargetOpcode::G_UNMERGE_VALUES:
168183 // We only want to match G_UNMERGE_VALUES <2 x Ty>
169184 // s16 is troublesome as <2 x s16> is generally not legal
170185 if (Def->getNumDefs () != 2 ||
171186 MRI.getType (Use.getReg ()) == LLT::scalar (16 )) {
172- undefinedValues .clear ();
173- unmergeSrc .clear ();
187+ UndefinedValues .clear ();
188+ UnmergeSrc .clear ();
174189 return false ;
175190 }
176191
177192 // Only track unique sources for the G_UNMERGE_VALUES
178- if (knownRegs.find (Def->getOperand (2 ).getReg ().id ()) != knownRegs.end ())
179- continue ;
193+ if (KnownRegs.find (Def->getOperand (2 ).getReg ().id ()) != KnownRegs.end ())
194+ continue ;
195+
196+ KnownRegs.insert (Def->getOperand (2 ).getReg ().id ());
197+ UnmergeSrc.push_back (Def->getOperand (2 ).getReg ());
180198
181- knownRegs.insert (Def->getOperand (2 ).getReg ().id ());
182- unmergeSrc.push_back (Def->getOperand (2 ).getReg ());
183-
184199 break ;
185200 }
186201 }
187202
188203 // Only want to match patterns that pad two values with two undefined values
189- if (!(undefinedValues .size () == 2 && unmergeSrc .size () == 1 )) {
190- undefinedValues .clear ();
191- unmergeSrc .clear ();
204+ if (!(UndefinedValues .size () == 2 && UnmergeSrc .size () == 1 )) {
205+ UndefinedValues .clear ();
206+ UnmergeSrc .clear ();
192207 return false ;
193208 }
194209
@@ -197,19 +212,18 @@ bool matchCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
197212
198213void applyCombineBuildUnmerge (MachineInstr &MI, MachineRegisterInfo &MRI,
199214 MachineIRBuilder &B,
200- SmallVectorImpl<Register> &unmergeSrc ,
201- SmallVectorImpl<Register> &undefinedValues ) {
202- assert (unmergeSrc .size () == 1 && " Expected there to be one G_UNMERGE_VALUES" );
215+ SmallVectorImpl<Register> &UnmergeSrc ,
216+ SmallVectorImpl<Register> &UndefinedValues ) {
217+ assert (UnmergeSrc .size () == 1 && " Expected there to be one G_UNMERGE_VALUES" );
203218 B.setInstrAndDebugLoc (MI);
204219
205- auto llt = LLT::fixed_vector (
206- undefinedValues.size (),
207- LLT::scalar (MRI.getType (unmergeSrc[0 ]).getScalarSizeInBits ()));
208-
209- Register DefVec = MRI.createGenericVirtualRegister (llt);
220+ auto UndefVecLLT = LLT::fixed_vector (
221+ UndefinedValues.size (),
222+ LLT::scalar (MRI.getType (UnmergeSrc[0 ]).getScalarSizeInBits ()));
223+ Register UndefVec = MRI.createGenericVirtualRegister (UndefVecLLT);
210224
211- B.buildBuildVector (DefVec, undefinedValues );
212- B.buildConcatVectors (MI.getOperand (0 ), {unmergeSrc [0 ], DefVec });
225+ B.buildBuildVector (UndefVec, UndefinedValues );
226+ B.buildConcatVectors (MI.getOperand (0 ), {UnmergeSrc [0 ], UndefVec });
213227
214228 MI.eraseFromParent ();
215229}
0 commit comments