aboutsummaryrefslogtreecommitdiffstats
path: root/compile.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-04-23 14:12:27 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-04-23 14:12:27 +0000
commit2ede24a8f16385c14a27441308699ed42fcbb238 (patch)
tree2358c4305ecb2571e6769bea99376fa27fa53ab2 /compile.c
parent8c3d9d99d6955a93a4d9176536a454ccbab96186 (diff)
downloadruby-2ede24a8f16385c14a27441308699ed42fcbb238.tar.gz
compile.c: remove redundant trace insn
* compile.c (iseq_peephole_optimize): remove successive line trace instructions except for the last. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54733 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/compile.c b/compile.c
index 3cc7696fda..7e3fe14d3f 100644
--- a/compile.c
+++ b/compile.c
@@ -2279,6 +2279,17 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
}
}
}
+
+ #define IS_TRACE_LINE(insn) \
+ (IS_INSN_ID(insn, trace) && \
+ OPERAND_AT(insn, 0) == INT2FIX(RUBY_EVENT_LINE))
+ if (IS_TRACE_LINE(iobj) && iobj->link.prev && IS_INSN(iobj->link.prev)) {
+ INSN *piobj = (INSN *)iobj->link.prev;
+ if (IS_TRACE_LINE(piobj)) {
+ REMOVE_ELEM(iobj->link.prev);
+ }
+ }
+
return COMPILE_OK;
}