RFR: 8338197: ubsan: ad_x86.hpp:6417:11: runtime error: shift exponent 100 is too large for 32-bit type 'unsigned int' [v3]
Boris Ulasevich
bulasevich at openjdk.org
Mon Aug 25 14:17:14 UTC 2025
On Fri, 22 Aug 2025 22:43:46 GMT, Vladimir Kozlov <kvn at openjdk.org> wrote:
>> Yes, if `sizeof(uint)` is 32 bits on all our platforms.
>>
>> Hmm, may be we should use `uint32_t` for `_mask` here. Then we can use 32 and 31 without confusion.
>
> I mean to use `_mask <<= (n < 32) ? n : 31;`
Good! Let me correct both variants then. The resulting code is:
class Pipeline_Use_Cycle_Mask {
protected:
uint32_t _mask;
public:
Pipeline_Use_Cycle_Mask() : _mask(0) {}
Pipeline_Use_Cycle_Mask(uint32_t mask) : _mask(mask) {}
bool overlaps(const Pipeline_Use_Cycle_Mask &in2) const {
return ((_mask & in2._mask) != 0);
}
Pipeline_Use_Cycle_Mask& operator<<=(int n) {
_mask <<= (n < 32) ? n : 31;
return *this;
}
void Or(const Pipeline_Use_Cycle_Mask &in2) {
_mask |= in2._mask;
}
friend Pipeline_Use_Cycle_Mask operator&(const Pipeline_Use_Cycle_Mask &, const Pipeline_Use_Cycle_Mask &);
friend Pipeline_Use_Cycle_Mask operator|(const Pipeline_Use_Cycle_Mask &, const Pipeline_Use_Cycle_Mask &);
friend class Pipeline_Use;
friend class Pipeline_Use_Element;
};
// code generated for arm32:
class Pipeline_Use_Cycle_Mask {
protected:
uint32_t _mask1, _mask2, _mask3;
public:
Pipeline_Use_Cycle_Mask() : _mask1(0), _mask2(0), _mask3(0) {}
Pipeline_Use_Cycle_Mask(uint32_t mask1, uint32_t mask2, uint32_t mask3) : _mask1(mask1), _mask2(mask2), _mask3(mask3) {}
Pipeline_Use_Cycle_Mask intersect(const Pipeline_Use_Cycle_Mask &in2) {
Pipeline_Use_Cycle_Mask out;
out._mask1 = _mask1 & in2._mask1;
out._mask2 = _mask2 & in2._mask2;
out._mask3 = _mask3 & in2._mask3;
return out;
}
bool overlaps(const Pipeline_Use_Cycle_Mask &in2) const {
return ((_mask1 & in2._mask1) != 0) || ((_mask2 & in2._mask2) != 0) || ((_mask3 & in2._mask3) != 0);
}
Pipeline_Use_Cycle_Mask& operator<<=(int n) {
if (n >= 32)
do {
_mask3 = _mask2; _mask2 = _mask1; _mask1 = 0;
} while ((n -= 32) >= 32);
if (n > 0) {
uint m = 32 - n;
uint32_t mask = (1 << n) - 1;
uint32_t temp2 = mask & (_mask1 >> m); _mask1 <<= n;
uint32_t temp3 = mask & (_mask2 >> m); _mask2 <<= n; _mask2 |= temp2;
_mask3 <<= n; _mask3 |= temp3;
}
return *this;
}
void Or(const Pipeline_Use_Cycle_Mask &);
friend Pipeline_Use_Cycle_Mask operator&(const Pipeline_Use_Cycle_Mask &, const Pipeline_Use_Cycle_Mask &);
friend Pipeline_Use_Cycle_Mask operator|(const Pipeline_Use_Cycle_Mask &, const Pipeline_Use_Cycle_Mask &);
friend class Pipeline_Use;
friend class Pipeline_Use_Element;
};
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/26890#discussion_r2298235985
More information about the hotspot-compiler-dev
mailing list