[PATCH] [TableGen] Sort intrinsics in reverse order for intrinsic name matcher
Sean Silva
silvas at purdue.edu
Tue Jul 23 13:27:14 PDT 2013
LGTM. Jakob, does this look good to commit?
-- Sean Silva
On Tue, Jul 23, 2013 at 5:23 AM, Justin Holewinski <
justin.holewinski at gmail.com> wrote:
> Add missing test case
>
> http://llvm-reviews.chandlerc.com/D1128
>
> CHANGE SINCE LAST DIFF
> http://llvm-reviews.chandlerc.com/D1128?vs=2947&id=2966#toc
>
> Files:
> test/TableGen/intrinsic-order.td
> utils/TableGen/IntrinsicEmitter.cpp
>
> Index: test/TableGen/intrinsic-order.td
> ===================================================================
> --- /dev/null
> +++ test/TableGen/intrinsic-order.td
> @@ -0,0 +1,35 @@
> +// RUN: llvm-tblgen -gen-intrinsic %s | FileCheck %s
> +
> +class IntrinsicProperty;
> +
> +class ValueType<int size, int value> {
> + string Namespace = "MVT";
> + int Size = size;
> + int Value = value;
> +}
> +
> +class LLVMType<ValueType vt> {
> + ValueType VT = vt;
> +}
> +
> +class Intrinsic<string name, list<LLVMType> param_types = []> {
> + string LLVMName = name;
> + bit isTarget = 0;
> + string TargetPrefix = "";
> + list<LLVMType> RetTypes = [];
> + list<LLVMType> ParamTypes = param_types;
> + list<IntrinsicProperty> Properties = [];
> +}
> +
> +def iAny : ValueType<0, 254>;
> +def llvm_anyint_ty : LLVMType<iAny>;
> +
> +
> +// Make sure an intrinsic name that is a prefix of another is checked
> after the
> +// other.
> +
> +// CHECK: if (NameR.startswith("oo.bar.")) return Intrinsic::foo_bar;
> +// CHECK: if (NameR.startswith("oo.")) return Intrinsic::foo;
> +
> +def int_foo : Intrinsic<"llvm.foo", [llvm_anyint_ty]>;
> +def int_foo_bar : Intrinsic<"llvm.foo.bar", [llvm_anyint_ty]>;
> Index: utils/TableGen/IntrinsicEmitter.cpp
> ===================================================================
> --- utils/TableGen/IntrinsicEmitter.cpp
> +++ utils/TableGen/IntrinsicEmitter.cpp
> @@ -131,6 +131,20 @@
> OS << "#endif\n\n";
> }
>
> +struct IntrinsicNameSorter {
> + IntrinsicNameSorter(const std::vector<CodeGenIntrinsic> &I)
> + : Ints(I) {}
> +
> + // Sort in reverse order of intrinsic name so "abc.def" appears after
> + // "abd.def.ghi" in the overridden name matcher
> + bool operator()(unsigned i, unsigned j) {
> + return Ints[i].Name > Ints[j].Name;
> + }
> +
> +private:
> + const std::vector<CodeGenIntrinsic> &Ints;
> +};
> +
> void IntrinsicEmitter::
> EmitFnNameRecognizer(const std::vector<CodeGenIntrinsic> &Ints,
> raw_ostream &OS) {
> @@ -144,12 +158,16 @@
> OS << " StringRef NameR(Name+6, Len-6); // Skip over 'llvm.'\n";
> OS << " switch (Name[5]) { // Dispatch on first
> letter.\n";
> OS << " default: break;\n";
> + IntrinsicNameSorter Sorter(Ints);
> // Emit the intrinsic matching stuff by first letter.
> for (std::map<char, std::vector<unsigned> >::iterator I =
> IntMapping.begin(),
> E = IntMapping.end(); I != E; ++I) {
> OS << " case '" << I->first << "':\n";
> std::vector<unsigned> &IntList = I->second;
>
> + // Sort intrinsics in reverse order of their names
> + std::sort(IntList.begin(), IntList.end(), Sorter);
> +
> // Emit all the overloaded intrinsics first, build a table of the
> // non-overloaded ones.
> std::vector<StringMatcher::StringPair> MatchTable;
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130723/1aec6a37/attachment.html>
More information about the llvm-commits
mailing list