glsl2: Move the common optimization passes to a helper function.

These are passes that we expect all codegen to be happy with.  The
other lowering passes for Mesa IR are moved to the Mesa IR generator.
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 7bff859..9931251 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -1308,48 +1308,13 @@
       prog->LinkStatus = true;
    }
 
-   /* FINISHME: Perform whole-program optimization here. */
+   /* Do common optimization before assigning storage for attributes,
+    * uniforms, and varyings.  Later optimization could possibly make
+    * some of that unused.
+    */
    for (unsigned i = 0; i < prog->_NumLinkedShaders; i++) {
-      /* Optimization passes */
-      bool progress;
-      exec_list *ir = prog->_LinkedShaders[i]->ir;
-
-      /* Lowering */
-      do_mat_op_to_vec(ir);
-      do_mod_to_fract(ir);
-      do_div_to_mul_rcp(ir);
-      do_explog_to_explog2(ir);
-      do_sub_to_add_neg(ir);
-
-      do {
-	 progress = false;
-
-	 progress = do_function_inlining(ir) || progress;
-	 progress = do_dead_functions(ir) || progress;
-	 progress = do_structure_splitting(ir) || progress;
-	 progress = do_if_simplification(ir) || progress;
-	 progress = do_copy_propagation(ir) || progress;
-	 progress = do_dead_code_local(ir) || progress;
-	 progress = do_dead_code(ir) || progress;
-	 progress = do_tree_grafting(ir) || progress;
-	 progress = do_constant_propagation(ir) || progress;
-	 progress = do_constant_variable(ir) || progress;
-	 progress = do_constant_folding(ir) || progress;
-	 progress = do_algebraic(ir) || progress;
-	 progress = do_if_return(ir) || progress;
-#if 0
-	 if (ctx->Shader.EmitNoIfs)
-	    progress = do_if_to_cond_assign(ir) || progress;
-#endif
-
-	 progress = do_vec_index_to_swizzle(ir) || progress;
-	 /* Do this one after the previous to let the easier pass handle
-	  * constant vector indexing.
-	  */
-	 progress = do_vec_index_to_cond_assign(ir) || progress;
-
-	 progress = do_swizzle_swizzle(ir) || progress;
-      } while (progress);
+      while (do_common_optimization(prog->_LinkedShaders[i]->ir, true))
+	 ;
    }
 
    assign_uniform_locations(prog);