@@ -57,17 +57,30 @@ class TypeSizeWrapper {
57
57
TypeSizeWrapper (uint64_t TSIn) : TS{FixedDLSize (TSIn)} {};
58
58
#endif
59
59
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>(); }
66
72
67
73
bool operator ==(const TypeSizeWrapper &Other) const { return TS == Other.TS ; }
68
74
69
75
private:
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 {
71
84
#if LLVM_VERSION_MAJOR >= 10
72
85
IGC_ASSERT (!TS.isScalable ());
73
86
uint64_t BitsAsUI = TS.getFixedSize ();
@@ -77,7 +90,13 @@ class TypeSizeWrapper {
77
90
IGC_ASSERT_MESSAGE (BitsAsUI <= std::numeric_limits<SzType>::max (),
78
91
" Type is too large to operate on" );
79
92
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
+ }
81
100
}
82
101
DLTypeSize TS;
83
102
};
0 commit comments