The other thing is to use by-value argument passing conventions for
internal intrinsics wherever possible so that a
write (*,*) a
does not make 'a' addressable. This is what makes fatigue so sensitive
to the partitioning choices - we have an addressable induction variable
and miss loop invariant motion of sin() and cos() calls if the memory
tag for the induction variable is coalesced with the wrong things. The
induction variable only has a memory tag because it is marked addressable
and this is only due to the fact that fatigue re-uses it in an I/O
statement (like the one quoted above) later in the function.