https://gcc.gnu.org/g:af130c679e2cdcc69d6abb356793e8b9bcd1a27e

commit af130c679e2cdcc69d6abb356793e8b9bcd1a27e
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Tue Apr 22 19:11:36 2025 +0200

    gimple-exec: prise en charge comparaison pointeurs

Diff:
---
 gcc/cgraphunit.cc | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 125 insertions(+)

diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc
index 0475f277875a..108ddc4e369a 100644
--- a/gcc/cgraphunit.cc
+++ b/gcc/cgraphunit.cc
@@ -4438,6 +4438,28 @@ exec_context::evaluate_condition (gcond *cond) const
       else
        gcc_unreachable ();
     }
+  else if (lhs_type == VAL_ADDRESS && rhs_type == VAL_ADDRESS)
+    {
+      storage_address *laddr = val_lhs.get_address ();
+      storage_address *raddr = val_rhs.get_address ();
+
+      gcc_assert (laddr != nullptr && raddr != nullptr);
+
+      bool equal = &laddr->storage.get () == &raddr->storage.get ()
+                  && laddr->offset == raddr->offset;
+
+      switch (code)
+       {
+       case EQ_EXPR:
+         return equal;
+
+       case NE_EXPR:
+         return !equal;
+
+       default:
+         gcc_unreachable ();
+       }
+    }
   else if ((lhs_type == VAL_CONSTANT && rhs_type == VAL_ADDRESS)
           || (lhs_type == VAL_ADDRESS && rhs_type == VAL_CONSTANT))
     {
@@ -7405,6 +7427,109 @@ exec_context_evaluate_condition_tests ()
   gcond *cond4 = gimple_build_cond (EQ_EXPR, p1, p2, NULL_TREE, NULL_TREE);
 
   ASSERT_FALSE (ctx2.evaluate_condition (cond4));
+
+
+  heap_memory mem3;
+  context_printer printer3;
+
+  tree x1 = create_var (integer_type_node, "x1");
+  tree x2 = create_var (integer_type_node, "x2");
+  tree px1 = create_var (ptr_type_node, "px1");
+  tree px2 = create_var (ptr_type_node, "px2");
+
+  vec<tree> decls3 {};
+  decls3.safe_push (x1);
+  decls3.safe_push (x2);
+  decls3.safe_push (px1);
+  decls3.safe_push (px2);
+
+  context_builder builder3 {};
+  builder3.add_decls (&decls3);
+  exec_context ctx3 = builder3.build (mem3, printer3);
+
+  data_storage *strg3_x1 = ctx3.find_reachable_var (x1);
+  gcc_assert (strg3_x1 != nullptr);
+  storage_address addr_x1 (strg3_x1->get_ref (), 0);
+  data_value val_addr1 (HOST_BITS_PER_PTR);
+  val_addr1.set_address (addr_x1);
+
+  data_storage *strg3_px1 = ctx3.find_reachable_var (px1);
+  gcc_assert (strg3_px1 != nullptr);
+  strg3_px1->set (val_addr1);
+
+  gcond *cond5 = gimple_build_cond (EQ_EXPR, px1, px1, NULL_TREE, NULL_TREE);
+
+  ASSERT_TRUE (ctx3.evaluate_condition (cond5));
+
+  gcond *cond6 = gimple_build_cond (NE_EXPR, px1, px1, NULL_TREE, NULL_TREE);
+
+  ASSERT_FALSE (ctx3.evaluate_condition (cond6));
+
+  data_storage *strg3_x2 = ctx3.find_reachable_var (x2);
+  gcc_assert (strg3_x2 != nullptr);
+  storage_address addr_x2 (strg3_x2->get_ref (), 0);
+  data_value val_addr2 (HOST_BITS_PER_PTR);
+  val_addr2.set_address (addr_x2);
+
+  data_storage *strg3_px2 = ctx3.find_reachable_var (px2);
+  gcc_assert (strg3_px2 != nullptr);
+  strg3_px2->set (val_addr2);
+
+  gcond *cond7 = gimple_build_cond (EQ_EXPR, px1, px2, NULL_TREE, NULL_TREE);
+
+  ASSERT_FALSE (ctx3.evaluate_condition (cond7));
+
+  gcond *cond8 = gimple_build_cond (NE_EXPR, px2, px1, NULL_TREE, NULL_TREE);
+
+  ASSERT_TRUE (ctx3.evaluate_condition (cond8));
+
+
+  heap_memory mem4;
+  context_printer printer4;
+
+  tree pm1 = create_var (ptr_type_node, "pm1");
+  tree pm2 = create_var (ptr_type_node, "pm2");
+
+  vec<tree> decls4 {};
+  decls4.safe_push (pm1);
+  decls4.safe_push (pm2);
+
+  context_builder builder4 {};
+  builder4.add_decls (&decls4);
+  exec_context ctx4 = builder4.build (mem4, printer4);
+
+  data_storage & m1 = ctx4.allocate (4);
+  storage_address addr_m11 (m1.get_ref (), CHAR_BIT);
+  data_value val_addr_m11 (HOST_BITS_PER_PTR);
+  val_addr_m11.set_address (addr_m11);
+
+  data_storage *strg4_pm1 = ctx4.find_reachable_var (pm1);
+  gcc_assert (strg4_pm1 != nullptr);
+  strg4_pm1->set (val_addr_m11);
+
+  storage_address addr_m12 (m1.get_ref (), 2 * CHAR_BIT);
+  data_value val_addr_m12 (HOST_BITS_PER_PTR);
+  val_addr_m12.set_address (addr_m12);
+
+  data_storage *strg4_pm2 = ctx4.find_reachable_var (pm2);
+  gcc_assert (strg4_pm2 != nullptr);
+  strg4_pm2->set (val_addr_m12);
+
+  gcond *cond09 = gimple_build_cond (EQ_EXPR, pm1, pm2, NULL_TREE, NULL_TREE);
+
+  ASSERT_FALSE (ctx4.evaluate_condition (cond09));
+
+  gcond *cond10 = gimple_build_cond (NE_EXPR, pm2, pm1, NULL_TREE, NULL_TREE);
+
+  ASSERT_TRUE (ctx4.evaluate_condition (cond10));
+
+  gcond *cond11 = gimple_build_cond (EQ_EXPR, pm1, pm1, NULL_TREE, NULL_TREE);
+
+  ASSERT_TRUE (ctx4.evaluate_condition (cond11));
+
+  gcond *cond12 = gimple_build_cond (NE_EXPR, pm2, pm2, NULL_TREE, NULL_TREE);
+
+  ASSERT_FALSE (ctx4.evaluate_condition (cond12));
 }
 
 void

Reply via email to