1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00
llvm-mirror/utils/TableGen/GlobalISel/GIMatchDagOperands.cpp
Daniel Sanders c57301aa25 Revert "Temporarily Revert "[gicombiner] Add the MatchDag structure and parse instruction DAG's from the input""
This reverts commit e62e760f29567fe0841af870c65a4f8ef685d217.

The issue @uweigand raised should have been fixed by iterating over the
vector that owns the operand list data instead of the FoldingSet.

The MSVC issue raised by @thakis should have been fixed by relaxing the
regexes a little. I don't have a Windows machine available to test that so
I tested it by using `perl -p -e 's/0x([0-9a-f]+)/\U\1\E/g' to convert the
output of %p to the windows style.

I've guessed at the issue @phosek raised as there wasn't enough information
to investigate it. What I think is happening on that bot is the -debug
option isn't available because the second stage build is a release build.
I'm not sure why other release-mode bots didn't report it though.
2019-12-18 11:37:12 +00:00

154 lines
4.7 KiB
C++

//===- GIMatchDagOperands.cpp - A shared operand list for nodes -----------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "GIMatchDagOperands.h"
#include "../CodeGenInstruction.h"
using namespace llvm;
void GIMatchDagOperand::Profile(FoldingSetNodeID &ID) const {
Profile(ID, Idx, Name, IsDef);
}
void GIMatchDagOperand::Profile(FoldingSetNodeID &ID, size_t Idx,
StringRef Name, bool IsDef) {
ID.AddInteger(Idx);
ID.AddString(Name);
ID.AddBoolean(IsDef);
}
void GIMatchDagOperandList::add(StringRef Name, unsigned Idx, bool IsDef) {
assert(Idx == Operands.size() && "Operands added in wrong order");
Operands.emplace_back(Operands.size(), Name, IsDef);
OperandsByName.try_emplace(Operands.back().getName(), Operands.size() - 1);
}
void GIMatchDagOperandList::Profile(FoldingSetNodeID &ID) const {
for (const auto &I : enumerate(Operands))
GIMatchDagOperand::Profile(ID, I.index(), I.value().getName(),
I.value().isDef());
}
void GIMatchDagOperandList::print(raw_ostream &OS) const {
if (Operands.empty()) {
OS << "<empty>";
return;
}
StringRef Separator = "";
for (const auto &I : Operands) {
OS << Separator << I.getIdx() << ":" << I.getName();
if (I.isDef())
OS << "<def>";
Separator = ", ";
}
}
const GIMatchDagOperandList::value_type &GIMatchDagOperandList::
operator[](StringRef K) const {
const auto &I = OperandsByName.find(K);
assert(I != OperandsByName.end() && "Operand not found by name");
return Operands[I->second];
}
const GIMatchDagOperandList &
GIMatchDagOperandListContext::makeEmptyOperandList() {
FoldingSetNodeID ID;
void *InsertPoint;
GIMatchDagOperandList *Value =
OperandLists.FindNodeOrInsertPos(ID, InsertPoint);
if (Value)
return *Value;
std::unique_ptr<GIMatchDagOperandList> NewValue =
std::make_unique<GIMatchDagOperandList>();
OperandLists.InsertNode(NewValue.get(), InsertPoint);
OperandListsOwner.push_back(std::move(NewValue));
return *OperandListsOwner.back().get();
}
const GIMatchDagOperandList &
GIMatchDagOperandListContext::makeOperandList(const CodeGenInstruction &I) {
FoldingSetNodeID ID;
for (unsigned i = 0; i < I.Operands.size(); ++i)
GIMatchDagOperand::Profile(ID, i, I.Operands[i].Name,
i < I.Operands.NumDefs);
void *InsertPoint;
GIMatchDagOperandList *Value =
OperandLists.FindNodeOrInsertPos(ID, InsertPoint);
if (Value)
return *Value;
std::unique_ptr<GIMatchDagOperandList> NewValue =
std::make_unique<GIMatchDagOperandList>();
for (unsigned i = 0; i < I.Operands.size(); ++i)
NewValue->add(I.Operands[i].Name, i, i < I.Operands.NumDefs);
OperandLists.InsertNode(NewValue.get(), InsertPoint);
OperandListsOwner.push_back(std::move(NewValue));
return *OperandListsOwner.back().get();
}
const GIMatchDagOperandList &
GIMatchDagOperandListContext::makeMIPredicateOperandList() {
FoldingSetNodeID ID;
GIMatchDagOperand::Profile(ID, 0, "$", true);
GIMatchDagOperand::Profile(ID, 1, "mi", false);
void *InsertPoint;
GIMatchDagOperandList *Value =
OperandLists.FindNodeOrInsertPos(ID, InsertPoint);
if (Value)
return *Value;
std::unique_ptr<GIMatchDagOperandList> NewValue =
std::make_unique<GIMatchDagOperandList>();
NewValue->add("$", 0, true);
NewValue->add("mi", 1, false);
OperandLists.InsertNode(NewValue.get(), InsertPoint);
OperandListsOwner.push_back(std::move(NewValue));
return *OperandListsOwner.back().get();
}
const GIMatchDagOperandList &
GIMatchDagOperandListContext::makeTwoMOPredicateOperandList() {
FoldingSetNodeID ID;
GIMatchDagOperand::Profile(ID, 0, "$", true);
GIMatchDagOperand::Profile(ID, 1, "mi0", false);
GIMatchDagOperand::Profile(ID, 2, "mi1", false);
void *InsertPoint;
GIMatchDagOperandList *Value =
OperandLists.FindNodeOrInsertPos(ID, InsertPoint);
if (Value)
return *Value;
std::unique_ptr<GIMatchDagOperandList> NewValue =
std::make_unique<GIMatchDagOperandList>();
NewValue->add("$", 0, true);
NewValue->add("mi0", 1, false);
NewValue->add("mi1", 2, false);
OperandLists.InsertNode(NewValue.get(), InsertPoint);
OperandListsOwner.push_back(std::move(NewValue));
return *OperandListsOwner.back().get();
}
void GIMatchDagOperandListContext::print(raw_ostream &OS) const {
OS << "GIMatchDagOperandListContext {\n"
<< " OperandLists {\n";
for (const auto &I : OperandListsOwner) {
OS << " ";
I->print(OS);
OS << "\n";
}
OS << " }\n"
<< "}\n";
}