From 8998c06461ea0bef11b3aeb30b6d2ab71c8762ba Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 27 Oct 2016 14:28:14 +0000 Subject: ruby/ruby.h: optimize rb_integer_type_p * include/ruby/ruby.h (rb_integer_type_p): turn into macro to help clang based on old gcc to eliminate CSE. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56506 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- include/ruby/ruby.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'include') diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index d72e7784f1..eeae2f6879 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -1480,6 +1480,17 @@ rb_obj_write(VALUE a, VALUE *slot, VALUE b, RB_UNUSED_VAR(const char *filename), #define RUBY_INTEGER_UNIFICATION 1 #define RB_INTEGER_TYPE_P(obj) rb_integer_type_p(obj) +#if defined __GNUC__ && !GCC_VERSION_SINCE(4, 3, 0) +/* clang 3.x (4.2 compatible) can't eliminate CSE of RB_BUILTIN_TYPE + * in inline function and caller function */ +#define rb_integer_type_p(obj) \ + __extension__ ({ \ + const VALUE integer_type_obj = (obj); \ + (RB_FIXNUM_P(integer_type_obj) || \ + (!RB_SPECIAL_CONST_P(integer_type_obj) && \ + RB_BUILTIN_TYPE(integer_type_obj) == RUBY_T_BIGNUM)); \ + }) +#else static inline int rb_integer_type_p(VALUE obj) { @@ -1487,6 +1498,7 @@ rb_integer_type_p(VALUE obj) (!RB_SPECIAL_CONST_P(obj) && RB_BUILTIN_TYPE(obj) == RUBY_T_BIGNUM)); } +#endif #if SIZEOF_INT < SIZEOF_LONG # define RB_INT2NUM(v) RB_INT2FIX((int)(v)) -- cgit v1.2.3