@@ -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