The overall moral is that it depends on if you need the input to compute gradients or not. For example, if you use pow function like tensor.pow(0.5) it calls to a very general backprop  function meanwhile if you perform same operation doing tensor.sqrt_() gradients are directly 1/2 and it does not need to store input to compute them.
I cannot explain everything case by case as I don’t really know the underlying functions called in each case but it mainly responds to that reasoning.