These expressions are lowered differently because `test2` gets a temporary due to the conditional reassignment of `u`, whereas `test1` is just a straight line switch and jump (look at `code_lowered` and `code_typed`).
For the same C code, the lowered IR from Clang looks similar, but it appears to constant fold and reduce down to identical assembly at `-O1` and above. The fact that Julia doesn't is probably due to difference in LLVM optimization passes or order. As far as style, personally I think the first one is cleaner. On Fri, Sep 30, 2016 at 1:48 PM, mmh <[email protected]> wrote: > I would have that thought that these two function would produce the same > code, but they do not. > > Could someone care to explain the difference and which is preferred and why > > > http://pastebin.com/GJ8YPfV3 > > function test1(x) > y = 2.0 > u = 2.320 > x < 0 && (u = 32.0) > x > 1 && (u = 1.0) > return u + y > end > > > function test2(x) > y = 2.0 > u = 2.320 > u = x < 0 ? 32.0 : u > u = x > 1 ? 1.0 : u > return u + y > end > > > @code_llvm test1(2.2) > > @code_llvm test2(2.2) > >
