[gcc(refs/users/marxin/heads/if-to-switch-v5)] Playground #1.

Martin Liska marxin@gcc.gnu.org
Tue Oct 13 14:02:25 GMT 2020


https://gcc.gnu.org/g:20a62dddd38cf7368c1c402809819e8c69283976

commit 20a62dddd38cf7368c1c402809819e8c69283976
Author: Martin Liska <mliska@suse.cz>
Date:   Thu Oct 8 12:48:16 2020 +0200

    Playground #1.

Diff:
---
 gcc/gimple-if-to-switch.cc | 60 ++++++++++++++++++++++++++++++++++++++++++++++
 gcc/tree-ssa-reassoc.c     | 34 ++++++--------------------
 gcc/tree.h                 | 28 ++++++++++++++++++++++
 3 files changed, 95 insertions(+), 27 deletions(-)

diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc
index f066432e9b7..7b547136287 100644
--- a/gcc/gimple-if-to-switch.cc
+++ b/gcc/gimple-if-to-switch.cc
@@ -548,6 +548,66 @@ analyze_condition_in_bb (basic_block bb)
   tree rhs = gimple_cond_rhs (cond);
   tree_code code = gimple_cond_code (cond);
 
+  operand_rank = new hash_map<tree, long>;
+  debug_bb(bb);
+
+  if (code == NE_EXPR)
+    {
+      gassign *def = dyn_cast<gassign *> (SSA_NAME_DEF_STMT (lhs));
+      if (def)
+	{
+      enum tree_code rhs_code = gimple_assign_rhs_code (def);
+      if (associative_tree_code (rhs_code))
+	{
+	  auto_vec<operand_entry *> ops;
+	  if (TREE_CODE (lhs) == SSA_NAME && has_zero_uses (lhs))
+	    ;
+	  else
+	    {
+	      linearize_expr_tree (&ops, def, true, false);
+	      unsigned length = ops.length ();
+	      struct range_entry *ranges = XNEWVEC (struct range_entry, length);
+	      for (unsigned i = 0; i < length; i++)
+		{
+		  operand_entry *oe = ops[i];
+		  ranges[i].idx = i;
+		  init_range_entry (ranges + i, oe->op,
+				    oe->op
+				    ? NULL
+				    : last_stmt (BASIC_BLOCK_FOR_FN (cfun, oe->id)));
+		  /* For | invert it now, we will invert it again before emitting
+		     the optimized expression.  */
+		  if (rhs_code == BIT_IOR_EXPR
+		      || (rhs_code == ERROR_MARK && oe->rank == BIT_IOR_EXPR))
+		    ranges[i].in_p = !ranges[i].in_p;
+		  debug_range_entry (&ranges[i]);
+		}
+	      fprintf (stderr, "\n");
+
+	      int a = 2;
+	    }
+	}
+	}
+      else
+	{
+      struct range_entry entry;
+      init_range_entry (&entry, NULL_TREE, cond);
+      debug_range_entry (&entry);
+      fprintf (stderr, "\n");
+
+	}
+    }
+  else
+    {
+      struct range_entry entry;
+      init_range_entry (&entry, NULL_TREE, cond);
+      debug_range_entry (&entry);
+      fprintf (stderr, "\n");
+    }
+
+  delete operand_rank;
+  operand_rank = NULL;
+
   /* Situation 1.  */
   if (code == EQ_EXPR)
     {
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index a2ca1713d4b..6f83d184fb9 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -188,15 +188,6 @@ static struct
   int pows_created;
 } reassociate_stats;
 
-/* Operator, rank pair.  */
-struct operand_entry
-{
-  unsigned int rank;
-  unsigned int id;
-  tree op;
-  unsigned int count;
-  gimple *stmt_to_insert;
-};
 
 static object_allocator<operand_entry> operand_entry_pool
   ("operand entry pool");
@@ -211,7 +202,7 @@ static unsigned int next_operand_entry_id;
 static long *bb_rank;
 
 /* Operand->rank hashtable.  */
-static hash_map<tree, long> *operand_rank;
+hash_map<tree, long> *operand_rank;
 
 /* Vector of SSA_NAMEs on which after reassociate_bb is done with
    all basic blocks the CFG should be adjusted - basic blocks
@@ -226,7 +217,7 @@ static bool reassoc_stmt_dominates_stmt_p (gimple *, gimple *);
 /* Wrapper around gsi_remove, which adjusts gimple_uid of debug stmts
    possibly added by gsi_remove.  */
 
-bool
+static bool
 reassoc_remove_stmt (gimple_stmt_iterator *gsi)
 {
   gimple *stmt = gsi_stmt (*gsi);
@@ -1060,8 +1051,6 @@ eliminate_using_constants (enum tree_code opcode,
 }
 
 
-static void linearize_expr_tree (vec<operand_entry *> *, gimple *,
-				 bool, bool);
 
 /* Structure for tracking and counting operands.  */
 struct oecount {
@@ -2406,18 +2395,7 @@ optimize_ops_list (enum tree_code opcode,
    For more information see comments above fold_test_range in fold-const.c,
    this implementation is for GIMPLE.  */
 
-struct range_entry
-{
-  tree exp;
-  tree low;
-  tree high;
-  bool in_p;
-  bool strict_overflow_p;
-  unsigned int idx, next;
-};
 
-void dump_range_entry (FILE *file, struct range_entry *r);
-void debug_range_entry (struct range_entry *r);
 
 /* Dump the range entry R to FILE, skipping its expression if SKIP_EXP.  */
 
@@ -2447,7 +2425,7 @@ debug_range_entry (struct range_entry *r)
    an SSA_NAME and STMT argument is ignored, otherwise STMT
    argument should be a GIMPLE_COND.  */
 
-static void
+void
 init_range_entry (struct range_entry *r, tree exp, gimple *stmt)
 {
   int in_p;
@@ -3805,7 +3783,9 @@ optimize_range_tests (enum tree_code opcode,
       if (opcode == BIT_IOR_EXPR
 	  || (opcode == ERROR_MARK && oe->rank == BIT_IOR_EXPR))
 	ranges[i].in_p = !ranges[i].in_p;
+//      debug_range_entry (&ranges[i]);
     }
+//  fprintf (stderr, "\n");
 
   qsort (ranges, length, sizeof (*ranges), range_entry_cmp);
   for (i = 0; i < length; i++)
@@ -4693,7 +4673,7 @@ maybe_optimize_range_tests (gimple *stmt)
       if (bb == first_bb)
 	break;
     }
-  if (ops.length () > 1)
+//  if (ops.length () > 1)
     any_changes = optimize_range_tests (ERROR_MARK, &ops, first_bb);
   if (any_changes)
     {
@@ -5605,7 +5585,7 @@ try_special_add_to_ops (vec<operand_entry *> *ops,
 /* Recursively linearize a binary expression that is the RHS of STMT.
    Place the operands of the expression tree in the vector named OPS.  */
 
-static void
+void
 linearize_expr_tree (vec<operand_entry *> *ops, gimple *stmt,
 		     bool is_associative, bool set_visited)
 {
diff --git a/gcc/tree.h b/gcc/tree.h
index f43ac9f1942..3f6ec2886d1 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -6356,4 +6356,32 @@ public:
   operator location_t () const { return m_combined_loc; }
 };
 
+void dump_range_entry (FILE *file, struct range_entry *r);
+void debug_range_entry (struct range_entry *r);
+void init_range_entry (struct range_entry *r, tree exp, gimple *stmt);
+
+/* Operator, rank pair.  */
+struct operand_entry
+{
+  unsigned int rank;
+  unsigned int id;
+  tree op;
+  unsigned int count;
+  gimple *stmt_to_insert;
+};
+
+struct range_entry
+{
+  tree exp;
+  tree low;
+  tree high;
+  bool in_p;
+  bool strict_overflow_p;
+  unsigned int idx, next;
+};
+
+
+void linearize_expr_tree (vec<operand_entry *> *, gimple *, bool, bool);
+extern hash_map<tree, long> *operand_rank;
+
 #endif  /* GCC_TREE_H  */


More information about the Gcc-cvs mailing list