SSABuildingPass.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/HashMap.h>
  8. #include "Compiler/CompilerPass.h"
  9. #include "Compiler/ControlFlowGraph.h"
  10. #include "Compiler/EnableGraphPointers.h"
  11. namespace JSSpecCompiler {
  12. // TODO: Add a LOT of unit tests.
  13. class SSABuildingPass
  14. : public IntraproceduralCompilerPass
  15. , private EnableGraphPointers<SSABuildingPass, BasicBlockRef> {
  16. public:
  17. inline static constexpr StringView name = "ssa-building"sv;
  18. using IntraproceduralCompilerPass::IntraproceduralCompilerPass;
  19. protected:
  20. void process_function() override;
  21. private:
  22. friend EnableGraphPointers;
  23. class Vertex : public VertexBase {
  24. public:
  25. using VertexBase::VertexBase;
  26. BasicBlockRef block() const { return m_instance->m_order[m_index]; }
  27. };
  28. void compute_order(BasicBlockRef u, Vertex parent = invalid_node);
  29. void compute_dominator_tree();
  30. template<typename... Args>
  31. Vector<Vertex> unique(Args const&... args);
  32. void compute_dtree_tin_tout(Vertex u);
  33. bool is_strictly_dominating(Vertex u, Vertex v);
  34. void compute_dominance_frontiers();
  35. void add_phi_node(BasicBlockRef block, NamedVariableDeclarationRef decl);
  36. void place_phi_nodes();
  37. void make_new_ssa_variable_for(NamedVariableDeclarationRef var);
  38. void rename_variable(VariableRef var);
  39. void rename_variables(Vertex u, Vertex from = invalid_node);
  40. void rename_variables();
  41. struct NodeData {
  42. Vector<Vertex> incoming_edges;
  43. Vector<Vertex> outgoing_edges;
  44. Vector<Vertex> buckets;
  45. bool is_used = false;
  46. Vertex parent;
  47. Vertex semi_dominator;
  48. Vertex immediate_dominator;
  49. Vector<Vertex> dtree_children;
  50. u64 tin, tout;
  51. Vector<Vertex> d_frontier;
  52. HashMap<NamedVariableDeclarationRef, Vertex> phi_nodes;
  53. u64 mark = 0;
  54. };
  55. u64 m_dtree_timer;
  56. Vector<NodeData> m_nodes;
  57. Vector<NonnullRefPtr<BasicBlock>> m_order;
  58. u64 m_mark_version;
  59. HashMap<NamedVariableDeclarationRef, Vector<SSAVariableDeclarationRef>> m_def_stack;
  60. HashMap<NamedVariableDeclarationRef, u64> m_next_id;
  61. Vector<NamedVariableDeclarationRef> m_undo_vector;
  62. ControlFlowGraph* m_graph;
  63. };
  64. }