Skip to content

Commit 0efa366

Browse files
Add comment
1 parent 7742f13 commit 0efa366

File tree

2 files changed

+45
-28
lines changed

2 files changed

+45
-28
lines changed

llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerCombiner.cpp

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
// )
140155
bool 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

198213
void 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
}

llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,9 @@
556556
# DEBUG-NEXT: G_FPTRUNC (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
557557
# DEBUG-NEXT: .. the first uncovered type index: 2, OK
558558
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
559+
# DEBUG-NEXT: G_FPTRUNC_ODD (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
560+
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
561+
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
559562
# DEBUG-NEXT: G_FPTOSI (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
560563
# DEBUG-NEXT: .. the first uncovered type index: 2, OK
561564
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK

0 commit comments

Comments
 (0)