<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<p style="font-family:Arial;font-size:10pt;color:#0078D7;margin:15pt;" align="Left">
[AMD Official Use Only - Internal Distribution Only]<br>
</p>
<br>
<div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
It made writing some unit tests that are still waiting for review more convenient<br>
</div>
<div id="appendonsend"></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>From:</b> Hans Wennborg <hans@chromium.org><br>
<b>Sent:</b> Wednesday, June 17, 2020 6:36 AM<br>
<b>To:</b> Arsenault, Matthew <Matthew.Arsenault@amd.com>; Matt Arsenault <llvmlistbot@llvm.org><br>
<b>Cc:</b> llvm-commits <llvm-commits@lists.llvm.org><br>
<b>Subject:</b> Re: [llvm] 5a95be2 - GlobalISel: Make LLT constructors constexpr</font>
<div class="PlainText"> <br>
<br>
Sadly it seems GCC 5.3 can't handle this, and since it's listed as a<br>
compiler we support<br>
(<a href="https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fllvm.org%2Fdocs%2FGettingStarted.html%23host-c-toolchain-both-compiler-and-standard-library&amp;data=02%7C01%7CMatthew.Arsenault%40amd.com%7C89be14bd01414409144308d812c36abd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637279977804480228&amp;sdata=1tIx9aWe5R2LIAN9bmJ5zCA5uV44K2slS4wJdDiQyfs%3D&amp;reserved=0">https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fllvm.org%2Fdocs%2FGettingStarted.html%23host-c-toolchain-both-compiler-and-standard-library&amp;data=02%7C01%7CMatthew.Arsenault%40amd.com%7C89be14bd01414409144308d812c36abd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637279977804480228&amp;sdata=1tIx9aWe5R2LIAN9bmJ5zCA5uV44K2slS4wJdDiQyfs%3D&amp;reserved=0</a>)<br>
I've reverted in 81cbe0ca83c2f912ff612ddb65629a108197b0d1<br>
<br>
The commit message also didn't really have a motivation, just more<br>
constexpr is better?<br>
<br>
On Tue, Jun 16, 2020 at 5:05 PM Matt Arsenault via llvm-commits<br>
<llvm-commits@lists.llvm.org> wrote:<br>
><br>
><br>
> Author: Matt Arsenault<br>
> Date: 2020-06-16T11:04:46-04:00<br>
> New Revision: 5a95be22d248be654b992dfb25e3850dbb182a14<br>
><br>
> URL: <a href="https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fllvm%2Fllvm-project%2Fcommit%2F5a95be22d248be654b992dfb25e3850dbb182a14&amp;data=02%7C01%7CMatthew.Arsenault%40amd.com%7C89be14bd01414409144308d812c36abd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637279977804480228&amp;sdata=NCUSDiciVVaXdc5y0xY13DG1BTfTuq1zryk4ngnuiXw%3D&amp;reserved=0">
https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fllvm%2Fllvm-project%2Fcommit%2F5a95be22d248be654b992dfb25e3850dbb182a14&amp;data=02%7C01%7CMatthew.Arsenault%40amd.com%7C89be14bd01414409144308d812c36abd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637279977804480228&amp;sdata=NCUSDiciVVaXdc5y0xY13DG1BTfTuq1zryk4ngnuiXw%3D&amp;reserved=0</a><br>
> DIFF: <a href="https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fllvm%2Fllvm-project%2Fcommit%2F5a95be22d248be654b992dfb25e3850dbb182a14.diff&amp;data=02%7C01%7CMatthew.Arsenault%40amd.com%7C89be14bd01414409144308d812c36abd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637279977804480228&amp;sdata=A%2Bkp1AC7t18A3DYen6aaHW1%2Fac1iFaaXbVW453LY0SU%3D&amp;reserved=0">
https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fllvm%2Fllvm-project%2Fcommit%2F5a95be22d248be654b992dfb25e3850dbb182a14.diff&amp;data=02%7C01%7CMatthew.Arsenault%40amd.com%7C89be14bd01414409144308d812c36abd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637279977804480228&amp;sdata=A%2Bkp1AC7t18A3DYen6aaHW1%2Fac1iFaaXbVW453LY0SU%3D&amp;reserved=0</a><br>
><br>
> LOG: GlobalISel: Make LLT constructors constexpr<br>
><br>
> Added:<br>
><br>
><br>
> Modified:<br>
>     llvm/include/llvm/Support/LowLevelTypeImpl.h<br>
>     llvm/unittests/CodeGen/LowLevelTypeTest.cpp<br>
><br>
> Removed:<br>
><br>
><br>
><br>
> ################################################################################<br>
> diff  --git a/llvm/include/llvm/Support/LowLevelTypeImpl.h b/llvm/include/llvm/Support/LowLevelTypeImpl.h<br>
> index 6959957cfc37..8e248342e017 100644<br>
> --- a/llvm/include/llvm/Support/LowLevelTypeImpl.h<br>
> +++ b/llvm/include/llvm/Support/LowLevelTypeImpl.h<br>
> @@ -39,14 +39,14 @@ class raw_ostream;<br>
>  class LLT {<br>
>  public:<br>
>    /// Get a low-level scalar or aggregate "bag of bits".<br>
> -  static LLT scalar(unsigned SizeInBits) {<br>
> +  static constexpr LLT scalar(unsigned SizeInBits) {<br>
>      assert(SizeInBits > 0 && "invalid scalar size");<br>
>      return LLT{/*isPointer=*/false, /*isVector=*/false, /*NumElements=*/0,<br>
>                 SizeInBits, /*AddressSpace=*/0};<br>
>    }<br>
><br>
>    /// Get a low-level pointer in the given address space.<br>
> -  static LLT pointer(unsigned AddressSpace, unsigned SizeInBits) {<br>
> +  static constexpr LLT pointer(unsigned AddressSpace, unsigned SizeInBits) {<br>
>      assert(SizeInBits > 0 && "invalid pointer size");<br>
>      return LLT{/*isPointer=*/true, /*isVector=*/false, /*NumElements=*/0,<br>
>                 SizeInBits, AddressSpace};<br>
> @@ -54,7 +54,7 @@ class LLT {<br>
><br>
>    /// Get a low-level vector of some number of elements and element width.<br>
>    /// \p NumElements must be at least 2.<br>
> -  static LLT vector(uint16_t NumElements, unsigned ScalarSizeInBits) {<br>
> +  static constexpr LLT vector(uint16_t NumElements, unsigned ScalarSizeInBits) {<br>
>      assert(NumElements > 1 && "invalid number of vector elements");<br>
>      assert(ScalarSizeInBits > 0 && "invalid vector element size");<br>
>      return LLT{/*isPointer=*/false, /*isVector=*/true, NumElements,<br>
> @@ -62,7 +62,7 @@ class LLT {<br>
>    }<br>
><br>
>    /// Get a low-level vector of some number of elements and element type.<br>
> -  static LLT vector(uint16_t NumElements, LLT ScalarTy) {<br>
> +  static constexpr LLT vector(uint16_t NumElements, LLT ScalarTy) {<br>
>      assert(NumElements > 1 && "invalid number of vector elements");<br>
>      assert(!ScalarTy.isVector() && "invalid vector element type");<br>
>      return LLT{ScalarTy.isPointer(), /*isVector=*/true, NumElements,<br>
> @@ -70,33 +70,34 @@ class LLT {<br>
>                 ScalarTy.isPointer() ? ScalarTy.getAddressSpace() : 0};<br>
>    }<br>
><br>
> -  static LLT scalarOrVector(uint16_t NumElements, LLT ScalarTy) {<br>
> +  static constexpr LLT scalarOrVector(uint16_t NumElements, LLT ScalarTy) {<br>
>      return NumElements == 1 ? ScalarTy : LLT::vector(NumElements, ScalarTy);<br>
>    }<br>
><br>
> -  static LLT scalarOrVector(uint16_t NumElements, unsigned ScalarSize) {<br>
> +  static constexpr LLT scalarOrVector(uint16_t NumElements, unsigned ScalarSize) {<br>
>      return scalarOrVector(NumElements, LLT::scalar(ScalarSize));<br>
>    }<br>
><br>
> -  explicit LLT(bool isPointer, bool isVector, uint16_t NumElements,<br>
> -               unsigned SizeInBits, unsigned AddressSpace) {<br>
> +  explicit constexpr LLT(bool isPointer, bool isVector, uint16_t NumElements,<br>
> +                         unsigned SizeInBits, unsigned AddressSpace)<br>
> +    : LLT() {<br>
>      init(isPointer, isVector, NumElements, SizeInBits, AddressSpace);<br>
>    }<br>
> -  explicit LLT() : IsPointer(false), IsVector(false), RawData(0) {}<br>
> +  explicit constexpr LLT() : IsPointer(false), IsVector(false), RawData(0) {}<br>
><br>
>    explicit LLT(MVT VT);<br>
><br>
> -  bool isValid() const { return RawData != 0; }<br>
> +  constexpr bool isValid() const { return RawData != 0; }<br>
><br>
> -  bool isScalar() const { return isValid() && !IsPointer && !IsVector; }<br>
> +  constexpr bool isScalar() const { return isValid() && !IsPointer && !IsVector; }<br>
><br>
> -  bool isPointer() const { return isValid() && IsPointer && !IsVector; }<br>
> +  constexpr bool isPointer() const { return isValid() && IsPointer && !IsVector; }<br>
><br>
> -  bool isVector() const { return isValid() && IsVector; }<br>
> +  constexpr bool isVector() const { return isValid() && IsVector; }<br>
><br>
>    /// Returns the number of elements in a vector LLT. Must only be called on<br>
>    /// vector types.<br>
> -  uint16_t getNumElements() const {<br>
> +  constexpr uint16_t getNumElements() const {<br>
>      assert(IsVector && "cannot get number of elements on scalar/aggregate");<br>
>      if (!IsPointer)<br>
>        return getFieldValue(VectorElementsFieldInfo);<br>
> @@ -105,7 +106,7 @@ class LLT {<br>
>    }<br>
><br>
>    /// Returns the total size of the type. Must only be called on sized types.<br>
> -  unsigned getSizeInBits() const {<br>
> +  constexpr unsigned getSizeInBits() const {<br>
>      if (isPointer() || isScalar())<br>
>        return getScalarSizeInBits();<br>
>      return getScalarSizeInBits() * getNumElements();<br>
> @@ -113,17 +114,17 @@ class LLT {<br>
><br>
>    /// Returns the total size of the type in bytes, i.e. number of whole bytes<br>
>    /// needed to represent the size in bits. Must only be called on sized types.<br>
> -  unsigned getSizeInBytes() const {<br>
> +  constexpr unsigned getSizeInBytes() const {<br>
>      return (getSizeInBits() + 7) / 8;<br>
>    }<br>
><br>
> -  LLT getScalarType() const {<br>
> +  constexpr LLT getScalarType() const {<br>
>      return isVector() ? getElementType() : *this;<br>
>    }<br>
><br>
>    /// If this type is a vector, return a vector with the same number of elements<br>
>    /// but the new element type. Otherwise, return the new element type.<br>
> -  LLT changeElementType(LLT NewEltTy) const {<br>
> +  constexpr LLT changeElementType(LLT NewEltTy) const {<br>
>      return isVector() ? LLT::vector(getNumElements(), NewEltTy) : NewEltTy;<br>
>    }<br>
><br>
> @@ -157,9 +158,9 @@ class LLT {<br>
>      return scalar(getSizeInBits() / Factor);<br>
>    }<br>
><br>
> -  bool isByteSized() const { return (getSizeInBits() & 7) == 0; }<br>
> +  constexpr bool isByteSized() const { return (getSizeInBits() & 7) == 0; }<br>
><br>
> -  unsigned getScalarSizeInBits() const {<br>
> +  constexpr unsigned getScalarSizeInBits() const {<br>
>      assert(RawData != 0 && "Invalid Type");<br>
>      if (!IsVector) {<br>
>        if (!IsPointer)<br>
> @@ -174,7 +175,7 @@ class LLT {<br>
>      }<br>
>    }<br>
><br>
> -  unsigned getAddressSpace() const {<br>
> +  constexpr unsigned getAddressSpace() const {<br>
>      assert(RawData != 0 && "Invalid Type");<br>
>      assert(IsPointer && "cannot get address space of non-pointer type");<br>
>      if (!IsVector)<br>
> @@ -184,7 +185,7 @@ class LLT {<br>
>    }<br>
><br>
>    /// Returns the vector's element type. Only valid for vector types.<br>
> -  LLT getElementType() const {<br>
> +  constexpr LLT getElementType() const {<br>
>      assert(isVector() && "cannot get element type of scalar/aggregate");<br>
>      if (IsPointer)<br>
>        return pointer(getAddressSpace(), getScalarSizeInBits());<br>
> @@ -201,12 +202,12 @@ class LLT {<br>
>    }<br>
>  #endif<br>
><br>
> -  bool operator==(const LLT &RHS) const {<br>
> +  constexpr bool operator==(const LLT &RHS) const {<br>
>      return IsPointer == RHS.IsPointer && IsVector == RHS.IsVector &&<br>
>             RHS.RawData == RawData;<br>
>    }<br>
><br>
> -  bool operator!=(const LLT &RHS) const { return !(*this == RHS); }<br>
> +  constexpr bool operator!=(const LLT &RHS) const { return !(*this == RHS); }<br>
><br>
>    friend struct DenseMapInfo<LLT>;<br>
>    friend class GISelInstProfileBuilder;<br>
> @@ -257,23 +258,24 @@ class LLT {<br>
>    uint64_t IsVector : 1;<br>
>    uint64_t RawData : 62;<br>
><br>
> -  static uint64_t getMask(const BitFieldInfo FieldInfo) {<br>
> +  static constexpr uint64_t getMask(const BitFieldInfo FieldInfo) {<br>
>      const int FieldSizeInBits = FieldInfo[0];<br>
>      return (((uint64_t)1) << FieldSizeInBits) - 1;<br>
>    }<br>
> -  static uint64_t maskAndShift(uint64_t Val, uint64_t Mask, uint8_t Shift) {<br>
> +  static constexpr uint64_t maskAndShift(uint64_t Val, uint64_t Mask, uint8_t Shift) {<br>
>      assert(Val <= Mask && "Value too large for field");<br>
>      return (Val & Mask) << Shift;<br>
>    }<br>
> -  static uint64_t maskAndShift(uint64_t Val, const BitFieldInfo FieldInfo) {<br>
> +  static constexpr uint64_t maskAndShift(uint64_t Val, const BitFieldInfo FieldInfo) {<br>
>      return maskAndShift(Val, getMask(FieldInfo), FieldInfo[1]);<br>
>    }<br>
> -  uint64_t getFieldValue(const BitFieldInfo FieldInfo) const {<br>
> +<br>
> +  constexpr uint64_t getFieldValue(const BitFieldInfo FieldInfo) const {<br>
>      return getMask(FieldInfo) & (RawData >> FieldInfo[1]);<br>
>    }<br>
><br>
> -  void init(bool IsPointer, bool IsVector, uint16_t NumElements,<br>
> -            unsigned SizeInBits, unsigned AddressSpace) {<br>
> +  constexpr void init(bool IsPointer, bool IsVector, uint16_t NumElements,<br>
> +                      unsigned SizeInBits, unsigned AddressSpace) {<br>
>      this->IsPointer = IsPointer;<br>
>      this->IsVector = IsVector;<br>
>      if (!IsVector) {<br>
> @@ -295,7 +297,7 @@ class LLT {<br>
>      }<br>
>    }<br>
><br>
> -  uint64_t getUniqueRAWLLTData() const {<br>
> +  constexpr uint64_t getUniqueRAWLLTData() const {<br>
>      return ((uint64_t)RawData) << 2 | ((uint64_t)IsPointer) << 1 |<br>
>             ((uint64_t)IsVector);<br>
>    }<br>
><br>
> diff  --git a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp<br>
> index 7ba678dad0cb..3d70ccff0acb 100644<br>
> --- a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp<br>
> +++ b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp<br>
> @@ -258,4 +258,16 @@ TEST(LowLevelTypeTest, Divide) {<br>
>              LLT::vector(4, LLT::pointer(1, 64)).divide(2));<br>
>  }<br>
><br>
> +constexpr LLT CELLT = LLT();<br>
> +constexpr LLT CES32 = LLT::scalar(32);<br>
> +constexpr LLT CEV2S32 = LLT::vector(2, 32);<br>
> +constexpr LLT CEP0 = LLT::pointer(0, 32);<br>
> +<br>
> +TEST(LowLevelTypeTest, ConstExpr) {<br>
> +  EXPECT_EQ(LLT(), CELLT);<br>
> +  EXPECT_EQ(LLT::scalar(32), CES32);<br>
> +  EXPECT_EQ(LLT::vector(2, 32), CEV2S32);<br>
> +  EXPECT_EQ(LLT::pointer(0, 32), CEP0);<br>
> +}<br>
> +<br>
>  }<br>
><br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> llvm-commits@lists.llvm.org<br>
> <a href="https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fllvm-commits&amp;data=02%7C01%7CMatthew.Arsenault%40amd.com%7C89be14bd01414409144308d812c36abd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637279977804480228&amp;sdata=4pj6lzj0R6olo2f%2BgTcPneDG6hV%2B2B2BOoBdafz0z8A%3D&amp;reserved=0">
https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fllvm-commits&amp;data=02%7C01%7CMatthew.Arsenault%40amd.com%7C89be14bd01414409144308d812c36abd%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637279977804480228&amp;sdata=4pj6lzj0R6olo2f%2BgTcPneDG6hV%2B2B2BOoBdafz0z8A%3D&amp;reserved=0</a><br>
</div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt"></span></font></div>
</div>
</body>
</html>