@@ -57,17 +57,30 @@ class TypeSizeWrapper {
5757 TypeSizeWrapper (uint64_t TSIn) : TS{FixedDLSize (TSIn)} {};
5858#endif
5959
60- SzType inBits () const { return asIntegral<1 >(); }
61- SzType inBytes () const { return asIntegral<ByteBits>(); }
62- SzType inWords () const { return asIntegral<WordBits>(); }
63- SzType inDWords () const { return asIntegral<DWordBits>(); }
64- SzType inQWords () const { return asIntegral<QWordBits>(); }
65- SzType inOWords () const { return asIntegral<OWordBits>(); }
60+ SzType inBytesCeil () const { return asIntegralCeil<ByteBits>(); }
61+ SzType inWordsCeil () const { return asIntegralCeil<WordBits>(); }
62+ SzType inDWordsCeil () const { return asIntegralCeil<DWordBits>(); }
63+ SzType inQWordsCeil () const { return asIntegralCeil<QWordBits>(); }
64+ SzType inOWordsCeil () const { return asIntegralCeil<OWordBits>(); }
65+
66+ SzType inBits () const { return asIntegralStrict<1 >(); }
67+ SzType inBytes () const { return asIntegralStrict<ByteBits>(); }
68+ SzType inWords () const { return asIntegralStrict<WordBits>(); }
69+ SzType inDWords () const { return asIntegralStrict<DWordBits>(); }
70+ SzType inQWords () const { return asIntegralStrict<QWordBits>(); }
71+ SzType inOWords () const { return asIntegralStrict<OWordBits>(); }
6672
6773 bool operator ==(const TypeSizeWrapper &Other) const { return TS == Other.TS ; }
6874
6975private:
70- template <unsigned UnitBitSize> SzType asIntegral () const {
76+ template <unsigned UnitBitSize> SzType asIntegralStrict () const {
77+ return asIntegral<UnitBitSize, true >();
78+ }
79+ template <unsigned UnitBitSize> SzType asIntegralCeil () const {
80+ return asIntegral<UnitBitSize, false >();
81+ }
82+
83+ template <unsigned UnitBitSize, bool Strict> SzType asIntegral () const {
7184#if LLVM_VERSION_MAJOR >= 10
7285 IGC_ASSERT (!TS.isScalable ());
7386 uint64_t BitsAsUI = TS.getFixedSize ();
@@ -77,7 +90,13 @@ class TypeSizeWrapper {
7790 IGC_ASSERT_MESSAGE (BitsAsUI <= std::numeric_limits<SzType>::max (),
7891 " Type is too large to operate on" );
7992 IGC_ASSERT_MESSAGE (BitsAsUI > 0 , " Could not determine size of Type" );
80- return static_cast <SzType>(llvm::divideCeil (BitsAsUI, UnitBitSize));
93+ if constexpr (Strict) {
94+ IGC_ASSERT_MESSAGE (BitsAsUI % UnitBitSize == 0 ,
95+ " Type size in bits cannot be represented in requested units exactly" );
96+ return BitsAsUI / UnitBitSize;
97+ } else {
98+ return static_cast <SzType>(llvm::divideCeil (BitsAsUI, UnitBitSize));
99+ }
81100 }
82101 DLTypeSize TS;
83102};
0 commit comments