There's no branch in that code either way. The comparison operator outputs a value (which is arithmetic, not a branch), and that value is added unconditionally.
So the jump that forms the loop will be predicted correctly for all executions but the very last (when the loop ends).
I wonder how much more complicated and effective statistical predictors are.
Unless the loop is unrolled, yes, there is a branch to exit the loop. But then that doesn’t matter because the whole goal at the beginning was to avoid branch misprediction (which is not the same thing as avoiding branches entirely).