blob: a0bcaa4f9bf587839a3134e4b5d1d0dda0a01f58 [file] [log] [blame]
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|* *|
|* Global Combiner *|
|* *|
|* Automatically generated file, do not edit! *|
|* *|
\*===----------------------------------------------------------------------===*/
#ifdef AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
#include "llvm/ADT/SparseBitVector.h"
namespace llvm {
extern cl::OptionCategory GICombinerOptionCategory;
} // end namespace llvm
#endif // ifdef AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
#ifdef AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H
class AArch64GenO0PreLegalizerCombinerHelperRuleConfig {
SparseBitVector<> DisabledRules;
public:
bool parseCommandLineOption();
bool isRuleDisabled(unsigned ID) const;
bool setRuleEnabled(StringRef RuleIdentifier);
bool setRuleDisabled(StringRef RuleIdentifier);
};
class AArch64GenO0PreLegalizerCombinerHelper : public AArch64O0PreLegalizerCombinerHelperState {
const AArch64GenO0PreLegalizerCombinerHelperRuleConfig *RuleConfig;
public:
template <typename... Args>AArch64GenO0PreLegalizerCombinerHelper(const AArch64GenO0PreLegalizerCombinerHelperRuleConfig &RuleConfig, Args &&... args) : AArch64O0PreLegalizerCombinerHelperState(std::forward<Args>(args)...), RuleConfig(&RuleConfig) {}
bool tryCombineAll(
GISelChangeObserver &Observer,
MachineInstr &MI,
MachineIRBuilder &B) const;
};
static std::optional<uint64_t> getRuleIdxForIdentifier(StringRef RuleIdentifier) {
uint64_t I;
// getAtInteger(...) returns false on success
bool Parsed = !RuleIdentifier.getAsInteger(0, I);
if (Parsed)
return I;
#ifndef NDEBUG
switch (RuleIdentifier.size()) {
default: break;
case 9: // 1 string to match.
if (memcmp(RuleIdentifier.data()+0, "copy_prop", 9) != 0)
break;
return 0; // "copy_prop"
case 10: // 1 string to match.
if (memcmp(RuleIdentifier.data()+0, "mul_to_shl", 10) != 0)
break;
return 1; // "mul_to_shl"
case 12: // 1 string to match.
if (memcmp(RuleIdentifier.data()+0, "not_cmp_fold", 12) != 0)
break;
return 8; // "not_cmp_fold"
case 13: // 1 string to match.
if (memcmp(RuleIdentifier.data()+0, "load_and_mask", 13) != 0)
break;
return 7; // "load_and_mask"
case 14: // 1 string to match.
if (memcmp(RuleIdentifier.data()+0, "mul_by_neg_one", 14) != 0)
break;
return 3; // "mul_by_neg_one"
case 15: // 2 strings to match.
switch (RuleIdentifier[0]) {
default: break;
case 'e': // 1 string to match.
if (memcmp(RuleIdentifier.data()+1, "xtending_loads", 14) != 0)
break;
return 6; // "extending_loads"
case 'i': // 1 string to match.
if (memcmp(RuleIdentifier.data()+1, "dempotent_prop", 14) != 0)
break;
return 4; // "idempotent_prop"
}
break;
case 17: // 1 string to match.
if (memcmp(RuleIdentifier.data()+0, "add_p2i_to_ptradd", 17) != 0)
break;
return 2; // "add_p2i_to_ptradd"
case 19: // 1 string to match.
if (memcmp(RuleIdentifier.data()+0, "ptr_add_immed_chain", 19) != 0)
break;
return 5; // "ptr_add_immed_chain"
case 28: // 1 string to match.
if (memcmp(RuleIdentifier.data()+0, "opt_brcond_by_inverting_cond", 28) != 0)
break;
return 9; // "opt_brcond_by_inverting_cond"
}
#endif // ifndef NDEBUG
return std::nullopt;
}
static std::optional<std::pair<uint64_t, uint64_t>> getRuleRangeForIdentifier(StringRef RuleIdentifier) {
std::pair<StringRef, StringRef> RangePair = RuleIdentifier.split('-');
if (!RangePair.second.empty()) {
const auto First = getRuleIdxForIdentifier(RangePair.first);
const auto Last = getRuleIdxForIdentifier(RangePair.second);
if (!First || !Last)
return std::nullopt;
if (First >= Last)
report_fatal_error("Beginning of range should be before end of range");
return {{*First, *Last + 1}};
}
if (RangePair.first == "*") {
return {{0, 10}};
}
const auto I = getRuleIdxForIdentifier(RangePair.first);
if (!I)
return std::nullopt;
return {{*I, *I + 1}};
}
bool AArch64GenO0PreLegalizerCombinerHelperRuleConfig::setRuleEnabled(StringRef RuleIdentifier) {
auto MaybeRange = getRuleRangeForIdentifier(RuleIdentifier);
if (!MaybeRange)
return false;
for (auto I = MaybeRange->first; I < MaybeRange->second; ++I)
DisabledRules.reset(I);
return true;
}
bool AArch64GenO0PreLegalizerCombinerHelperRuleConfig::setRuleDisabled(StringRef RuleIdentifier) {
auto MaybeRange = getRuleRangeForIdentifier(RuleIdentifier);
if (!MaybeRange)
return false;
for (auto I = MaybeRange->first; I < MaybeRange->second; ++I)
DisabledRules.set(I);
return true;
}
bool AArch64GenO0PreLegalizerCombinerHelperRuleConfig::isRuleDisabled(unsigned RuleID) const {
return DisabledRules.test(RuleID);
}
#endif // ifdef AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H
#ifdef AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP
std::vector<std::string> AArch64O0PreLegalizerCombinerHelperOption;
cl::list<std::string> AArch64O0PreLegalizerCombinerHelperDisableOption(
"aarch64o0prelegalizercombinerhelper-disable-rule",
cl::desc("Disable one or more combiner rules temporarily in the AArch64O0PreLegalizerCombinerHelper pass"),
cl::CommaSeparated,
cl::Hidden,
cl::cat(GICombinerOptionCategory),
cl::callback([](const std::string &Str) {
AArch64O0PreLegalizerCombinerHelperOption.push_back(Str);
}));
cl::list<std::string> AArch64O0PreLegalizerCombinerHelperOnlyEnableOption(
"aarch64o0prelegalizercombinerhelper-only-enable-rule",
cl::desc("Disable all rules in the AArch64O0PreLegalizerCombinerHelper pass then re-enable the specified ones"),
cl::Hidden,
cl::cat(GICombinerOptionCategory),
cl::callback([](const std::string &CommaSeparatedArg) {
StringRef Str = CommaSeparatedArg;
AArch64O0PreLegalizerCombinerHelperOption.push_back("*");
do {
auto X = Str.split(",");
AArch64O0PreLegalizerCombinerHelperOption.push_back(("!" + X.first).str());
Str = X.second;
} while (!Str.empty());
}));
bool AArch64GenO0PreLegalizerCombinerHelperRuleConfig::parseCommandLineOption() {
for (StringRef Identifier : AArch64O0PreLegalizerCombinerHelperOption) {
bool Enabled = Identifier.consume_front("!");
if (Enabled && !setRuleEnabled(Identifier))
return false;
if (!Enabled && !setRuleDisabled(Identifier))
return false;
}
return true;
}
bool AArch64GenO0PreLegalizerCombinerHelper::tryCombineAll(
GISelChangeObserver &Observer,
MachineInstr &MI,
MachineIRBuilder &B) const {
MachineBasicBlock *MBB = MI.getParent();
MachineFunction *MF = MBB->getParent();
MachineRegisterInfo &MRI = MF->getRegInfo();
SmallVector<MachineInstr *, 8> MIs = {&MI};
(void)MBB; (void)MF; (void)MRI; (void)RuleConfig;
// Match data
unsigned MatchData1;
std::pair<Register, bool> MatchData2;
PtrAddChain MatchData5;
PreferredTuple MatchData6;
std::function<void(MachineIRBuilder &)> MatchData7;
SmallVector<Register, 4> MatchData8;
MachineInstr * MatchData9;
int Partition = -1;
Partition = -1;
switch (MIs[0]->getOpcode()) {
case TargetOpcode::COPY: Partition = 0; break;
case TargetOpcode::G_MUL: Partition = 1; break;
case TargetOpcode::G_ADD: Partition = 2; break;
case TargetOpcode::G_FREEZE: Partition = 3; break;
case TargetOpcode::G_FABS: Partition = 4; break;
case TargetOpcode::G_FCANONICALIZE: Partition = 5; break;
case TargetOpcode::G_PTR_ADD: Partition = 6; break;
case TargetOpcode::G_LOAD: Partition = 7; break;
case TargetOpcode::G_SEXTLOAD: Partition = 8; break;
case TargetOpcode::G_ZEXTLOAD: Partition = 9; break;
case TargetOpcode::G_AND: Partition = 10; break;
case TargetOpcode::G_XOR: Partition = 11; break;
case TargetOpcode::G_BR: Partition = 12; break;
}
// Default case but without conflicting with potential default case in selection.
if (Partition == -1) return false;
if (Partition == 0 /* TargetOpcode::COPY */) {
// Leaf name: copy_prop
// Rule: copy_prop
if (!RuleConfig->isRuleDisabled(0)) {
if (1
&& [&]() {
return Helper.matchCombineCopy(*MIs[0]);
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'copy_prop'\n");
Helper.applyCombineCopy(*MIs[0]);
return true;
}
}
return false;
}
if (Partition == 1 /* TargetOpcode::G_MUL */) {
// Leaf name: mul_to_shl
// Rule: mul_to_shl
if (!RuleConfig->isRuleDisabled(1)) {
if (1
&& [&]() {
return Helper.matchCombineMulToShl(*MIs[0], MatchData1);
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'mul_to_shl'\n");
Helper.applyCombineMulToShl(*MIs[0], MatchData1);
return true;
}
}
// Leaf name: mul_by_neg_one
// Rule: mul_by_neg_one
if (!RuleConfig->isRuleDisabled(3)) {
if (1
&& [&]() {
return Helper.matchConstantOp(MIs[0]->getOperand(2), -1);
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'mul_by_neg_one'\n");
Helper.applyCombineMulByNegativeOne(*MIs[0]);
return true;
}
}
return false;
}
if (Partition == 2 /* TargetOpcode::G_ADD */) {
// Leaf name: add_p2i_to_ptradd
// Rule: add_p2i_to_ptradd
if (!RuleConfig->isRuleDisabled(2)) {
if (1
&& [&]() {
return Helper.matchCombineAddP2IToPtrAdd(*MIs[0], MatchData2);
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'add_p2i_to_ptradd'\n");
Helper.applyCombineAddP2IToPtrAdd(*MIs[0], MatchData2);
return true;
}
}
return false;
}
if (Partition == 3 /* TargetOpcode::G_FREEZE */) {
// Leaf name: idempotent_prop
// Rule: idempotent_prop
if (!RuleConfig->isRuleDisabled(4)) {
if (1
&& [&]() {
return MRI.getVRegDef(MIs[0]->getOperand(1).getReg())->getOpcode() ==
MIs[0]->getOpcode();
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'idempotent_prop'\n");
Helper.replaceSingleDefInstWithOperand(*MIs[0], 1);
return true;
}
}
return false;
}
if (Partition == 4 /* TargetOpcode::G_FABS */) {
// Leaf name: idempotent_prop
// Rule: idempotent_prop
if (!RuleConfig->isRuleDisabled(4)) {
if (1
&& [&]() {
return MRI.getVRegDef(MIs[0]->getOperand(1).getReg())->getOpcode() ==
MIs[0]->getOpcode();
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'idempotent_prop'\n");
Helper.replaceSingleDefInstWithOperand(*MIs[0], 1);
return true;
}
}
return false;
}
if (Partition == 5 /* TargetOpcode::G_FCANONICALIZE */) {
// Leaf name: idempotent_prop
// Rule: idempotent_prop
if (!RuleConfig->isRuleDisabled(4)) {
if (1
&& [&]() {
return MRI.getVRegDef(MIs[0]->getOperand(1).getReg())->getOpcode() ==
MIs[0]->getOpcode();
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'idempotent_prop'\n");
Helper.replaceSingleDefInstWithOperand(*MIs[0], 1);
return true;
}
}
return false;
}
if (Partition == 6 /* TargetOpcode::G_PTR_ADD */) {
// Leaf name: ptr_add_immed_chain
// Rule: ptr_add_immed_chain
if (!RuleConfig->isRuleDisabled(5)) {
if (1
&& [&]() {
return Helper.matchPtrAddImmedChain(*MIs[0], MatchData5);
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'ptr_add_immed_chain'\n");
Helper.applyPtrAddImmedChain(*MIs[0], MatchData5);
return true;
}
}
return false;
}
if (Partition == 7 /* TargetOpcode::G_LOAD */) {
// Leaf name: extending_loads
// Rule: extending_loads
if (!RuleConfig->isRuleDisabled(6)) {
if (1
&& [&]() {
return Helper.matchCombineExtendingLoads(*MIs[0], MatchData6);
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'extending_loads'\n");
Helper.applyCombineExtendingLoads(*MIs[0], MatchData6);
return true;
}
}
return false;
}
if (Partition == 8 /* TargetOpcode::G_SEXTLOAD */) {
// Leaf name: extending_loads
// Rule: extending_loads
if (!RuleConfig->isRuleDisabled(6)) {
if (1
&& [&]() {
return Helper.matchCombineExtendingLoads(*MIs[0], MatchData6);
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'extending_loads'\n");
Helper.applyCombineExtendingLoads(*MIs[0], MatchData6);
return true;
}
}
return false;
}
if (Partition == 9 /* TargetOpcode::G_ZEXTLOAD */) {
// Leaf name: extending_loads
// Rule: extending_loads
if (!RuleConfig->isRuleDisabled(6)) {
if (1
&& [&]() {
return Helper.matchCombineExtendingLoads(*MIs[0], MatchData6);
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'extending_loads'\n");
Helper.applyCombineExtendingLoads(*MIs[0], MatchData6);
return true;
}
}
return false;
}
if (Partition == 10 /* TargetOpcode::G_AND */) {
// Leaf name: load_and_mask
// Rule: load_and_mask
if (!RuleConfig->isRuleDisabled(7)) {
if (1
&& [&]() {
return Helper.matchCombineLoadWithAndMask(*MIs[0], MatchData7);
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'load_and_mask'\n");
Helper.applyBuildFn(*MIs[0], MatchData7);
return true;
}
}
return false;
}
if (Partition == 11 /* TargetOpcode::G_XOR */) {
// Leaf name: not_cmp_fold
// Rule: not_cmp_fold
if (!RuleConfig->isRuleDisabled(8)) {
if (1
&& [&]() {
return Helper.matchNotCmp(*MIs[0], MatchData8);
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'not_cmp_fold'\n");
Helper.applyNotCmp(*MIs[0], MatchData8);
return true;
}
}
return false;
}
if (Partition == 12 /* TargetOpcode::G_BR */) {
// Leaf name: opt_brcond_by_inverting_cond
// Rule: opt_brcond_by_inverting_cond
if (!RuleConfig->isRuleDisabled(9)) {
if (1
&& [&]() {
return Helper.matchOptBrCondByInvertingCond(*MIs[0], MatchData9);
return true;
}() ) {
LLVM_DEBUG(dbgs() << "Applying rule 'opt_brcond_by_inverting_cond'\n");
Helper.applyOptBrCondByInvertingCond(*MIs[0], MatchData9);
return true;
}
}
return false;
}
return false;
}
#endif // ifdef AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP