Message ID | 20230418164007.341221-1-aldyh@redhat.com |
---|---|
State | New |
Headers | show |
Series | Fix pointer sharing in Value_Range constructor. | expand |
On 4/18/23 18:40, Aldy Hernandez wrote: > I will push this when a final round of testing finishes on x86-64 Linux. > > gcc/ChangeLog: > > * value-range.h (Value_Range::Value_Range): Avoid pointer sharing. > --- > gcc/value-range.h | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/gcc/value-range.h b/gcc/value-range.h > index 0eeea79b322..f97596cdd14 100644 > --- a/gcc/value-range.h > +++ b/gcc/value-range.h > @@ -583,7 +583,18 @@ Value_Range::Value_Range (tree min, tree max, value_range_kind kind) > inline > Value_Range::Value_Range (const Value_Range &r) > { > - m_vrange = r.m_vrange; > + if (r.m_vrange == &r.m_irange) > + { > + m_irange = r.m_irange; > + m_vrange = &m_irange; > + } > + else if (r.m_vrange == &r.m_frange) > + { > + m_frange = r.m_frange; > + m_vrange = &m_frange; > + } > + else > + m_vrange = &m_unsupported; > } > > // Initialize object so it is possible to store temporaries of TYPE Upon further thought I realized operator= will do all the right things, and makes the code easier to read. Re-tested and pushed.
diff --git a/gcc/value-range.h b/gcc/value-range.h index 0eeea79b322..f97596cdd14 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -583,7 +583,18 @@ Value_Range::Value_Range (tree min, tree max, value_range_kind kind) inline Value_Range::Value_Range (const Value_Range &r) { - m_vrange = r.m_vrange; + if (r.m_vrange == &r.m_irange) + { + m_irange = r.m_irange; + m_vrange = &m_irange; + } + else if (r.m_vrange == &r.m_frange) + { + m_frange = r.m_frange; + m_vrange = &m_frange; + } + else + m_vrange = &m_unsupported; } // Initialize object so it is possible to store temporaries of TYPE