]> granicus.if.org Git - re2c/commitdiff
Optimized pointer arithmetics generated with '-C, --contexts'.
authorUlya Trofimovich <skvadrik@gmail.com>
Tue, 29 Mar 2016 14:16:01 +0000 (15:16 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Tue, 29 Mar 2016 14:16:01 +0000 (15:16 +0100)
If default input API is used and fixed-length context is based on
the rightmost context (that is, YYCURSOR), then the following expression
(that calculates pointer corresponding to the given context):
    (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - yyctx))
can be optimized to:
    (YYCURSOR - yyctx)

Note: unfortunately, as of GCC < 7.0, expressions like:
    (YYCURSOR - 3) - (YYCURSOR - 5)
trigger warning:
    warning: integer overflow in expression [-Woverflow]
See this GCC bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61240

re2c/src/codegen/emit_action.cc
re2c/src/codegen/input_api.cc
re2c/src/codegen/input_api.h
re2c/test/contexts/fix2.i--contexts.c
re2c/test/contexts/fix2_trail.i--contexts--input(custom).c
re2c/test/contexts/fix2_trail.i--contexts.c
re2c/test/contexts/fix4.i--contexts.c

index 0b9743ed5626b49a90c22347d0e7b3ea335e6b06..1685c1a5816dbcba8c4b9f36aafa4d6d54bc382e 100644 (file)
@@ -275,13 +275,8 @@ static void subst_contexts(
 
        for (size_t i = 0; i < rule.ctxfix.size(); ++i) {
                const CtxFix &ctx = rule.ctxfix[i];
-               const std::string basename = (ctx.base == CtxFix::RIGHTMOST)
-                       ? opts->input_api.expr_dist()
-                       : contexts[ctx.base].fullname;
-               std::ostringstream offs;
-               offs << "(" << basename << " - " << ctx.dist << ")";
-               const std::string ctx_value = opts->input_api.expr_ctx(offs.str());
-               rreplace_substr(action, "@" + *ctx.name, ctx_value);
+               rreplace_substr(action, "@" + *ctx.name,
+                       opts->input_api.expr_ctx_fix(ctx, contexts));
        }
 }
 
index 9e0f005412dd961876538d81960ae68ca101c830..40024d34077217b1ecd1578e5e0350097234f2b8 100644 (file)
@@ -117,18 +117,34 @@ std::string InputAPI::stmt_dist (uint32_t ind, const std::set<size_t> &ctxs,
        return s + expr_dist() + ";\n";
 }
 
-std::string InputAPI::expr_ctx (const std::string &ctx) const
+std::string InputAPI::expr_ctx(const std::string &ctx) const
 {
-       std::string s;
        switch (type_) {
-               case DEFAULT:
-                       s = "(" + opts->yyctxmarker + " + " + ctx + ")";
-                       break;
-               case CUSTOM:
-                       s = opts->yyctx + "(" + ctx + ")";
-                       break;
+               case DEFAULT: return "(" + opts->yyctxmarker + " + " + ctx + ")";
+               case CUSTOM:  return opts->yyctx + "(" + ctx + ")";
+               default:      assert(false);
+       }
+}
+
+std::string InputAPI::expr_ctx_fix(const CtxFix &ctx, const std::vector<CtxVar> &ctxvars) const
+{
+       std::ostringstream s;
+       if (ctx.base == CtxFix::RIGHTMOST) {
+               switch (type_) {
+                       case DEFAULT:
+                               // optimize '(YYCTXMARKER + ((YYCURSOR - YCTXMARKER) - yyctx))'
+                               // to       '(YYCURSOR - yyctx)'
+                               s << "(" << opts->yycursor << " - " << ctx.dist << ")";
+                               break;
+                       case CUSTOM:
+                               s << opts->yyctx << "(" << opts->yydist << "() - " << ctx.dist << ")";
+                               break;
+               }
+               return s.str();
+       } else {
+               s << "(" << ctxvars[ctx.base].fullname << " - " << ctx.dist << ")";
+               return expr_ctx(s.str());
        }
-       return s;
 }
 
 std::string InputAPI::stmt_restore (uint32_t ind) const
index de76f76ef557aaa6d7a5bdfb9425a4b63c69718a..b575e57c6003bed428a41462d8b4823ee0e36db0 100644 (file)
@@ -6,11 +6,11 @@
 #include <string>
 #include <vector>
 
+#include "src/ir/ctx.h"
+
 namespace re2c
 {
 
-struct CtxVar;
-
 class InputAPI
 {
 public:
@@ -36,6 +36,7 @@ public:
        std::string stmt_dist (uint32_t ind, const std::set<size_t> &ctxs,
                const std::vector<CtxVar> &contexts) const;
        std::string expr_ctx (const std::string &ctx) const;
+       std::string expr_ctx_fix (const CtxFix &ctx, const std::vector<CtxVar> &ctxvars) const;
        std::string stmt_restore (uint32_t ind) const;
        std::string stmt_restorectx_fix (uint32_t ind, size_t dist) const;
        std::string stmt_restorectx_var (uint32_t ind) const;
index bba01df7dbffe96561b7302b46a3184aafda681e..455b3f1e635826e8a4641557a9b29f080622f247 100644 (file)
@@ -110,11 +110,11 @@ yy19:
        ++YYCURSOR;
        {
             printf("'%.*s', '%.*s', '%.*s', '%.*s', '%.*s'\n",
-                (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 14)) - YYCTXMARKER, YYCTXMARKER,
-                (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 12)) - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 14)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 14)),
-                (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)) - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 12)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 12)),
-                (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 5)) - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)),
-                YYCURSOR - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 5)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 5)));
+                (YYCURSOR - 14) - YYCTXMARKER, YYCTXMARKER,
+                (YYCURSOR - 12) - (YYCURSOR - 14), (YYCURSOR - 14),
+                (YYCURSOR - 9) - (YYCURSOR - 12), (YYCURSOR - 12),
+                (YYCURSOR - 5) - (YYCURSOR - 9), (YYCURSOR - 9),
+                YYCURSOR - (YYCURSOR - 5), (YYCURSOR - 5));
                 return;
         }
 }
index e695a195ba08b6108a19362d80b5eb93e70550de..90e209b2425c59723eb3ba988af96aaa072c9484 100644 (file)
@@ -126,10 +126,10 @@ yy19:
        YYRESTORECTX (YYDIST() - 5);
        {
             printf("'%.*s', '%.*s', '%.*s', '%.*s', '%s'\n",
-                YYCTX((YYDIST() - 9)) - YYCTXMARKER, YYCTXMARKER,
-                YYCTX((YYDIST() - 7)) - YYCTX((YYDIST() - 9)), YYCTX((YYDIST() - 9)),
-                YYCTX((YYDIST() - 4)) - YYCTX((YYDIST() - 7)), YYCTX((YYDIST() - 7)),
-                YYCURSOR - YYCTX((YYDIST() - 4)), YYCTX((YYDIST() - 4)),
+                YYCTX(YYDIST() - 9) - YYCTXMARKER, YYCTXMARKER,
+                YYCTX(YYDIST() - 7) - YYCTX(YYDIST() - 9), YYCTX(YYDIST() - 9),
+                YYCTX(YYDIST() - 4) - YYCTX(YYDIST() - 7), YYCTX(YYDIST() - 7),
+                YYCURSOR - YYCTX(YYDIST() - 4), YYCTX(YYDIST() - 4),
                 YYCURSOR);
                 return;
         }
index 380849cf14ef74c8420d5948dbcc2081231389de..a7a01401e3b65c3938671a4e2ca22377842310f4 100644 (file)
@@ -111,10 +111,10 @@ yy19:
        YYCURSOR -= 5;
        {
             printf("'%.*s', '%.*s', '%.*s', '%.*s', '%s'\n",
-                (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)) - YYCTXMARKER, YYCTXMARKER,
-                (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 7)) - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 9)),
-                (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 4)) - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 7)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 7)),
-                YYCURSOR - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 4)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 4)),
+                (YYCURSOR - 9) - YYCTXMARKER, YYCTXMARKER,
+                (YYCURSOR - 7) - (YYCURSOR - 9), (YYCURSOR - 9),
+                (YYCURSOR - 4) - (YYCURSOR - 7), (YYCURSOR - 7),
+                YYCURSOR - (YYCURSOR - 4), (YYCURSOR - 4),
                 YYCURSOR);
                 return;
         }
index 57b76c2a5661332075a8558acf2c3964b1786b86..24e9d915ebf723c1bdf660c21586cdde99bb2ba5 100644 (file)
@@ -60,8 +60,8 @@ yy11:
                 (YYCTXMARKER + yyctx0p1) - YYCTXMARKER, YYCTXMARKER,
                 (YYCTXMARKER + (yyctx0p3 - 1)) - (YYCTXMARKER + yyctx0p1), (YYCTXMARKER + yyctx0p1),
                 (YYCTXMARKER + yyctx0p3) - (YYCTXMARKER + (yyctx0p3 - 1)), (YYCTXMARKER + (yyctx0p3 - 1)),
-                (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 1)) - (YYCTXMARKER + yyctx0p3), (YYCTXMARKER + yyctx0p3),
-                YYCURSOR - (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 1)), (YYCTXMARKER + ((YYCURSOR - YYCTXMARKER) - 1)));
+                (YYCURSOR - 1) - (YYCTXMARKER + yyctx0p3), (YYCTXMARKER + yyctx0p3),
+                YYCURSOR - (YYCURSOR - 1), (YYCURSOR - 1));
                 return;
         }
 }