I think CLJ-701 is about loop in non-terminal position.

On Tue, Nov 20, 2012 at 6:30 PM, Andy Fingerhut <andy.finger...@gmail.com>wrote:

> Any relationship to CLJ-701, other than similar symptoms?
>
> http://dev.clojure.org/jira/browse/CLJ-701
>
> Andy
>
> On Nov 20, 2012, at 9:15 AM, Christophe Grand wrote:
>
> 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