nir/opt_loop: add loop peeling optimization
/**
* This optimization tries to peel the first loop break.
*
* This optimization turns:
*
* loop {
* do_work_1();
* if (cond) {
* break;
* } else {
* }
* do_work_2();
* }
*
* into:
*
* do_work_1();
* if (cond) {
* } else {
* loop {
* do_work_2();
* do_work_1();
* if (cond) {
* break;
* } else {
* }
* }
* }
*
* nir_opt_dead_cf() can later remove the outer IF statement, again.
*
*/