@@ -42,6 +42,10 @@ class IRType extends TIRType {
4242 *
4343 * This will hold for all `IRType` objects except `IRUnknownType`.
4444 */
45+ // This predicate is overridden with `pragma[noinline]` in every leaf subclass.
46+ // This allows callers to ask for things like _the_ floating-point type of
47+ // size 4 without getting a join that first finds all types of size 4 and
48+ // _then_ restricts them to floating-point types.
4549 int getByteSize ( ) { none ( ) }
4650
4751 /**
@@ -104,8 +108,6 @@ private class IRSizedType extends IRType {
104108 this = TIRFunctionAddressType ( byteSize ) or
105109 this = TIROpaqueType ( _, byteSize )
106110 }
107-
108- final override int getByteSize ( ) { result = byteSize }
109111}
110112
111113/**
@@ -117,6 +119,9 @@ class IRBooleanType extends IRSizedType, TIRBooleanType {
117119 final override Language:: LanguageType getCanonicalLanguageType ( ) {
118120 result = Language:: getCanonicalBooleanType ( byteSize )
119121 }
122+
123+ pragma [ noinline]
124+ final override int getByteSize ( ) { result = byteSize }
120125}
121126
122127/**
@@ -141,6 +146,9 @@ class IRSignedIntegerType extends IRNumericType, TIRSignedIntegerType {
141146 final override Language:: LanguageType getCanonicalLanguageType ( ) {
142147 result = Language:: getCanonicalSignedIntegerType ( byteSize )
143148 }
149+
150+ pragma [ noinline]
151+ final override int getByteSize ( ) { result = byteSize }
144152}
145153
146154/**
@@ -153,6 +161,9 @@ class IRUnsignedIntegerType extends IRNumericType, TIRUnsignedIntegerType {
153161 final override Language:: LanguageType getCanonicalLanguageType ( ) {
154162 result = Language:: getCanonicalUnsignedIntegerType ( byteSize )
155163 }
164+
165+ pragma [ noinline]
166+ final override int getByteSize ( ) { result = byteSize }
156167}
157168
158169/**
@@ -164,6 +175,9 @@ class IRFloatingPointType extends IRNumericType, TIRFloatingPointType {
164175 final override Language:: LanguageType getCanonicalLanguageType ( ) {
165176 result = Language:: getCanonicalFloatingPointType ( byteSize )
166177 }
178+
179+ pragma [ noinline]
180+ final override int getByteSize ( ) { result = byteSize }
167181}
168182
169183/**
@@ -178,6 +192,9 @@ class IRAddressType extends IRSizedType, TIRAddressType {
178192 final override Language:: LanguageType getCanonicalLanguageType ( ) {
179193 result = Language:: getCanonicalAddressType ( byteSize )
180194 }
195+
196+ pragma [ noinline]
197+ final override int getByteSize ( ) { result = byteSize }
181198}
182199
183200/**
@@ -190,6 +207,9 @@ class IRFunctionAddressType extends IRSizedType, TIRFunctionAddressType {
190207 final override Language:: LanguageType getCanonicalLanguageType ( ) {
191208 result = Language:: getCanonicalFunctionAddressType ( byteSize )
192209 }
210+
211+ pragma [ noinline]
212+ final override int getByteSize ( ) { result = byteSize }
193213}
194214
195215/**
@@ -218,6 +238,9 @@ class IROpaqueType extends IRSizedType, TIROpaqueType {
218238 * same size.
219239 */
220240 final Language:: OpaqueTypeTag getTag ( ) { result = tag }
241+
242+ pragma [ noinline]
243+ final override int getByteSize ( ) { result = byteSize }
221244}
222245
223246module IRTypeSanity {
0 commit comments