Hi,

It looks like, because of the recur, the compiler fails to notice that if
returns a primitive.
As far as I understand in Compiler.java, RecurExpr does not implement
MaybePrimitiveExpr and thus causes on canEmitPrimitive the surrounding
IfExpr to return false.

Someone to confirm this analysis?


On Tue, Nov 20, 2012 at 4:34 PM, Gunnar Völkel <
gunnar.voel...@googlemail.com> wrote:

> I have written a primitive function for exponentiation with integers as
> power using the multiply-and-square algorithm.
> For performance reasons I used primitive type hints for the arguments and
> the return value.
> Profiling the whole application I noticed that there are a lot of
> java.lang.Double/valueOf calls.
> Looking at the bytecode I see that in Clojure 1.3 as well as in Clojure
> 1.4 the result value gets boxed and unboxed like
> Double.valueOf(result).doubleValue().
>
> Am I doing something wrong? Is there a serious bug related to the support
> of primitive functions?
>
> The source code:
>
> (defn first-bit?
>   {:inline (fn [n] `(== 1 (clojure.lang.Numbers/and ~n, 1)) )}
>   [^long n]
>   (== 1 (clojure.lang.Numbers/and n, 1)))
>
> (defn exp-int
>   ^double [^double x, ^long c]
>   (loop [result 1.0, factor x, c c]
>     (if (> c 0)
>         (recur
>          (if (first-bit? c)
>            (* result factor)
>            result),
>          (* factor factor),
>          (bit-shift-right c 1))
>       result)))
>
> Last lines of the Java bytecode of `exp-int`:
> 59 dload 5;               /* result */
> 61 invokestatic 40;       /* java.lang.Double
> java.lang.Double.valueOf(double c) */
> 64 checkcast 85;          /* java.lang.Number */
> 67 invokevirtual 89;      /* double doubleValue() */
> 70 dreturn;
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en




-- 
Professional: http://cgrand.net/ (fr)
On Clojure: http://clj-me.cgrand.net/ (en)

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to