They are necessary and it is code untouched by this patch, and the same line occurs in other picksplit functions as well. The gbt_num_picksplit function shows that it can be avoided, by rewriting in the second loop
*left++ = sortItems[i].index; into v->spl_left[v->spl_nleft] = sortItems[i].index
Even though this is longer code, I prefer this variant over the shorter one.
I can't understand this point. How the way of spl_left and spl_right arrays filling is related with additional FirstOffsetNumber value at the end of array, which is added by "*left = *right = FirstOffsetNumber;" line?