Is there just some loop fusion switch that gets turned on only when a
.is present?
Yes, that’s precisely it. Broadcast’s loop fusion is a syntax thing. While Julia’s compiler could maybe someday get smart enough to look inside the * method to see that it’s “just” a broadcast — and thus can avoid allocating its temporary, it requires a rather complex escape analysis to make sure that this intermediate isn’t stored/used/re-used/changed/etc and a complex function analysis to ensure that it actually is doing something that is broadcast-compatible.
On the other hand, just looking at an expression and combining the .s is a very simple pass.