Merge pull request #3142 from ScottTodd:main-to-google

PiperOrigin-RevId: 331661857
diff --git a/SUBMODULE_VERSIONS b/SUBMODULE_VERSIONS
index bb781a6..e627918 100644
--- a/SUBMODULE_VERSIONS
+++ b/SUBMODULE_VERSIONS
@@ -4,7 +4,7 @@
 a5d9d0f7d368054fd1691aedf1db4116efcc233e third_party/flatbuffers
 4fb0ff7069bd88ee85902f4d0bb62794e5f6d021 third_party/flatcc
 f2fb48c3b3d79a75a88a99fba6576b25d42ec528 third_party/googletest
-009cd4e491033f57f547a7bda63e35b50a6e5cf7 third_party/llvm-project
+7841e21c98495ba5e33e0d2507d985bd5b938445 third_party/llvm-project
 17b12a4481daa150e2d1ea3ada086b551b856707 third_party/marl
 560cd8c94495409cbeacb31c0b907b5068adc45b third_party/mlir-emitc
 d8c7ee00a687ac369e62e2032514a93a9b413502 third_party/pybind11
@@ -12,7 +12,7 @@
 a1390ed39ec77ecfb574bc6fcd5bfc5e3adbdea9 third_party/sdl2
 f8bf11a0253a32375c32cad92c841237b96696c0 third_party/spirv_headers
 57eb48aed36160c4876bc8310d9ca84d42ee9e2a third_party/swiftshader
-ef9971b6d7a1bba53a8d067c6fa092a998892b29 third_party/tensorflow
+86b67b8c829a5a5c61af396ce20ae60e63d9514a third_party/tensorflow
 864d86e8b6d21449474db5e9313dbff90aa9c24f third_party/tracy
 9bd3f561bcee3f01d22912de10bb07ce4e23d378 third_party/vulkan_headers
 909f36b714c9239ee0b112a321220213a474ba53 third_party/vulkan_memory_allocator
diff --git a/build_tools/bazel/third_party_import/llvm-project/overlay/llvm/BUILD.bazel b/build_tools/bazel/third_party_import/llvm-project/overlay/llvm/BUILD.bazel
index 314a81c..c8f1c08 100644
--- a/build_tools/bazel/third_party_import/llvm-project/overlay/llvm/BUILD.bazel
+++ b/build_tools/bazel/third_party_import/llvm-project/overlay/llvm/BUILD.bazel
@@ -548,6 +548,8 @@
             ("-gen-callingconv", "lib/Target/PowerPC/PPCGenCallingConv.inc"),
             ("-gen-subtarget", "lib/Target/PowerPC/PPCGenSubtargetInfo.inc"),
             ("-gen-disassembler", "lib/Target/PowerPC/PPCGenDisassemblerTables.inc"),
+            ("-gen-register-bank", "lib/Target/PowerPC/PPCGenRegisterBank.inc"),
+            ("-gen-global-isel", "lib/Target/PowerPC/PPCGenGlobalISel.inc"),
         ],
     },
     {
@@ -650,6 +652,7 @@
         ":common_target_td_sources",
     ] + glob([
         "lib/Target/" + target["dir_name"] + "/*.td",
+        "lib/Target/" + target["name"] + "/GISel/*.td",
     ]),
     deps = target.get("tbl_deps", []),
 ) for target in llvm_target_list]
@@ -3383,6 +3386,7 @@
         "lib/Target/PowerPC/*.c",
         "lib/Target/PowerPC/*.cpp",
         "lib/Target/PowerPC/*.inc",
+        "lib/Target/PowerPC/GISel/*.cpp",
     ]),
     hdrs = glob([
         "include/llvm/Target/PowerPC/*.h",
@@ -3396,6 +3400,7 @@
         ":AsmPrinter",
         ":CodeGen",
         ":Core",
+        ":GlobalISel",
         ":MC",
         ":PowerPCDesc",
         ":PowerPCInfo",
diff --git a/build_tools/bazel/third_party_import/llvm-project/overlay/mlir/BUILD.bazel b/build_tools/bazel/third_party_import/llvm-project/overlay/mlir/BUILD.bazel
index 1f6d5e7..1834744 100644
--- a/build_tools/bazel/third_party_import/llvm-project/overlay/mlir/BUILD.bazel
+++ b/build_tools/bazel/third_party_import/llvm-project/overlay/mlir/BUILD.bazel
@@ -982,7 +982,6 @@
     ],
     includes = ["include"],
     deps = [
-        ":Analysis",
         ":IR",
         ":ParserTokenKinds",
         ":Support",
@@ -2682,6 +2681,7 @@
         ":Affine",
         ":CallOpInterfaces",
         ":IR",
+        ":LinalgOps",
         ":SCFDialect",
         ":StandardOps",
         ":Support",
@@ -3923,6 +3923,7 @@
         "include/mlir/Interfaces/CallInterfaces.td",
         "include/mlir/Interfaces/ControlFlowInterfaces.h",
         "include/mlir/Interfaces/ControlFlowInterfaces.td",
+        "include/mlir/Interfaces/CopyOpInterface.td",
         "include/mlir/Interfaces/SideEffectInterfaces.td",
         "include/mlir/Interfaces/VectorInterfaces.td",
         "include/mlir/Interfaces/ViewLikeInterface.td",
diff --git a/build_tools/bazel/third_party_import/llvm-project/overlay/mlir/test/BUILD.bazel b/build_tools/bazel/third_party_import/llvm-project/overlay/mlir/test/BUILD.bazel
index 2ed9496..eab6f3f 100644
--- a/build_tools/bazel/third_party_import/llvm-project/overlay/mlir/test/BUILD.bazel
+++ b/build_tools/bazel/third_party_import/llvm-project/overlay/mlir/test/BUILD.bazel
@@ -129,13 +129,16 @@
         "lib/IR/TestPrintDefUse.cpp",
         "lib/IR/TestPrintNesting.cpp",
         "lib/IR/TestSideEffects.cpp",
+        "lib/IR/TestSlicing.cpp",
         "lib/IR/TestSymbolUses.cpp",
         "lib/IR/TestTypes.cpp",
     ],
     deps = [
         ":TestDialect",
         "@llvm-project//llvm:Support",
+        "@llvm-project//mlir:Analysis",
         "@llvm-project//mlir:IR",
+        "@llvm-project//mlir:LinalgOps",
         "@llvm-project//mlir:Pass",
         "@llvm-project//mlir:StandardOps",
         "@llvm-project//mlir:Support",
diff --git a/build_tools/docker/manage_images.py b/build_tools/docker/manage_images.py
index 8b9045a..9e7b7e3 100755
--- a/build_tools/docker/manage_images.py
+++ b/build_tools/docker/manage_images.py
@@ -31,7 +31,8 @@
   python3 build_tools/docker/manage_images.py --push --tag prod --images all
 
 Rebuild and push all images and update references to them in the repository:
-  python3 build_tools/docker/manage_images.py --push --images all --update-references
+  python3 build_tools/docker/manage_images.py --push --images all
+  --update-references
 """
 
 import argparse
@@ -73,12 +74,13 @@
   """Parses command-line options."""
   parser = argparse.ArgumentParser(
       description="Build IREE's Docker images and optionally push them to GCR.")
-  parser.add_argument('--images',
-                      '--image',
-                      type=str,
-                      required=True,
-                      action='append',
-                      help=f'Name of the image to build: {IMAGES_HELP}.')
+  parser.add_argument(
+      '--images',
+      '--image',
+      type=str,
+      required=True,
+      action='append',
+      help=f'Name of the image to build: {IMAGES_HELP}.')
   parser.add_argument(
       '--tag',
       type=str,
@@ -86,12 +88,14 @@
       help='Tag for the images to build. Defaults to `latest` (which is good '
       'for testing changes in a PR). Use `prod` to update the images that the '
       'CI caches.')
-  parser.add_argument('--pull',
-                      action='store_true',
-                      help='Pull the specified image before building.')
-  parser.add_argument('--build',
-                      action='store_true',
-                      help='Build new images from the current Dockerfiles.')
+  parser.add_argument(
+      '--pull',
+      action='store_true',
+      help='Pull the specified image before building.')
+  parser.add_argument(
+      '--build',
+      action='store_true',
+      help='Build new images from the current Dockerfiles.')
   parser.add_argument(
       '--push',
       action='store_true',
@@ -146,11 +150,12 @@
   print(f'Running: `{" ".join(command)}`')
   if dry_run:
     return 0
-  process = subprocess.Popen(command,
-                             bufsize=1,
-                             stderr=subprocess.STDOUT,
-                             stdout=subprocess.PIPE,
-                             universal_newlines=True)
+  process = subprocess.Popen(
+      command,
+      bufsize=1,
+      stderr=subprocess.STDOUT,
+      stdout=subprocess.PIPE,
+      universal_newlines=True)
   for line in process.stdout:
     print(line, end='')
 
@@ -175,11 +180,12 @@
       '-f',
       '{{index .RepoDigests 0}}',
   ]
-  inspect_process = subprocess.run(inspect_command,
-                                   universal_newlines=True,
-                                   stdout=subprocess.PIPE,
-                                   stderr=subprocess.PIPE,
-                                   timeout=10)
+  inspect_process = subprocess.run(
+      inspect_command,
+      universal_newlines=True,
+      stdout=subprocess.PIPE,
+      stderr=subprocess.PIPE,
+      timeout=10)
   if inspect_process.returncode != 0:
     print(f'Computing the repository digest for {image} failed.'
           ' Has it been pushed to GCR?')
@@ -204,11 +210,12 @@
   print(f'Updating references to {image_name}')
 
   grep_command = ['git', 'grep', '-l', f'{image_name}@sha256']
-  grep_process = subprocess.run(grep_command,
-                                stdout=subprocess.PIPE,
-                                stderr=subprocess.PIPE,
-                                timeout=5,
-                                universal_newlines=True)
+  grep_process = subprocess.run(
+      grep_command,
+      stdout=subprocess.PIPE,
+      stderr=subprocess.PIPE,
+      timeout=5,
+      universal_newlines=True)
   if grep_process.returncode > 1:
     print(f'{" ".join(grep_command)} '
           f'failed with exit code {grep_process.returncode}')
@@ -220,9 +227,10 @@
   files = grep_process.stdout.split()
   print(f'Updating references in {len(files)} files: {files}')
   for line in fileinput.input(files=files, inplace=(not dry_run)):
-    print(re.sub(f'{image_name}@sha256:[a-zA-Z0-9]+', f'{image_name}@{digest}',
-                 line),
-          end='')
+    print(
+        re.sub(f'{image_name}@sha256:[a-zA-Z0-9]+', f'{image_name}@{digest}',
+               line),
+        end='')
 
 
 if __name__ == '__main__':
diff --git a/build_tools/third_party/tensorflow/tensorflow/compiler/mlir/hlo/CMakeLists.txt b/build_tools/third_party/tensorflow/tensorflow/compiler/mlir/hlo/CMakeLists.txt
index c6d0125..917a486 100644
--- a/build_tools/third_party/tensorflow/tensorflow/compiler/mlir/hlo/CMakeLists.txt
+++ b/build_tools/third_party/tensorflow/tensorflow/compiler/mlir/hlo/CMakeLists.txt
@@ -85,6 +85,7 @@
     MLIRTransformUtils
     MLIRViewLikeInterface
     tensorflow_mlir_hlo_chlo_ops_gen
+    tensorflow_mlir_hlo_chlo_legalize_to_hlo_inc_gen
     tensorflow_mlir_hlo_hlo_ops_base_gen
     tensorflow_mlir_hlo_hlo_ops_gen
     tensorflow_mlir_hlo_hlo_ops_pattern_gen
@@ -239,3 +240,18 @@
   OUTS
     -gen-rewriters lib/Dialect/mhlo/transforms/generated_lower_complex.inc
 )
+
+external_tablegen_library(
+  PACKAGE
+    tensorflow
+  NAME
+    mlir_hlo_chlo_legalize_to_hlo_inc_gen
+  TBLGEN
+    MLIR
+  ROOT
+    ${TF_MLIR_HLO_SRC_ROOT}
+  SRCS
+    "lib/Dialect/mhlo/transforms/chlo_legalize_to_hlo_patterns.td"
+  OUTS
+    -gen-rewriters lib/Dialect/mhlo/transforms/generated_chlo_legalize_to_hlo.inc
+)
diff --git a/docs/design_docs/metal_hal_driver.md b/docs/design_docs/metal_hal_driver.md
index 5efb9d6..0729d9a 100644
--- a/docs/design_docs/metal_hal_driver.md
+++ b/docs/design_docs/metal_hal_driver.md
@@ -130,10 +130,10 @@
 
 At the moment the Metal HAL driver just has a very simple
 [`hal::Allocator`][hal-allocator] implementation. It just wraps a `MTLDevice`
-and redirects all allocation requests to the `MTLDevice`. No page/pool/slab
-or whatever. This is only meant to get started. In the future we should have
-a better memory allocation library, probably by layering the [Vulkan
-Memory Allocator][vma] on top of [`MTLHeap`][mtl-heap].
+and redirects all allocation requests to the `MTLDevice`. No page/pool/slab or
+whatever. This is only meant to get started. In the future we should have a
+better memory allocation library, probably by layering the
+[Vulkan Memory Allocator][vma] on top of [`MTLHeap`][mtl-heap].
 
 ### Buffer
 
@@ -146,33 +146,32 @@
 
 Metal provides four [`MTLStorageMode`][mtl-storage-mode] options:
 
-* `MTLStorageModeShared`: The resource is stored in system memory and is
-  accessible to both the CPU and the GPU.
-* `MTLStorageModeManaged`: The CPU and GPU may maintain separate copies of the
-  resource, and any changes must be explicitly synchronized.
-* `MTLStorageModePrivate`: The resource can be accessed only by the GPU.
-* `MTLStorageMemoryless`: The resource’s contents can be accessed only by the
-  GPU and only exist temporarily during a render pass.
+*   `MTLStorageModeShared`: The resource is stored in system memory and is
+    accessible to both the CPU and the GPU.
+*   `MTLStorageModeManaged`: The CPU and GPU may maintain separate copies of the
+    resource, and any changes must be explicitly synchronized.
+*   `MTLStorageModePrivate`: The resource can be accessed only by the GPU.
+*   `MTLStorageMemoryless`: The resource’s contents can be accessed only by the
+    GPU and only exist temporarily during a render pass.
 
 Among them, `MTLStorageModeManaged` is only available on macOS.
 
 IREE HAL defines serveral [`MemoryType`][hal-buffer]. They need to map to the
 above storage modes:
 
-* If `kDeviceLocal` but not `kHostVisible`, `MTLStorageModePrivate` is chosen.
-* If `kDeviceLocal` and `kHostVisible`:
-  * If macOS, `MTLStorageModeManaged` can be chosen.
-  * Otherwise, `MTLStorageModeShared` is chosen.
-* If not `DeviceLocal` but `kDeviceVisible`, `MTLStorageModeShared` is chosen.
-* If not `kDeviceLocal` and not `kDeviceVisible`, `MTLStorageModeShared` is
-  chosen. (TODO: We should probably use host buffer here.)
+*   If `kDeviceLocal` but not `kHostVisible`, `MTLStorageModePrivate` is chosen.
+*   If `kDeviceLocal` and `kHostVisible`:
+    *   If macOS, `MTLStorageModeManaged` can be chosen.
+    *   Otherwise, `MTLStorageModeShared` is chosen.
+*   If not `DeviceLocal` but `kDeviceVisible`, `MTLStorageModeShared` is chosen.
+*   If not `kDeviceLocal` and not `kDeviceVisible`, `MTLStorageModeShared` is
+    chosen. (TODO: We should probably use host buffer here.)
 
 IREE HAL also allows to create buffers with `kHostCoherent` bit. This may still
 be backed by `MTLStorageModeManaged` `MTLBuffer`s in macOS. To respect the
 `kHostCoherent` protocol, the Metal HAL driver will perform necessary
 `InValidate`/`Flush` operations automatically under the hood.
 
-
 [macos-version-share]: https://gs.statcounter.com/macos-version-market-share/desktop/worldwide
 [ios-version-share]: https://developer.apple.com/support/app-store/
 [iree-hal]: https://github.com/google/iree/tree/main/iree/hal
diff --git a/integrations/tensorflow/e2e/bool_test.py b/integrations/tensorflow/e2e/bool_test.py
index 674657f..161f6ad 100644
--- a/integrations/tensorflow/e2e/bool_test.py
+++ b/integrations/tensorflow/e2e/bool_test.py
@@ -39,6 +39,7 @@
 
 @tf_test_utils.compile_module(MathModule)
 class BooleanTest(tf_test_utils.TracedModuleTestCase):
+
   def test_constant(self):
 
     def constant(module):
diff --git a/third_party/llvm-project b/third_party/llvm-project
index 009cd4e..7841e21 160000
--- a/third_party/llvm-project
+++ b/third_party/llvm-project
@@ -1 +1 @@
-Subproject commit 009cd4e491033f57f547a7bda63e35b50a6e5cf7
+Subproject commit 7841e21c98495ba5e33e0d2507d985bd5b938445
diff --git a/third_party/tensorflow b/third_party/tensorflow
index ef9971b..86b67b8 160000
--- a/third_party/tensorflow
+++ b/third_party/tensorflow
@@ -1 +1 @@
-Subproject commit ef9971b6d7a1bba53a8d067c6fa092a998892b29
+Subproject commit 86b67b8c829a5a5c61af396ce20ae60e63d9514a