]> granicus.if.org Git - re2c/commitdiff
Moved tag optimization stuff to subdirectory.
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 2 Nov 2016 17:53:33 +0000 (17:53 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 2 Nov 2016 17:53:33 +0000 (17:53 +0000)
re2c/Makefile.am
re2c/src/ir/dfa/cfg/cfg.cc [moved from re2c/src/ir/dfa/tag_optimize.cc with 71% similarity]
re2c/src/ir/dfa/cfg/cfg.h [moved from re2c/src/ir/dfa/tag_optimize.h with 86% similarity]
re2c/src/ir/dfa/cfg/dce.cc [moved from re2c/src/ir/dfa/tag_dce.cc with 92% similarity]
re2c/src/ir/dfa/cfg/interfere.cc [moved from re2c/src/ir/dfa/tag_interference.cc with 98% similarity]
re2c/src/ir/dfa/cfg/liveanal.cc [moved from re2c/src/ir/dfa/tag_liveness.cc with 98% similarity]
re2c/src/ir/dfa/cfg/normalize.cc [moved from re2c/src/ir/dfa/tag_normalization.cc with 96% similarity]
re2c/src/ir/dfa/cfg/optimize.cc [new file with mode: 0644]
re2c/src/ir/dfa/cfg/rename.cc [moved from re2c/src/ir/dfa/tag_renaming.cc with 96% similarity]
re2c/src/ir/dfa/cfg/varalloc.cc [moved from re2c/src/ir/dfa/tag_allocation.cc with 98% similarity]

index 8f209646b357c93728ce201ce3491a5ab664a01e..495f646efed1be6c45633c8ad18b76604bf0b3d0 100644 (file)
@@ -22,10 +22,10 @@ SRC_HDR = \
        src/conf/warn.h \
        src/ir/adfa/action.h \
        src/ir/adfa/adfa.h \
+       src/ir/dfa/cfg/cfg.h \
        src/ir/dfa/closure.h \
        src/ir/dfa/dfa.h \
        src/ir/dfa/find_state.h \
-       src/ir/dfa/tag_optimize.h \
        src/ir/dfa/tagpool.h \
        src/ir/nfa/nfa.h \
        src/ir/regexp/encoding/case.h \
@@ -94,6 +94,14 @@ SRC = \
        src/ir/nfa/regexps2nfa.cc \
        src/ir/adfa/adfa.cc \
        src/ir/adfa/prepare.cc \
+       src/ir/dfa/cfg/cfg.cc \
+       src/ir/dfa/cfg/dce.cc \
+       src/ir/dfa/cfg/interfere.cc \
+       src/ir/dfa/cfg/liveanal.cc \
+       src/ir/dfa/cfg/normalize.cc \
+       src/ir/dfa/cfg/optimize.cc \
+       src/ir/dfa/cfg/rename.cc \
+       src/ir/dfa/cfg/varalloc.cc \
        src/ir/dfa/closure.cc \
        src/ir/dfa/dead_rules.cc \
        src/ir/dfa/determinization.cc \
@@ -101,13 +109,6 @@ SRC = \
        src/ir/dfa/fillpoints.cc \
        src/ir/dfa/find_state.cc \
        src/ir/dfa/minimization.cc \
-       src/ir/dfa/tag_allocation.cc \
-       src/ir/dfa/tag_dce.cc \
-       src/ir/dfa/tag_interference.cc \
-       src/ir/dfa/tag_liveness.cc \
-       src/ir/dfa/tag_normalization.cc \
-       src/ir/dfa/tag_optimize.cc \
-       src/ir/dfa/tag_renaming.cc \
        src/ir/dfa/tagpool.cc \
        src/ir/regexp/encoding/enc.cc \
        src/ir/regexp/encoding/range_suffix.cc \
similarity index 71%
rename from re2c/src/ir/dfa/tag_optimize.cc
rename to re2c/src/ir/dfa/cfg/cfg.cc
index fce73ce952aa8474593216ebd0fce62e0729c809..0c5bcf31f403d45416bf11f0b74ea3e72f6f445b 100644 (file)
@@ -1,82 +1,16 @@
 #include <string.h>
 
-#include "src/ir/dfa/dfa.h"
-#include "src/ir/dfa/tag_optimize.h"
+#include "src/ir/dfa/cfg/cfg.h"
 
 namespace re2c
 {
 
-static void freeze_tags(dfa_t &dfa);
 static cfg_ix_t map_arcs_to_bblocks(const dfa_t &dfa, cfg_ix_t *arc2bb);
 static cfg_bb_t *create_bblocks(const dfa_t &dfa, const cfg_ix_t *arc2bb, cfg_ix_t nbblock);
 static void basic_block(cfg_bb_t *bb, const cfg_ix_t *succb, const cfg_ix_t *succe, tcmd_t *cmd, tagver_t *use);
 static void successors(const dfa_t &dfa, const cfg_ix_t *arc2bb, bool *been, cfg_ix_t *&succ, size_t x);
 static void fallback(const dfa_t &dfa, const cfg_ix_t *arc2bb, bool *been, cfg_ix_t *&succ, size_t x);
 
-void optimize_tags(dfa_t &dfa)
-{
-       if (dfa.maxtagver > 0) {
-               cfg_t cfg(dfa);
-
-               const size_t nver = static_cast<size_t>(dfa.maxtagver) + 1;
-               bool *live = new bool[cfg.nbblock * nver];
-               bool *interf = new bool[nver * nver];
-               tagver_t *ver2new = new tagver_t[nver];
-
-               tag_liveness(cfg, live);
-               tag_dce(cfg, live);
-               tag_interference(cfg, live, interf);
-               const tagver_t maxver = tag_allocation(cfg, interf, ver2new);
-               tag_renaming(cfg, ver2new, maxver);
-               tag_normalization(cfg);
-
-               delete[] live;
-               delete[] interf;
-               delete[] ver2new;
-       }
-
-       freeze_tags(dfa);
-}
-
-/* note [tag freezing]
- *
- * Comparison of tag commands should be very fast (constant time):
- * many optimizations rely on this (like tunnelling, hoisting and
- * especially Moore's minimization, which compares whole classes
- * of tagged transition at once). So we bring each command to some
- * 'normal form' and insert it into common index.
- *
- * After that commands can be addressed and compared by index.
- * They also become immutable, because different commands may
- * share representation in memory.
- */
-void freeze_tags(dfa_t &dfa)
-{
-       tcpool_t &pool = dfa.tcpool;
-       const size_t
-               nstate = dfa.states.size(),
-               nsym = dfa.nchars;
-
-       for (size_t i = 0; i < nstate; ++i) {
-               dfa_state_t *s = dfa.states[i];
-               const tcmd_t
-                       *cmd = s->tcmd,
-                       *const fin = cmd + nsym;
-               tcid_t *id = s->tcid = new tcid_t[nsym + 1];
-
-               // transition commands
-               for(; cmd < fin; ++cmd) {
-                       *id++ = pool.insert(cmd->save, cmd->copy);
-               }
-
-               // final epsilon-transition command
-               *id++ = pool.insert(fin->save, fin->copy);
-
-               delete[] s->tcmd;
-               s->tcmd = NULL;
-       }
-}
-
 cfg_t::cfg_t(dfa_t &a)
        : dfa(a)
        , bblocks(NULL)
similarity index 86%
rename from re2c/src/ir/dfa/tag_optimize.h
rename to re2c/src/ir/dfa/cfg/cfg.h
index 21821b5c6b37959ba54e9c55c332f137148557e7..fde83ffc8b63610ef7743f3d8e2ad8d8d983db82 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _RE2C_IR_DFA_TAG_OPTIMIZE_
-#define _RE2C_IR_DFA_TAG_OPTIMIZE_
+#ifndef _RE2C_IR_DFA_CFG_CFG_
+#define _RE2C_IR_DFA_CFG_CFG_
 
 #include "src/ir/dfa/dfa.h"
 
@@ -37,4 +37,4 @@ void tag_normalization(cfg_t &cfg);
 
 } // namespace re2c
 
-#endif // _RE2C_IR_DFA_TAG_OPTIMIZE_
+#endif // _RE2C_IR_DFA_CFG_CFG_
similarity index 92%
rename from re2c/src/ir/dfa/tag_dce.cc
rename to re2c/src/ir/dfa/cfg/dce.cc
index 1d158bf85dc7f33699fe8bb32f0b470145533ea2..ffddd91c866618664e208740c5df4719b3b173b2 100644 (file)
@@ -1,4 +1,4 @@
-#include "src/ir/dfa/tag_optimize.h"
+#include "src/ir/dfa/cfg/cfg.h"
 
 namespace re2c
 {
similarity index 98%
rename from re2c/src/ir/dfa/tag_interference.cc
rename to re2c/src/ir/dfa/cfg/interfere.cc
index 77038b2510128fc0d1f7ec4a8c47ecf9e28466f3..1952d5a1acee98b4b0ccbbf0053d243dd8fd72e8 100644 (file)
@@ -1,6 +1,6 @@
 #include <string.h>
 
-#include "src/ir/dfa/tag_optimize.h"
+#include "src/ir/dfa/cfg/cfg.h"
 
 namespace re2c
 {
similarity index 98%
rename from re2c/src/ir/dfa/tag_liveness.cc
rename to re2c/src/ir/dfa/cfg/liveanal.cc
index 7e3ee92e1072f3dc8d5d196e446254f8d465cab6..d996b67a6f1e28ee9520e698051c24b02fd40dda 100644 (file)
@@ -1,6 +1,6 @@
 #include <string.h>
 
-#include "src/ir/dfa/tag_optimize.h"
+#include "src/ir/dfa/cfg/cfg.h"
 
 namespace re2c
 {
similarity index 96%
rename from re2c/src/ir/dfa/tag_normalization.cc
rename to re2c/src/ir/dfa/cfg/normalize.cc
index b63fd36332cf6fdf276eea1e0c871246a9550701..45cf8dd08b53bfaf3a36be8aaee67a6847658293 100644 (file)
@@ -1,4 +1,4 @@
-#include "src/ir/dfa/tag_optimize.h"
+#include "src/ir/dfa/cfg/cfg.h"
 
 namespace re2c
 {
diff --git a/re2c/src/ir/dfa/cfg/optimize.cc b/re2c/src/ir/dfa/cfg/optimize.cc
new file mode 100644 (file)
index 0000000..e022b56
--- /dev/null
@@ -0,0 +1,74 @@
+#include "src/ir/dfa/cfg/cfg.h"
+#include "src/ir/dfa/dfa.h"
+
+namespace re2c
+{
+
+static void freeze_tags(dfa_t &dfa);
+
+void optimize_tags(dfa_t &dfa)
+{
+       if (dfa.maxtagver > 0) {
+               cfg_t cfg(dfa);
+
+               const size_t nver = static_cast<size_t>(dfa.maxtagver) + 1;
+               bool *live = new bool[cfg.nbblock * nver];
+               bool *interf = new bool[nver * nver];
+               tagver_t *ver2new = new tagver_t[nver];
+
+               tag_liveness(cfg, live);
+               tag_dce(cfg, live);
+               tag_interference(cfg, live, interf);
+               const tagver_t maxver = tag_allocation(cfg, interf, ver2new);
+               tag_renaming(cfg, ver2new, maxver);
+               tag_normalization(cfg);
+
+               delete[] live;
+               delete[] interf;
+               delete[] ver2new;
+       }
+
+       freeze_tags(dfa);
+}
+
+/* note [tag freezing]
+ *
+ * Comparison of tag commands should be very fast (constant time):
+ * many optimizations rely on this (like tunnelling, hoisting and
+ * especially Moore's minimization, which compares whole classes
+ * of tagged transition at once). So we bring each command to some
+ * 'normal form' and insert it into common index.
+ *
+ * After that commands can be addressed and compared by index.
+ * They also become immutable, because different commands may
+ * share representation in memory.
+ */
+void freeze_tags(dfa_t &dfa)
+{
+       tcpool_t &pool = dfa.tcpool;
+       const size_t
+               nstate = dfa.states.size(),
+               nsym = dfa.nchars;
+
+       for (size_t i = 0; i < nstate; ++i) {
+               dfa_state_t *s = dfa.states[i];
+               const tcmd_t
+                       *cmd = s->tcmd,
+                       *const fin = cmd + nsym;
+               tcid_t *id = s->tcid = new tcid_t[nsym + 1];
+
+               // transition commands
+               for(; cmd < fin; ++cmd) {
+                       *id++ = pool.insert(cmd->save, cmd->copy);
+               }
+
+               // final epsilon-transition command
+               *id++ = pool.insert(fin->save, fin->copy);
+
+               delete[] s->tcmd;
+               s->tcmd = NULL;
+       }
+}
+
+} // namespace re2c
+
similarity index 96%
rename from re2c/src/ir/dfa/tag_renaming.cc
rename to re2c/src/ir/dfa/cfg/rename.cc
index 4e954b87fe47325deae6b771a0ab351636624323..493688de483afa1a59d34f4878c6777416a3cecc 100644 (file)
@@ -1,4 +1,4 @@
-#include "src/ir/dfa/tag_optimize.h"
+#include "src/ir/dfa/cfg/cfg.h"
 
 namespace re2c
 {
similarity index 98%
rename from re2c/src/ir/dfa/tag_allocation.cc
rename to re2c/src/ir/dfa/cfg/varalloc.cc
index fe06d1943c7cc6110c2546d75eef7e9994e94b5a..721ece273f5c53168d4bd89ded2266f66ab2039d 100644 (file)
@@ -1,6 +1,6 @@
 #include <limits>
 
-#include "src/ir/dfa/tag_optimize.h"
+#include "src/ir/dfa/cfg/cfg.h"
 
 namespace re2c
 {