[llvm-commits] [llvm] r146657 - in /llvm/trunk/utils/TableGen: CodeGenRegisters.cpp CodeGenRegisters.h

Jakob Stoklund Olesen stoklund at 2pi.dk
Thu Dec 15 08:58:15 PST 2011


After deduping, these are the new classes:

ARM::GPRnopc_and_hGPR
ARM::hGPR_and_rGPR
ARM::hGPR_and_tcGPR
ARM::tGPR_and_tcGPR

X86::GR32_ABCD_and_GR32_NOAX
X86::GR32_AD_and_GR32_NOAX
X86::GR32_NOAX_and_GR32_NOREX
X86::GR32_NOAX_and_GR32_NOREX_NOSP
X86::GR32_NOAX_and_GR32_NOSP
X86::GR32_NOAX_and_GR32_TC
X86::GR64_ABCD_and_GR64_TC
X86::GR64_NOREX_NOSP_and_GR64_TC
X86::GR64_NOREX_and_GR64_TC
X86::GR64_NOSP_and_GR64_TC

/jakob

On Dec 15, 2011, at 8:48 AM, Jakob Stoklund Olesen wrote:

> Author: stoklund
> Date: Thu Dec 15 10:48:55 2011
> New Revision: 146657
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=146657&view=rev
> Log:
> Synthesize missing register class intersections.
> 
> The function TRI::getCommonSubClass(A, B) returns the largest common
> sub-class of the register classes A and B.  This patch teaches TableGen
> to synthesize sub-classes such that the answer is always maximal.
> 
> In other words, every register that is in both A and B will also be
> present in getCommonSubClass(A, B).
> 
> This introduces these synthetic register classes:
> 
> ARM:
>    GPRnopc_and_hGPR
>    GPRnopc_and_hGPR
>    hGPR_and_rGPR
>    GPRnopc_and_hGPR
>    GPRnopc_and_hGPR
>    hGPR_and_rGPR
>    tGPR_and_tcGPR
>    hGPR_and_tcGPR
> 
> X86:
>    GR32_NOAX_and_GR32_NOSP
>    GR32_NOAX_and_GR32_NOREX
>    GR64_NOSP_and_GR64_TC
>    GR64_NOSP_and_GR64_TC
>    GR64_NOREX_and_GR64_TC
>    GR32_NOAX_and_GR32_NOSP
>    GR32_NOAX_and_GR32_NOREX
>    GR32_NOAX_and_GR32_NOREX_NOSP
>    GR64_NOSP_and_GR64_TC
>    GR64_NOREX_and_GR64_TC
>    GR64_NOREX_NOSP_and_GR64_TC
>    GR32_NOAX_and_GR32_NOSP
>    GR32_NOAX_and_GR32_NOREX
>    GR32_NOAX_and_GR32_NOREX_NOSP
>    GR32_ABCD_and_GR32_NOAX
>    GR32_NOAX_and_GR32_NOSP
>    GR32_NOAX_and_GR32_NOREX
>    GR32_NOAX_and_GR32_NOREX_NOSP
>    GR32_ABCD_and_GR32_NOAX
>    GR32_NOAX_and_GR32_TC
>    GR32_NOAX_and_GR32_NOSP
>    GR64_NOSP_and_GR64_TC
>    GR32_NOAX_and_GR32_NOREX
>    GR32_NOAX_and_GR32_NOREX_NOSP
>    GR64_NOREX_and_GR64_TC
>    GR64_NOREX_NOSP_and_GR64_TC
>    GR32_ABCD_and_GR32_NOAX
>    GR64_ABCD_and_GR64_TC
>    GR32_NOAX_and_GR32_TC
>    GR32_AD_and_GR32_NOAX
> 
> Other targets are unaffected.
> 
> Modified:
>    llvm/trunk/utils/TableGen/CodeGenRegisters.cpp
>    llvm/trunk/utils/TableGen/CodeGenRegisters.h
> 
> Modified: llvm/trunk/utils/TableGen/CodeGenRegisters.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenRegisters.cpp?rev=146657&r1=146656&r2=146657&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/CodeGenRegisters.cpp (original)
> +++ llvm/trunk/utils/TableGen/CodeGenRegisters.cpp Thu Dec 15 10:48:55 2011
> @@ -756,6 +756,43 @@
>   computeComposites();
> }
> 
> +//
> +// Synthesize missing register class intersections.
> +//
> +// Make sure that sub-classes of RC exists such that getCommonSubClass(RC, X)
> +// returns a maximal register class for all X.
> +//
> +void CodeGenRegBank::inferCommonSubClass(CodeGenRegisterClass *RC) {
> +  for (unsigned rci = 0, rce = RegClasses.size(); rci != rce; ++rci) {
> +    CodeGenRegisterClass *RC1 = RC;
> +    CodeGenRegisterClass *RC2 = RegClasses[rci];
> +    if (RC1 == RC2)
> +      continue;
> +
> +    // Compute the set intersection of RC1 and RC2.
> +    const CodeGenRegister::Set &Memb1 = RC1->getMembers();
> +    const CodeGenRegister::Set &Memb2 = RC2->getMembers();
> +    CodeGenRegister::Set Intersection;
> +    std::set_intersection(Memb1.begin(), Memb1.end(),
> +                          Memb2.begin(), Memb2.end(),
> +                          std::inserter(Intersection, Intersection.begin()));
> +
> +    // Skip disjoint class pairs.
> +    if (Intersection.empty())
> +      continue;
> +
> +    // If RC1 and RC2 have different spill sizes or alignments, use the
> +    // larger size for sub-classing.  If they are equal, prefer RC1.
> +    if (RC2->SpillSize > RC1->SpillSize ||
> +        (RC2->SpillSize == RC1->SpillSize &&
> +         RC2->SpillAlignment > RC1->SpillAlignment))
> +      std::swap(RC1, RC2);
> +
> +    getOrCreateSubClass(RC1, &Intersection,
> +                        RC1->getName() + "_and_" + RC2->getName());
> +  }
> +}
> +
> // Infer missing register classes.
> //
> // For every register class RC, make sure that the set of registers in RC with
> @@ -801,6 +838,9 @@
>                             RC.getName() + "_with_" + I->first->getName());
>       RC.setSubClassWithSubReg(SubIdx, SubRC);
>     }
> +
> +    // Synthesize answers for getCommonSubClass().
> +    inferCommonSubClass(&RC);
>   }
> }
> 
> 
> Modified: llvm/trunk/utils/TableGen/CodeGenRegisters.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenRegisters.h?rev=146657&r1=146656&r2=146657&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/CodeGenRegisters.h (original)
> +++ llvm/trunk/utils/TableGen/CodeGenRegisters.h Thu Dec 15 10:48:55 2011
> @@ -244,6 +244,7 @@
> 
>     // Infer missing register classes.
>     void computeInferredRegisterClasses();
> +    void inferCommonSubClass(CodeGenRegisterClass *RC);
> 
>     // Composite SubRegIndex instances.
>     // Map (SubRegIndex, SubRegIndex) -> SubRegIndex.
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list