message: Introduce functional<->region conversion passes around extract outside compilation
  Follow functional->region transformation with a inlining pass to make sure calls
  generated by the transform get inlined.
diff: @@ -82,6 +82,9 @@ void CreateTPUBridgePipeline(OpPassManager &pm) {
  // Run shape inference so that tf_executor/tf_device ops created later will
  // likely to inherit more concrete types.
  pm.addPass(TF::CreateTFShapeInferencePass());
  + // Encode this in its own scope so that func_pm is not mistakenly used
  + // later on.
  + {
  OpPassManager &func_pm = pm.nest<FuncOp>();
  func_pm.addPass(CreateTPUClusterFormationPass());
  // Place DecomposeResourceOpsPass before TFExecutorConstantSinking pass
  @@ -89,8 +92,13 @@ void CreateTPUBridgePipeline(OpPassManager &pm) {
  // changed constants out of tf_device.Launch.
  func_pm.addPass(TFDevice::CreateDecomposeResourceOpsPass());
  func_pm.addPass(CreateTPUHostComputationExpansionPass());
  - pm.addNestedPass<FuncOp>(CreateTPUUpdateEmbeddingEnqueueOpInputsPass());
  + func_pm.addPass(CreateTPUUpdateEmbeddingEnqueueOpInputsPass());
  + }
  + pm.addPass(TF::CreateTFFunctionalControlFlowToRegions());
  + pm.addPass(mlir::createInlinerPass());
  pm.addPass(CreateTPUExtractHeadTailOutsideCompilationPass());
  + pm.addPass(TF::CreateTFRegionControlFlowToFunctional());
  +
  // Run another shape inference pass because resource decomposition might have
  // created new partial types.
  pm.addPass(TF::CreateTFShapeInferencePass());
  