Fix pointer sharing in Value_Range constructor.

Message ID 20230418164007.341221-1-aldyh@redhat.com
State New
Headers
Series Fix pointer sharing in Value_Range constructor. |

Commit Message

Aldy Hernandez April 18, 2023, 4:40 p.m. UTC
  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(-)
  

Comments

Aldy Hernandez April 19, 2023, 12:25 p.m. UTC | #1
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.
  

Patch

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