4242#include " llvm/CodeGen/TargetPassConfig.h"
4343#include " llvm/CodeGenTypes/MachineValueType.h"
4444#include " llvm/Support/Debug.h"
45- #include < cassert>
4645#include < set>
4746
4847#define GET_GICOMBINER_DEPS
@@ -139,12 +138,12 @@ bool isZeroExtended(Register R, MachineRegisterInfo &MRI) {
139138}
140139
141140bool matchCombineBuildUnmerge (MachineInstr &MI, MachineRegisterInfo &MRI,
142- SmallVectorImpl<Register> &unmergedValues ,
141+ SmallVectorImpl<Register> &unmergeSrc ,
143142 SmallVectorImpl<Register> &undefinedValues) {
144143 assert (MI.getOpcode () == TargetOpcode::G_BUILD_VECTOR);
145144
146145 undefinedValues.clear ();
147- unmergedValues .clear ();
146+ unmergeSrc .clear ();
148147
149148 std::set<int > knownRegs;
150149
@@ -153,7 +152,7 @@ bool matchCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
153152
154153 if (!Def) {
155154 undefinedValues.clear ();
156- unmergedValues .clear ();
155+ unmergeSrc .clear ();
157156 return false ;
158157 }
159158
@@ -166,27 +165,30 @@ bool matchCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
166165 undefinedValues.push_back (Use.getReg ());
167166 break ;
168167 case TargetOpcode::G_UNMERGE_VALUES:
169- if (Def->getNumDefs () > 2 ||
168+ // We only want to match G_UNMERGE_VALUES <2 x Ty>
169+ // s16 is troublesome as <2 x s16> is generally not legal
170+ if (Def->getNumDefs () != 2 ||
170171 MRI.getType (Use.getReg ()) == LLT::scalar (16 )) {
171172 undefinedValues.clear ();
172- unmergedValues .clear ();
173+ unmergeSrc .clear ();
173174 return false ;
174175 }
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 ;
181176
177+ // Only track unique sources for the G_UNMERGE_VALUES
178+ if (knownRegs.find (Def->getOperand (2 ).getReg ().id ()) != knownRegs.end ())
179+ continue ;
180+
181+ knownRegs.insert (Def->getOperand (2 ).getReg ().id ());
182+ unmergeSrc.push_back (Def->getOperand (2 ).getReg ());
183+
182184 break ;
183185 }
184186 }
185187
186- if (!(undefinedValues. size () == 2 && unmergedValues. size () == 1 ) &&
187- !(undefinedValues.size () == 0 && unmergedValues .size () == 2 )) {
188+ // Only want to match patterns that pad two values with two undefined values
189+ if ( !(undefinedValues.size () == 2 && unmergeSrc .size () == 1 )) {
188190 undefinedValues.clear ();
189- unmergedValues .clear ();
191+ unmergeSrc .clear ();
190192 return false ;
191193 }
192194
@@ -195,23 +197,19 @@ bool matchCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
195197
196198void applyCombineBuildUnmerge (MachineInstr &MI, MachineRegisterInfo &MRI,
197199 MachineIRBuilder &B,
198- SmallVectorImpl<Register> &unmergedValues ,
200+ SmallVectorImpl<Register> &unmergeSrc ,
199201 SmallVectorImpl<Register> &undefinedValues) {
202+ assert (unmergeSrc.size () == 1 && " Expected there to be one G_UNMERGE_VALUES" );
200203 B.setInstrAndDebugLoc (MI);
201204
202- if (unmergedValues.size () == 1 ) {
203205 auto llt = LLT::fixed_vector (
204206 undefinedValues.size (),
205- LLT::scalar (MRI.getType (unmergedValues[0 ]).getScalarSizeInBits ()));
207+ LLT::scalar (MRI.getType (unmergeSrc[0 ]).getScalarSizeInBits ()));
208+
206209 Register DefVec = MRI.createGenericVirtualRegister (llt);
207210
208211 B.buildBuildVector (DefVec, undefinedValues);
209- B.buildConcatVectors (MI.getOperand (0 ), {unmergedValues[0 ], DefVec});
210- } else {
211- return ;
212- B.buildConcatVectors (MI.getOperand (0 ),
213- {unmergedValues[0 ], unmergedValues[1 ]});
214- }
212+ B.buildConcatVectors (MI.getOperand (0 ), {unmergeSrc[0 ], DefVec});
215213
216214 MI.eraseFromParent ();
217215}
0 commit comments