diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2024-05-03 11:17:32 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2024-05-09 07:03:03 +0200 |
commit | d7ff8ae5313bea755f5960786b33a7b151e7b663 (patch) | |
tree | c2e882d80b0e9eb3b75f39858a8940d412fb8960 /gcc | |
parent | be3df704ce7de417682d57bc3e819dfcf0fdd501 (diff) | |
download | gcc-d7ff8ae5313bea755f5960786b33a7b151e7b663.zip gcc-d7ff8ae5313bea755f5960786b33a7b151e7b663.tar.gz gcc-d7ff8ae5313bea755f5960786b33a7b151e7b663.tar.bz2 |
[ranger] Force buffer alignment in Value_Range [PR114912]
gcc/ChangeLog:
PR tree-optimization/114912
* value-range.h (class Value_Range): Use a union.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/value-range.h | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/gcc/value-range.h b/gcc/value-range.h index 6e24874..44cdbd7 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -800,10 +800,14 @@ private: void init (const vrange &); vrange *m_vrange; - // The buffer must be at least the size of the largest range. - static_assert (sizeof (int_range_max) > sizeof (frange), ""); - static_assert (sizeof (int_range_max) > sizeof (prange), ""); - char m_buffer[sizeof (int_range_max)]; + union buffer_type { + int_range_max ints; + frange floats; + unsupported_range unsupported; + prange pointers; + buffer_type () { } + ~buffer_type () { } + } m_buffer; }; // The default constructor is uninitialized and must be initialized @@ -811,6 +815,7 @@ private: inline Value_Range::Value_Range () + : m_buffer () { m_vrange = NULL; } @@ -877,13 +882,13 @@ Value_Range::init (tree type) gcc_checking_assert (TYPE_P (type)); if (irange::supports_p (type)) - m_vrange = new (&m_buffer) int_range_max (); + m_vrange = new (&m_buffer.ints) int_range_max (); else if (prange::supports_p (type)) - m_vrange = new (&m_buffer) prange (); + m_vrange = new (&m_buffer.pointers) prange (); else if (frange::supports_p (type)) - m_vrange = new (&m_buffer) frange (); + m_vrange = new (&m_buffer.floats) frange (); else - m_vrange = new (&m_buffer) unsupported_range (); + m_vrange = new (&m_buffer.unsupported) unsupported_range (); } // Initialize object with a copy of R. @@ -892,13 +897,14 @@ inline void Value_Range::init (const vrange &r) { if (is_a <irange> (r)) - m_vrange = new (&m_buffer) int_range_max (as_a <irange> (r)); + m_vrange = new (&m_buffer.ints) int_range_max (as_a <irange> (r)); else if (is_a <prange> (r)) - m_vrange = new (&m_buffer) prange (as_a <prange> (r)); + m_vrange = new (&m_buffer.pointers) prange (as_a <prange> (r)); else if (is_a <frange> (r)) - m_vrange = new (&m_buffer) frange (as_a <frange> (r)); + m_vrange = new (&m_buffer.floats) frange (as_a <frange> (r)); else - m_vrange = new (&m_buffer) unsupported_range (as_a <unsupported_range> (r)); + m_vrange = new (&m_buffer.unsupported) + unsupported_range (as_a <unsupported_range> (r)); } // Assignment operator. Copying incompatible types is allowed. That |