public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/pheeck/heads/sccp)] fixing errors in alt ssa, started working on trivial phis
@ 2023-04-19 19:02 Filip Kastl
0 siblings, 0 replies; only message in thread
From: Filip Kastl @ 2023-04-19 19:02 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:82b18ac71af47ae43a03c5cb85241258fcacd047
commit 82b18ac71af47ae43a03c5cb85241258fcacd047
Author: Filip Kastl <filip.kastl@gmail.com>
Date: Wed Apr 19 21:02:09 2023 +0200
fixing errors in alt ssa, started working on trivial phis
Diff:
---
gcc/insert-gimple-ssa.cc | 200 ++++++++++++++++++++++++++++++-----------------
gcc/insert-gimple-ssa.h | 46 ++++++++---
2 files changed, 163 insertions(+), 83 deletions(-)
diff --git a/gcc/insert-gimple-ssa.cc b/gcc/insert-gimple-ssa.cc
index e4f0e3ab15e..37e7e8ba680 100644
--- a/gcc/insert-gimple-ssa.cc
+++ b/gcc/insert-gimple-ssa.cc
@@ -53,21 +53,46 @@ along with GCC; see the file COPYING3. If not see
#include "tree-phinodes.h"
#include "insert-gimple-ssa.h"
+void
+hphi::replace_op_by (hstmt_left *op, hstmt_left *replace_by)
+{
+ if (op_p == NULL)
+ return;
+
+ unsigned i;
+ for (i = 0; i < num_ops; i++)
+ {
+ if ((*op_p)[i].s == op)
+ (*op_p)[i].s = replace_by;
+ }
+}
+
+void
+hstmt_assign::replace_op_by (hstmt_left *op, hstmt_left *replace_by)
+{
+ unsigned i;
+ for (i = 0; i < val->num_ops; i++)
+ {
+ if (val->op[i] == op)
+ val->op[i] = replace_by;
+ }
+}
+
gimple *
hstmt_assign::to_gimple (void)
{
gcc_checking_assert (ssa != NULL_TREE);
- tree op1 = op[1];
+ tree op1 = val->op[1]->ssa;
tree op2 = NULL_TREE;
tree op3 = NULL_TREE;
- if (num_ops >= 2)
- op2 = op[2];
- if (num_ops >= 3)
- op3 = op[3];
+ if (val->num_ops >= 2)
+ op2 = val->op[2]->ssa;
+ if (val->num_ops >= 3)
+ op3 = val->op[3]->ssa;
- return gimple_build_assign (lhs, code, op1, op2, op3);
+ return gimple_build_assign (ssa, val->code, op1, op2, op3);
}
hack_tuple &
@@ -80,6 +105,8 @@ hack_ssa_builder::tuple_alloc (enum tree_code code, unsigned num_ops)
(num_ops - 1) * sizeof (class hack_lvalue *);
hack_tuple *result = XNEWVAR (struct hack_tuple, size);
+ result->code = code;
+
allocated_tuples.safe_push (result);
return *result;
@@ -112,9 +139,9 @@ void
hack_ssa_builder::append_assign (basic_block bb, hack_lvalue &left,
hack_tuple &right)
{
- hstmt *stmt;
+ hstmt_left *stmt;
- hack_tuple_internal *val = tuple_to_internal (right);
+ hack_tuple_internal *val = tuple_to_internal (bb, &right);
stmt = tuple_lookup (bb, val);
if (stmt == NULL)
{
@@ -126,7 +153,7 @@ hack_ssa_builder::append_assign (basic_block bb, hack_lvalue &left,
append_stmt (bb, stmt);
tuple_register (bb, stmt);
- /* Update users list of appropriate stmts. */
+ /* Update uses list of appropriate stmts. */
unsigned i;
for (i = 0; i < val->num_ops; i++)
{
@@ -134,13 +161,13 @@ hack_ssa_builder::append_assign (basic_block bb, hack_lvalue &left,
val->op[i]->uses.safe_push (stmt);
}
}
- write_variable (bb, left, stmt);
+ write_variable (bb, &left, stmt);
}
edge
hack_ssa_builder::hack_make_edge (basic_block src, basic_block dest, int flags)
{
- gcc_checking_assert (filled_bbs.contains (bb->index) &&
+ gcc_checking_assert (filled_bbs.contains (src->index) &&
"Successors can only be added to a filled BB");
return make_edge (src, dest, flags);
}
@@ -148,13 +175,13 @@ hack_ssa_builder::hack_make_edge (basic_block src, basic_block dest, int flags)
void
hack_ssa_builder::seal_block (basic_block bb)
{
- sealed_bbs.put (bb->index);
+ sealed_bbs.add (bb->index);
}
void
hack_ssa_builder::set_block_filled (basic_block bb)
{
- filled_bbs.put (bb->index);
+ filled_bbs.add (bb->index);
}
void
@@ -182,16 +209,16 @@ hack_ssa_builder::finalize (void)
{
if (!s->killed)
{
- hstmt_left *ls = dyn_cast<hstmt_left> (s);
- if (!ls == NULL)
- commit_ssa_name (bb, s);
+ hstmt_left *ls = dyn_cast<hstmt_left *> (s);
+ if (ls != NULL)
+ commit_ssa_name (ls);
}
}
for (hphi *p : record.phi_list)
{
if (!p->killed)
{
- commit_ssa_name (bb, p);
+ commit_ssa_name (p);
}
}
}
@@ -233,39 +260,37 @@ hack_ssa_builder::finalize (void)
}
record.stmt_list.release ();
record.phi_list.release ();
- record.curr_def.release ();
- record.tuple_provider.release ();
- record.curr_ssa.release ();
- XDELETE (record);
+ //record.curr_def.release ();
+ //record.tuple_provider.release ();
+ //XDELETE (record); TODO Pass records with pointers
}
- for (hack_lvalue l : allocated_locals)
+ for (hack_lvalue *l : allocated_locals)
XDELETE (l);
- for (hack_tuple t : allocated_tuples)
+ for (hack_tuple *t : allocated_tuples)
XDELETE (t);
- for (hack_tuple_internal t : allocated_internal)
+ for (hack_tuple_internal *t : allocated_internal)
XDELETE (t);
- seen_bbs.release ();
- allocated_locals.release ();
- allocated_tuples.release ();
- allocated_internal.release ();
- bb_record_map.release ();
- sealed_bbs.release ();
- filled_bbs.release ();
- incomplete_phis.release ();
+ //seen_bbs.release ();
+ //allocated_locals.release ();
+ //allocated_tuples.release ();
+ //allocated_internal.release ();
+ //bb_record_map.release ();
+ //sealed_bbs.release ();
+ //filled_bbs.release ();
+ //incomplete_phis.release ();
}
tree
hack_ssa_builder::ssa_name_from_lvalue (basic_block bb, hack_lvalue &var)
{
gcc_checking_assert (finalized && "SSA builder has to be finalized");
- hack_bb bb_record = get_bb_record (bb);
- return *(bb_record.curr_ssa.get (&var));
+ return read_variable (bb, &var)->ssa;
}
hack_bb &
hack_ssa_builder::get_bb_record (basic_block bb)
{
- seen_bbs.put (bb);
+ seen_bbs.add (bb);
hack_bb *record = bb_record_map.get (bb->index);
if (record == NULL)
@@ -279,8 +304,8 @@ hack_ssa_builder::get_bb_record (basic_block bb)
hack_tuple_internal *
hack_ssa_builder::tuple_to_internal (basic_block bb, hack_tuple *tuple)
{
- gcc_checking_assert (num_ops >= 1 && "Tuples of size <1 not allowed");
- gcc_checking_assert (num_ops <= 3 && "Tuples of size >3 not allowed");
+ gcc_checking_assert (tuple->num_ops >= 1 && "Tuples of size <1 not allowed");
+ gcc_checking_assert (tuple->num_ops <= 3 && "Tuples of size >3 not allowed");
size_t size = sizeof (hack_tuple_internal) +
(tuple->num_ops - 1) * sizeof (class hstmt_left *);
@@ -289,7 +314,7 @@ hack_ssa_builder::tuple_to_internal (basic_block bb, hack_tuple *tuple)
unsigned i;
for (i = 0; i < tuple->num_ops; i++)
{
- stmt_left *s = read_variable (tuple->op[i]);
+ hstmt_left *s = read_variable (bb, tuple->op[i]); // TODO
result->op[i] = s;
}
@@ -308,7 +333,7 @@ hack_ssa_builder::append_stmt (basic_block bb, hstmt *stmt)
}
hphi *
-hack_ssa_builder::add_empty_phi (basic_block bb, hack_lvalue *var);
+hack_ssa_builder::add_empty_phi (basic_block bb, hack_lvalue *var)
{
hphi *p = XNEW (class hphi);
p->var = var;
@@ -324,40 +349,40 @@ hack_ssa_builder::add_empty_phi (basic_block bb, hack_lvalue *var);
void
hack_ssa_builder::commit_ssa_name (hstmt_left *s)
{
- tree ssa = make_ssa_name (s->var.var_tree);
+ tree ssa = make_ssa_name (s->var->var_tree);
s->ssa = ssa;
}
void
hack_ssa_builder::commit_phi (basic_block bb, hphi *hp)
{
- hack_bb *record = get_bb_record (bb);
- gphi *gp = create_phi_node (hp->var->var_decl, bb);
+ hack_bb record = get_bb_record (bb);
+ gphi *gp = create_phi_node (hp->var->var_tree, bb);
- gcc_checking_assert (hp.op_p != NULL && "PHI has to be completed");
+ gcc_checking_assert (hp->op_p != NULL && "PHI has to be completed");
unsigned i;
- for (i = 0; i < hp->tuple->num_ops; i++)
+ for (i = 0; i < hp->num_ops; i++)
{
- hack_edge_stmt *op = *(hp->op);
- hstmt_left *s = op[i].s;
- edge e = op[i].e;
+ hstmt_left *s = hp->get_op (i);
+ edge e = hp->get_edge (i);
hack_lvalue *l = s->var;
- tree t = record->curr_ssa.get (l->index); // TODO Nechci pro tohle metodu?
- add_phi_arg (gp, t, e, UNKNOWN_LOCATION);
+ tree ssa = hp->ssa;
+ add_phi_arg (gp, ssa, e, UNKNOWN_LOCATION);
}
}
void
hack_ssa_builder::commit_stmt (gimple_stmt_iterator *gsi, hstmt *hs)
{
+ gcc_checking_assert (!hs->is_phi ());
+
gimple *s = hs->to_gimple ();
gsi_insert_after (gsi, s, GSI_NEW_STMT);
- get_bb_record (gsi->bb)->curr_ssa.put (hs.var, lhs);
}
void
-hack_ssa_builder::complete_phi (basic_block bb, hack_lvalue var, hphi *phi)
+hack_ssa_builder::complete_phi (basic_block bb, hack_lvalue *var, hphi *phi)
{
gcc_checking_assert (sealed_bbs.contains (bb->index) &&
"Only sealed BBs contain complete PHIs");
@@ -378,8 +403,8 @@ hack_ssa_builder::complete_phi (basic_block bb, hack_lvalue var, hphi *phi)
op[i].e = e;
op[i].s = s;
- /* Update users list. */
- s->users.safe_push (phi);
+ /* Update uses list. */
+ s->uses.safe_push (phi);
i++;
}
@@ -387,17 +412,50 @@ hack_ssa_builder::complete_phi (basic_block bb, hack_lvalue var, hphi *phi)
phi->num_ops = num_ops;
phi->op_p = &op;
- try_remove_trivial_phi (bb, *phi);
+ try_remove_trivial_phi (phi);
+}
+
+void
+hack_ssa_builder::replace_uses (hstmt_left *to_replace, hstmt_left *replace_by)
+{
+ for (hstmt *s : to_replace->uses)
+ {
+ s->replace_op_by (to_replace, replace_by);
+ }
}
void
-hack_ssa_builder::try_remove_trivial_phi (basic_block bb, hphi *phi)
+hack_ssa_builder::try_remove_trivial_phi (hphi *phi)
{
- // TODO Potřebuju users
+// hack_lvalue *same = NULL;
+//
+// unsigned i;
+// for (i = 0; i < phi->num_ops; i++)
+// {
+// hack_lvalue *op = phi->get_op (i);
+// if (op != same || dyn_cast<hphi *> (op) == phi)
+// continue; /* Unique value or self-reference. */
+// if (same != NULL)
+// return; /* The PHI merges at least two values: not trivial. */
+// same = op;
+// }
+// if (same == NULL)
+// {
+// return; /* The PHI is unreachable or in the start block. */
+// }
+//
+// phi->killed = true;
+// replace_uses (phi, same);
+//
+// for (hstmt *s : phi->uses)
+// {
+// if (s->is_phi ())
+// try_remove_trivial_phi (as_as<hphi *> (s));
+// }
}
void
-hack_ssa_builder::write_variable (basic_block bb, hack_lvalue var,
+hack_ssa_builder::write_variable (basic_block bb, hack_lvalue *var,
hstmt_left *stmt)
{
hack_bb record = get_bb_record (bb);
@@ -405,7 +463,7 @@ hack_ssa_builder::write_variable (basic_block bb, hack_lvalue var,
}
hstmt_left *
-hack_ssa_builder::read_variable (basic_block bb, hack_lvalue var)
+hack_ssa_builder::read_variable (basic_block bb, hack_lvalue *var)
{
hack_bb record = get_bb_record (bb);
hstmt_left **stmt_p = record.curr_def.get (var);
@@ -415,7 +473,7 @@ hack_ssa_builder::read_variable (basic_block bb, hack_lvalue var)
}
hstmt_left *
-hack_ssa_builder::read_variable_recursive (basic_block bb, hack_lvalue var)
+hack_ssa_builder::read_variable_recursive (basic_block bb, hack_lvalue *var)
{
hstmt_left *stmt;
@@ -429,9 +487,9 @@ hack_ssa_builder::read_variable_recursive (basic_block bb, hack_lvalue var)
{
stmt = read_variable (single_pred (bb), var);
}
- else if (má vůbec predecessors)
+ else if (EDGE_COUNT (bb->preds) > 0)
{
- hphi *phi = add_empty_phi (var);
+ hphi *phi = add_empty_phi (bb, var);
stmt = phi;
complete_phi (bb, var, phi);
}
@@ -448,17 +506,19 @@ hack_ssa_builder::read_variable_recursive (basic_block bb, hack_lvalue var)
void
hack_ssa_builder::tuple_register (basic_block bb, hstmt_left *stmt)
{
- hack_bb record = get_bb_record (bb);
- record.tuple_provider.put (stmt->val, stmt);
+// hack_bb record = get_bb_record (bb);
+// record.tuple_provider.put (stmt->val, stmt);
+ // TODO
}
hstmt_left *
-hack_ssa_builder::tuple_lookup (basic_block bb, hack_tuple_internal val)
+hack_ssa_builder::tuple_lookup (basic_block bb, hack_tuple_internal *val)
{
- hack_bb record = get_bb_record (bb);
- hstmt_left **stmt_p = record.tuple_provider.get (val);
- if (stmt_p == NULL)
- return NULL;
- else
- return *stmt_p;
+// hack_bb record = get_bb_record (bb);
+// hstmt_left **stmt_p = record.tuple_provider.get (val);
+// if (stmt_p == NULL)
+// return NULL;
+// else
+// return *stmt_p;
+ // TODO
}
diff --git a/gcc/insert-gimple-ssa.h b/gcc/insert-gimple-ssa.h
index 7025e908356..33c4cf7cfa6 100644
--- a/gcc/insert-gimple-ssa.h
+++ b/gcc/insert-gimple-ssa.h
@@ -42,7 +42,7 @@ class hack_ssa_builder;
struct hack_edge_stmt // TODO Nechci spíš pair?
{
edge e;
- hstmt *s;
+ hstmt_left *s;
};
class hstmt
@@ -52,6 +52,7 @@ class hstmt
virtual bool is_phi (void);
virtual gimple *to_gimple (void);
+ virtual void replace_op_by (hstmt_left *op, hstmt_left *replace_by);
};
class hstmt_left : public hstmt
@@ -59,6 +60,7 @@ class hstmt_left : public hstmt
public:
hack_lvalue *var;
vec<hstmt *> uses; // TODO Nahradit obstack strukturou?
+ tree ssa;
};
class hphi : public hstmt_left
@@ -69,6 +71,22 @@ class hphi : public hstmt_left
hack_edge_stmt **op_p; /* Pointer to the array of operands. NULL if PHI
incomplete. */
+ hstmt_left *get_op (unsigned i)
+ {
+ gcc_checking_assert (op_p != NULL && "PHI has to be completed");
+ gcc_checking_assert (i < num_ops);
+
+ return (*op_p)[i].s;
+ }
+
+ edge get_edge (unsigned i)
+ {
+ gcc_checking_assert (op_p != NULL && "PHI has to be completed");
+ gcc_checking_assert (i < num_ops);
+
+ return (*op_p)[i].e;
+ }
+
virtual bool is_phi (void) override
{
return true;
@@ -78,6 +96,8 @@ class hphi : public hstmt_left
{
return NULL;
}
+
+ virtual void replace_op_by (hstmt_left *op, hstmt_left *replace_by) override;
};
class hstmt_nonphi : public hstmt_left
@@ -95,6 +115,7 @@ class hstmt_assign : public hstmt_nonphi
hack_tuple_internal *val;
virtual gimple *to_gimple (void) override;
+ virtual void replace_op_by (hstmt_left *op, hstmt_left *replace_by) override;
};
class hack_tuple_internal
@@ -107,18 +128,17 @@ class hack_tuple_internal
struct hack_bb
{
- vec<hstmt_nonphi *> stmt_list;
+ vec<hstmt *> stmt_list;
vec<hphi *> phi_list;
hash_map<hack_lvalue *, hstmt_left *> curr_def;
hash_map<hack_tuple_internal *, hstmt_left *> tuple_provider; // TODO Jmeno
- hash_map<hack_lvalue *, tree> curr_ssa;
};
// -- API STRUCTS --
class hack_rvalue { };
-class hack_tuple : public hack_rvalue
+class hack_tuple
{
public:
enum tree_code code;
@@ -173,23 +193,23 @@ class hack_ssa_builder
hack_bb &get_bb_record (basic_block bb);
hack_tuple_internal *tuple_to_internal (basic_block bb, hack_tuple *tuple);
-
- void append_stmt (basic_block bb, hstmt_nonphi *stmt);
+ void append_stmt (basic_block bb, hstmt *stmt);
hphi *add_empty_phi (basic_block bb, hack_lvalue *var);
void commit_ssa_name (hstmt_left *s);
void commit_phi (basic_block bb, hphi *hp);
- void commit_stmt (gimple_stmt_iterator *gsi, hstmt_nonphi *hs);
+ void commit_stmt (gimple_stmt_iterator *gsi, hstmt *hs);
- void complete_phi (basic_block bb, hack_lvalue &var, hphi *phi);
- void try_remove_trivial_phi (basic_block bb, hphi *phi);
+ void complete_phi (basic_block bb, hack_lvalue *var, hphi *phi);
+ void replace_uses (hstmt_left *to_replace, hstmt_left *replace_by);
+ void try_remove_trivial_phi (hphi *phi);
- void write_variable (basic_block bb, hack_lvalue &var, hstmt_left *stmt);
- hstmt_left *read_variable (basic_block bb, hack_lvalue &var);
- hstmt_left *read_variable_recursive (basic_block bb, hack_lvalue &var);
+ void write_variable (basic_block bb, hack_lvalue *var, hstmt_left *stmt);
+ hstmt_left *read_variable (basic_block bb, hack_lvalue *var);
+ hstmt_left *read_variable_recursive (basic_block bb, hack_lvalue *var);
void tuple_register (basic_block bb, hstmt_left *stmt);
- hstmt_left *tuple_lookup (basic_block bb, hack_tuple_internal val);
+ hstmt_left *tuple_lookup (basic_block bb, hack_tuple_internal *val);
void run_final_optimizations (void);
};
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-04-19 19:02 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-19 19:02 [gcc(refs/users/pheeck/heads/sccp)] fixing errors in alt ssa, started working on trivial phis Filip Kastl
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).