[llvm] r256725 - [TableGen] Fix a bug that caused the wrong name for a record built from a multiclass containing a defm called NAME that references another multiclass that contains a defm that uses NAME concatenated with other strings.

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 12 17:12:15 PST 2016


On Sun, Jan 3, 2016 at 7:05 PM, Craig Topper via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: ctopper
> Date: Sun Jan  3 21:05:14 2016
> New Revision: 256725
>
> URL: http://llvm.org/viewvc/llvm-project?rev=256725&view=rev
> Log:
> [TableGen] Fix a bug that caused the wrong name for a record built from a
> multiclass containing a defm called NAME that references another multiclass
> that contains a defm that uses NAME concatenated with other strings.
>
> It would end up doing the concatenations from the second multiclass twice.
> This occured because SetValue detected a self assignment when trying to set
> the value of NAME to a VarInit called NAME. NAME is special here and it
> will get cleaned up later. So add a flag to suppress the self assignment
> check for this case.
>
> Strangely the self-assignment error was returning false indicating it
> wasn't an error, but it wasn't doing the right thing. So this also changes
> it to report an error.
>
> This fixes the names of some AVX512 FMA instructions that showed this
> double expansion.
>

Any way to test any of this? (either tblgen directly, or the AVX512 stuff
that it was producing)


>
> Modified:
>     llvm/trunk/lib/TableGen/TGParser.cpp
>     llvm/trunk/lib/TableGen/TGParser.h
>
> Modified: llvm/trunk/lib/TableGen/TGParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TableGen/TGParser.cpp?rev=256725&r1=256724&r2=256725&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/TableGen/TGParser.cpp (original)
> +++ llvm/trunk/lib/TableGen/TGParser.cpp Sun Jan  3 21:05:14 2016
> @@ -77,7 +77,8 @@ bool TGParser::AddValue(Record *CurRec,
>  /// SetValue -
>  /// Return true on error, false on success.
>  bool TGParser::SetValue(Record *CurRec, SMLoc Loc, Init *ValName,
> -                        const std::vector<unsigned> &BitList, Init *V) {
> +                        const std::vector<unsigned> &BitList, Init *V,
> +                        bool AllowSelfAssignment) {
>    if (!V) return false;
>
>    if (!CurRec) CurRec = &CurMultiClass->Rec;
> @@ -91,8 +92,8 @@ bool TGParser::SetValue(Record *CurRec,
>    // in the resolution machinery.
>    if (BitList.empty())
>      if (VarInit *VI = dyn_cast<VarInit>(V))
> -      if (VI->getNameInit() == ValName)
> -        return false;
> +      if (VI->getNameInit() == ValName && !AllowSelfAssignment)
> +        return true;
>
>    // If we are assigning to a subset of the bits in the value... then we
> must be
>    // assigning to a field of BitsRecTy, which must have a BitsInit
> @@ -2359,7 +2360,8 @@ Record *TGParser::InstantiateMulticlassD
>    // though, so that uses in nested multiclass names don't get
>    // confused.
>    if (SetValue(CurRec.get(), Ref.RefRange.Start, "NAME",
> -               std::vector<unsigned>(), DefmPrefix)) {
> +               std::vector<unsigned>(), DefmPrefix,
> +               /*AllowSelfAssignment*/true)) {
>      Error(DefmPrefixRange.Start, "Could not resolve " +
>            CurRec->getNameInitAsString() + ":NAME to '" +
>            DefmPrefix->getAsUnquotedString() + "'");
>
> Modified: llvm/trunk/lib/TableGen/TGParser.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TableGen/TGParser.h?rev=256725&r1=256724&r2=256725&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/TableGen/TGParser.h (original)
> +++ llvm/trunk/lib/TableGen/TGParser.h Sun Jan  3 21:05:14 2016
> @@ -105,10 +105,13 @@ public:
>  private:  // Semantic analysis methods.
>    bool AddValue(Record *TheRec, SMLoc Loc, const RecordVal &RV);
>    bool SetValue(Record *TheRec, SMLoc Loc, Init *ValName,
> -                const std::vector<unsigned> &BitList, Init *V);
> +                const std::vector<unsigned> &BitList, Init *V,
> +                bool AllowSelfAssignment = false);
>    bool SetValue(Record *TheRec, SMLoc Loc, const std::string &ValName,
> -                const std::vector<unsigned> &BitList, Init *V) {
> -    return SetValue(TheRec, Loc, StringInit::get(ValName), BitList, V);
> +                const std::vector<unsigned> &BitList, Init *V,
> +                bool AllowSelfAssignment = false) {
> +    return SetValue(TheRec, Loc, StringInit::get(ValName), BitList, V,
> +                    AllowSelfAssignment);
>    }
>    bool AddSubClass(Record *Rec, SubClassReference &SubClass);
>    bool AddSubMultiClass(MultiClass *CurMC,
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160112/eef7356d/attachment.html>


More information about the llvm-commits mailing list