Skip to content

Commit b286a3a

Browse files
committed
getInitValueAsRegClass(Like)
1 parent 8207997 commit b286a3a

File tree

5 files changed

+58
-31
lines changed

5 files changed

+58
-31
lines changed

llvm/utils/TableGen/Common/CodeGenInstAlias.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,20 @@ static Expected<ResultOperand> matchSimpleOperand(const Init *Arg,
5353
const Record *ArgRec = ArgDef->getDef();
5454

5555
// Match 'RegClass:$name' or 'RegOp:$name'.
56-
if (const Record *ArgRC = T.getInitValueAsRegClass(Arg)) {
57-
if (!T.getRegisterClass(OpRC).hasSubClass(&T.getRegisterClass(ArgRC)))
58-
return createStringError(
59-
"argument register class" + ArgRC->getName() +
60-
" is not a subclass of operand register class " +
61-
OpRC->getName());
62-
if (!ArgName)
63-
return createStringError("register class argument must have a name");
56+
if (const Record *ArgRC = T.getInitValueAsRegClassLike(Arg)) {
57+
if (ArgRC->isSubClassOf("RegisterClass")) {
58+
if (!T.getRegisterClass(OpRC).hasSubClass(&T.getRegisterClass(ArgRC)))
59+
return createStringError(
60+
"argument register class" + ArgRC->getName() +
61+
" is not a subclass of operand register class " +
62+
OpRC->getName());
63+
if (!ArgName)
64+
return createStringError(
65+
"register class argument must have a name");
66+
}
67+
68+
// TODO: Verify RegClassByHwMode usage
69+
6470
return ResultOperand::createRecord(ArgName->getAsUnquotedString(),
6571
ArgRec);
6672
}

llvm/utils/TableGen/Common/CodeGenTarget.cpp

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -197,29 +197,38 @@ void CodeGenTarget::ReadLegalValueTypes() const {
197197
LegalValueTypes.erase(llvm::unique(LegalValueTypes), LegalValueTypes.end());
198198
}
199199

200-
const Record *CodeGenTarget::getInitValueAsRegClass(const Init *V) const {
201-
if (const DefInit *VDefInit = dyn_cast<DefInit>(V)) {
202-
const Record *RegClass = VDefInit->getDef();
203-
if (RegClass->isSubClassOf("RegisterOperand"))
204-
RegClass = RegClass->getValueAsDef("RegClass");
205-
206-
if (RegClass->isSubClassOf("RegisterClass"))
207-
return RegClass;
208-
209-
// FIXME: We should figure out the hwmode and dispatch. But this interface
210-
// is broken, we should be returning a register class. The expected uses
211-
// will use the same RegBanks in all modes.
212-
if (RegClass->isSubClassOf("RegClassByHwMode")) {
213-
const HwModeSelect &ModeSelect = getHwModes().getHwModeSelect(RegClass);
214-
if (ModeSelect.Items.empty())
215-
return nullptr;
216-
return ModeSelect.Items.front().second;
217-
}
200+
const Record *CodeGenTarget::getInitValueAsRegClass(
201+
const Init *V, bool AssumeRegClassByHwModeIsDefault) const {
202+
const Record *RegClassLike = getInitValueAsRegClassLike(V);
203+
if (!RegClassLike || RegClassLike->isSubClassOf("RegisterClass"))
204+
return RegClassLike;
205+
206+
// FIXME: We should figure out the hwmode and dispatch. But this interface
207+
// is broken, we should be returning a register class. The expected uses
208+
// will use the same RegBanks in all modes.
209+
if (AssumeRegClassByHwModeIsDefault &&
210+
RegClassLike->isSubClassOf("RegClassByHwMode")) {
211+
const HwModeSelect &ModeSelect = getHwModes().getHwModeSelect(RegClassLike);
212+
if (ModeSelect.Items.empty())
213+
return nullptr;
214+
return ModeSelect.Items.front().second;
218215
}
219216

220217
return nullptr;
221218
}
222219

220+
const Record *CodeGenTarget::getInitValueAsRegClassLike(const Init *V) const {
221+
const DefInit *VDefInit = dyn_cast<DefInit>(V);
222+
if (!VDefInit)
223+
return nullptr;
224+
225+
const Record *RegClass = VDefInit->getDef();
226+
if (RegClass->isSubClassOf("RegisterOperand"))
227+
RegClass = RegClass->getValueAsDef("RegClass");
228+
229+
return RegClass->isSubClassOf("RegisterClassLike") ? RegClass : nullptr;
230+
}
231+
223232
CodeGenSchedModels &CodeGenTarget::getSchedModels() const {
224233
if (!SchedModels)
225234
SchedModels = std::make_unique<CodeGenSchedModels>(Records, *this);

llvm/utils/TableGen/Common/CodeGenTarget.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,20 @@ class CodeGenTarget {
152152
return LegalValueTypes;
153153
}
154154

155-
const Record *getInitValueAsRegClass(const Init *V) const;
155+
/// If \p V is a DefInit that can be interpreted as a RegisterClass (e.g.,
156+
/// it's a RegisterOperand, or a direct RegisterClass reference), return the
157+
/// Record for that RegisterClass.
158+
///
159+
/// AssumeRegClassByHwModeIsDefault is a hack which should be removed. It's
160+
/// only happens to be adequate for the current GlobalISel usage.
161+
const Record *
162+
getInitValueAsRegClass(const Init *V,
163+
bool AssumeRegClassByHwModeIsDefault = false) const;
164+
165+
/// If \p V is a DefInit that can be interpreted as a RegisterClassLike,
166+
/// return the Record. This is used as a convenience function to handle direct
167+
/// RegisterClass references, or those wrapped in a RegisterOperand.
168+
const Record *getInitValueAsRegClassLike(const Init *V) const;
156169

157170
CodeGenSchedModels &getSchedModels() const;
158171

llvm/utils/TableGen/Common/InfoByHwMode.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,6 @@ struct RegClassByHwMode : public InfoByHwMode<const CodeGenRegisterClass *> {
253253
RegClassByHwMode() = default;
254254
};
255255

256-
raw_ostream &operator<<(raw_ostream &OS, const RegSizeInfo &T);
257-
raw_ostream &operator<<(raw_ostream &OS, const RegClassByHwMode &T);
258-
259256
} // namespace llvm
260257

261258
#endif // LLVM_UTILS_TABLEGEN_COMMON_INFOBYHWMODE_H

llvm/utils/TableGen/GlobalISelEmitter.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1137,7 +1137,9 @@ Error GlobalISelEmitter::importChildMatcher(
11371137
ChildRec->isSubClassOf("RegisterOperand") ||
11381138
ChildRec->isSubClassOf("RegClassByHwMode")) {
11391139
OM.addPredicate<RegisterBankOperandMatcher>(
1140-
Target.getRegisterClass(Target.getInitValueAsRegClass(ChildDefInit)));
1140+
Target.getRegisterClass(Target.getInitValueAsRegClass(
1141+
ChildDefInit,
1142+
/*AssumeRegClassByHwModeIsDefault=*/true)));
11411143
return Error::success();
11421144
}
11431145

0 commit comments

Comments
 (0)