Integrate llvm/llvm-project@c33fd3b47faa (#12320)

* Reset third_party/llvm-project:
c33fd3b47faae130518d2217c66da75af0e969b3 (2023-02-22 11:26:41 +0000):
[AArch64] Lower all fp zero buildvectors through BUILD_VECTOR.
* mlir-hlo: 23fc8f581bc602786091ffe711c99ee5339f3e18
* tensorflow: e22c3226477d309aa591cc858f4d1c01fa598721

benchmarks: x86_64, cuda, comp-stats

---------

Co-authored-by: Matthias Springer <me@m-sp.org>
diff --git a/compiler/src/iree/compiler/Dialect/Flow/IR/FlowOpFolders.cpp b/compiler/src/iree/compiler/Dialect/Flow/IR/FlowOpFolders.cpp
index b7d26bd..c5b22c9 100644
--- a/compiler/src/iree/compiler/Dialect/Flow/IR/FlowOpFolders.cpp
+++ b/compiler/src/iree/compiler/Dialect/Flow/IR/FlowOpFolders.cpp
@@ -318,9 +318,12 @@
   mixedOffsets.assign(op.getMixedOffsets());
   mixedSizes.assign(op.getMixedSizes());
   mixedStrides.assign(op.getMixedStrides());
-  canonicalizeSubViewPart(mixedOffsets, ShapedType::isDynamic);
-  canonicalizeSubViewPart(mixedSizes, ShapedType::isDynamic);
-  canonicalizeSubViewPart(mixedStrides, ShapedType::isDynamic);
+  Builder builder(op.getContext());
+  if (failed(foldDynamicIndexList(builder, mixedOffsets)) &&
+      failed(foldDynamicIndexList(builder, mixedSizes)) &&
+      failed(foldDynamicIndexList(builder, mixedStrides))) {
+    return failure();
+  }
 
   // Drop out the same dimensions form before.
   llvm::SmallVector<int64_t> newShape;
diff --git a/compiler/src/iree/compiler/Dialect/Flow/Transforms/FormDispatchRegions.cpp b/compiler/src/iree/compiler/Dialect/Flow/Transforms/FormDispatchRegions.cpp
index ec723cb..79a62b2 100644
--- a/compiler/src/iree/compiler/Dialect/Flow/Transforms/FormDispatchRegions.cpp
+++ b/compiler/src/iree/compiler/Dialect/Flow/Transforms/FormDispatchRegions.cpp
@@ -63,6 +63,7 @@
 
 TensorDimTrackingRewriter::TensorDimTrackingRewriter(Operation *op)
     : IRRewriter(op->getContext()) {
+  setListener(this);
   op->walk([&](tensor::DimOp dimOp) { dimOps.insert(dimOp.getOperation()); });
 }
 SmallVector<tensor::DimOp> TensorDimTrackingRewriter::getTensorDimOps() {
@@ -71,12 +72,12 @@
   return result;
 }
 void TensorDimTrackingRewriter::notifyOperationRemoved(Operation *op) {
-  IRRewriter::notifyOperationRemoved(op);
+  IRRewriter::Listener::notifyOperationRemoved(op);
   if (isa<tensor::DimOp>(op)) dimOps.erase(op);
 }
 
 void TensorDimTrackingRewriter::notifyOperationInserted(Operation *op) {
-  IRRewriter::notifyOperationInserted(op);
+  IRRewriter::Listener::notifyOperationInserted(op);
   if (isa<tensor::DimOp>(op)) dimOps.insert(op);
 }
 
diff --git a/compiler/src/iree/compiler/Dialect/Flow/Transforms/FormDispatchRegions.h b/compiler/src/iree/compiler/Dialect/Flow/Transforms/FormDispatchRegions.h
index ccac135..f39035f 100644
--- a/compiler/src/iree/compiler/Dialect/Flow/Transforms/FormDispatchRegions.h
+++ b/compiler/src/iree/compiler/Dialect/Flow/Transforms/FormDispatchRegions.h
@@ -14,7 +14,7 @@
 namespace mlir {
 class Operation;
 /// A rewriter that keeps track of all tensor::DimOps.
-class TensorDimTrackingRewriter : public IRRewriter {
+class TensorDimTrackingRewriter : public IRRewriter, IRRewriter::Listener {
  public:
   /// Create a new rewriter: Scan the given op for tensor::DimOps.
   TensorDimTrackingRewriter(Operation *op);
diff --git a/integrations/tensorflow/WORKSPACE b/integrations/tensorflow/WORKSPACE
index 63367a2..9f6d690 100644
--- a/integrations/tensorflow/WORKSPACE
+++ b/integrations/tensorflow/WORKSPACE
@@ -7,7 +7,7 @@
 
 load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
 
-TENSORFLOW_COMMIT = "0ffcf238aaf7db5ad5e4448efbb32109a994711a"
+TENSORFLOW_COMMIT = "e22c3226477d309aa591cc858f4d1c01fa598721"
 
 git_repository(
     name = "org_tensorflow",
diff --git a/llvm-external-projects/iree-dialects/include/iree-dialects/Dialect/LinalgTransform/StructuredTransformOpsExt.h b/llvm-external-projects/iree-dialects/include/iree-dialects/Dialect/LinalgTransform/StructuredTransformOpsExt.h
index e8e6d30..3151aa3 100644
--- a/llvm-external-projects/iree-dialects/include/iree-dialects/Dialect/LinalgTransform/StructuredTransformOpsExt.h
+++ b/llvm-external-projects/iree-dialects/include/iree-dialects/Dialect/LinalgTransform/StructuredTransformOpsExt.h
@@ -58,7 +58,7 @@
 #endif // LLVM_ENABLE_ABI_BREAKING_CHECKS
   }
 
-  void notifyRootReplaced(Operation *op, ValueRange newValues) override;
+  void notifyOperationReplaced(Operation *op, ValueRange newValues) override;
 
   void notifyOperationRemoved(Operation *op) override;
 
diff --git a/llvm-external-projects/iree-dialects/include/iree-dialects/Transforms/Listener.h b/llvm-external-projects/iree-dialects/include/iree-dialects/Transforms/Listener.h
index 41a0972..562c99d 100644
--- a/llvm-external-projects/iree-dialects/include/iree-dialects/Transforms/Listener.h
+++ b/llvm-external-projects/iree-dialects/include/iree-dialects/Transforms/Listener.h
@@ -11,53 +11,7 @@
 
 namespace mlir {
 
-//===----------------------------------------------------------------------===//
-// RewriteListener
-//===----------------------------------------------------------------------===//
-
-/// This class represents a listener that can be used to hook on to various
-/// rewrite events in an `OpBuilder` or `PatternRewriter`. The class is notified
-/// by when:
-///
-/// - an operation is removed
-/// - an operation is inserted
-/// - an operation is replaced
-/// - a block is created
-///
-/// Listeners can be used to track IR mutations throughout pattern rewrites.
-struct RewriteListener {
-  virtual ~RewriteListener();
-
-  /// These are the callback methods that subclasses can choose to implement if
-  /// they would like to be notified about certain types of mutations.
-
-  /// Notification handler for when an operation is inserted into the builder.
-  /// op` is the operation that was inserted.
-  virtual void notifyOperationInserted(Operation *op) {}
-
-  /// Notification handler for when a block is created using the builder.
-  /// `block` is the block that was created.
-  virtual void notifyBlockCreated(Block *block) {}
-
-  /// Notification handler for when the specified operation is about to be
-  /// replaced with another set of operations. This is called before the uses of
-  /// the operation have been replaced with the specific values.
-  virtual void notifyRootReplaced(Operation *op, ValueRange newValues) {}
-
-  /// Notification handler for when an the specified operation is about to be
-  /// deleted. At this point, the operation has zero uses.
-  virtual void notifyOperationRemoved(Operation *op) {}
-
-  /// Notify the listener that a pattern failed to match the given operation,
-  /// and provide a callback to populate a diagnostic with the reason why the
-  /// failure occurred. This method allows for derived listeners to optionally
-  /// hook into the reason why a rewrite failed, and display it to users.
-  virtual LogicalResult
-  notifyMatchFailure(Location loc,
-                     function_ref<void(Diagnostic &)> reasonCallback) {
-    return failure();
-  }
-};
+using RewriteListener = RewriterBase::Listener;
 
 //===----------------------------------------------------------------------===//
 // ListenerList
@@ -74,7 +28,9 @@
   /// Send notification of a block being created to all listeners.
   void notifyBlockCreated(Block *block) override;
   /// Send notification that an operation has been replaced to all listeners.
-  void notifyRootReplaced(Operation *op, ValueRange newValues) override;
+  void notifyOperationReplaced(Operation *op, ValueRange newValues) override;
+  /// Send notification that an operation was modified in-place.
+  void notifyOperationModified(Operation *op) override;
   /// Send notification that an operation is about to be deleted to all
   /// listeners.
   void notifyOperationRemoved(Operation *op) override;
@@ -96,15 +52,20 @@
 /// events are forwarded to the provided rewrite listener.
 class PatternRewriterListener : public PatternRewriter, public ListenerList {
 public:
-  PatternRewriterListener(MLIRContext *context) : PatternRewriter(context) {}
+  PatternRewriterListener(MLIRContext *context) : PatternRewriter(context) {
+    setListener(this);
+  }
 
   /// When an operation is about to be replaced, send out an event to all
   /// attached listeners.
   void replaceOp(Operation *op, ValueRange newValues) override {
-    ListenerList::notifyRootReplaced(op, newValues);
+    ListenerList::notifyOperationReplaced(op, newValues);
     PatternRewriter::replaceOp(op, newValues);
   }
 
+  void notifyOperationModified(Operation *op) override {
+    ListenerList::notifyOperationModified(op);
+  }
   void notifyOperationInserted(Operation *op) override {
     ListenerList::notifyOperationInserted(op);
   }
diff --git a/llvm-external-projects/iree-dialects/include/iree-dialects/Transforms/ListenerGreedyPatternRewriteDriver.h b/llvm-external-projects/iree-dialects/include/iree-dialects/Transforms/ListenerGreedyPatternRewriteDriver.h
index 2c0adf6..a8c0912 100644
--- a/llvm-external-projects/iree-dialects/include/iree-dialects/Transforms/ListenerGreedyPatternRewriteDriver.h
+++ b/llvm-external-projects/iree-dialects/include/iree-dialects/Transforms/ListenerGreedyPatternRewriteDriver.h
@@ -12,7 +12,6 @@
 // The following are iree-dialects extensions to MLIR.
 namespace mlir {
 struct GreedyRewriteConfig;
-struct RewriteListener;
 
 /// Applies the specified patterns on `op` alone while also trying to fold it,
 /// by selecting the highest benefits patterns in a greedy manner. Returns
diff --git a/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/StructuredTransformOpsExt.cpp b/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/StructuredTransformOpsExt.cpp
index 4fd5b1c..59057a0 100644
--- a/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/StructuredTransformOpsExt.cpp
+++ b/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/StructuredTransformOpsExt.cpp
@@ -444,8 +444,8 @@
       });
 }
 
-void mlir::TrackingListener::notifyRootReplaced(Operation *op,
-                                                ValueRange newValues) {
+void mlir::TrackingListener::notifyOperationReplaced(Operation *op,
+                                                     ValueRange newValues) {
   // Bail out if in error state.
   if (hadErrors)
     return;
diff --git a/llvm-external-projects/iree-dialects/lib/Transforms/Listener.cpp b/llvm-external-projects/iree-dialects/lib/Transforms/Listener.cpp
index 58bde22..b71ef2e 100644
--- a/llvm-external-projects/iree-dialects/lib/Transforms/Listener.cpp
+++ b/llvm-external-projects/iree-dialects/lib/Transforms/Listener.cpp
@@ -9,12 +9,6 @@
 namespace mlir {
 
 //===----------------------------------------------------------------------===//
-// RewriteListener
-//===----------------------------------------------------------------------===//
-
-RewriteListener::~RewriteListener() = default;
-
-//===----------------------------------------------------------------------===//
 // ListenerList
 //===----------------------------------------------------------------------===//
 
@@ -28,9 +22,15 @@
     listener->notifyBlockCreated(block);
 }
 
-void ListenerList::notifyRootReplaced(Operation *op, ValueRange newValues) {
+void ListenerList::notifyOperationReplaced(Operation *op,
+                                           ValueRange newValues) {
   for (RewriteListener *listener : listeners)
-    listener->notifyRootReplaced(op, newValues);
+    listener->notifyOperationReplaced(op, newValues);
+}
+
+void ListenerList::notifyOperationModified(Operation *op) {
+  for (RewriteListener *listener : listeners)
+    listener->notifyOperationModified(op);
 }
 
 void ListenerList::notifyOperationRemoved(Operation *op) {
diff --git a/llvm-external-projects/iree-dialects/lib/Transforms/ListenerCSE.cpp b/llvm-external-projects/iree-dialects/lib/Transforms/ListenerCSE.cpp
index 866b6d8..b8fc3e1 100644
--- a/llvm-external-projects/iree-dialects/lib/Transforms/ListenerCSE.cpp
+++ b/llvm-external-projects/iree-dialects/lib/Transforms/ListenerCSE.cpp
@@ -194,7 +194,7 @@
     // END copied from mlir/lib/Transforms/CSE.cpp
     //===----------------------------------------------------------------------===//
     if (listener)
-      listener->notifyRootReplaced(op, existing->getResults());
+      listener->notifyOperationReplaced(op, existing->getResults());
     //===----------------------------------------------------------------------===//
     // BEGIN copied from mlir/lib/Transforms/CSE.cpp
     //===----------------------------------------------------------------------===//
diff --git a/llvm-external-projects/iree-dialects/lib/Transforms/ListenerGreedyPatternRewriteDriver.cpp b/llvm-external-projects/iree-dialects/lib/Transforms/ListenerGreedyPatternRewriteDriver.cpp
index 922c4a3..cfcdbe3 100644
--- a/llvm-external-projects/iree-dialects/lib/Transforms/ListenerGreedyPatternRewriteDriver.cpp
+++ b/llvm-external-projects/iree-dialects/lib/Transforms/ListenerGreedyPatternRewriteDriver.cpp
@@ -57,6 +57,8 @@
   // inserted ops are added to the worklist for processing.
   void notifyOperationInserted(Operation *op) override;
 
+  void notifyOperationModified(Operation *op) override;
+
   // Look over the provided operands for any defining operations that should
   // be re-added to the worklist. This function should be called when an
   // operation is modified or removed, as it may trigger further
@@ -70,7 +72,7 @@
   // When the root of a pattern is about to be replaced, it can trigger
   // simplifications to its users - make sure to add them to the worklist
   // before the root is changed.
-  void notifyRootReplaced(Operation *op, ValueRange replacement) override;
+  void notifyOperationReplaced(Operation *op, ValueRange replacement) override;
 
   //===--------------------------------------------------------------------===//
   // END copied from mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp
@@ -380,6 +382,14 @@
   addToWorklist(op);
 }
 
+void GreedyPatternRewriteDriver::notifyOperationModified(Operation *op) {
+  LLVM_DEBUG({
+    logger.startLine() << "** Modified: '" << op->getName() << "'(" << op
+                       << ")\n";
+  });
+  addToWorklist(op);
+}
+
 void GreedyPatternRewriteDriver::addOperandsToWorklist(ValueRange operands) {
   for (Value operand : operands) {
     // If the use count of this operand is now < 2, we re-add the defining
@@ -402,8 +412,8 @@
   });
 }
 
-void GreedyPatternRewriteDriver::notifyRootReplaced(Operation *op,
-                                                    ValueRange replacement) {
+void GreedyPatternRewriteDriver::notifyOperationReplaced(
+    Operation *op, ValueRange replacement) {
   LLVM_DEBUG({
     logger.startLine() << "** Replace : '" << op->getName() << "'(" << op
                        << ")\n";
diff --git a/llvm-external-projects/iree-dialects/test/lib/Transforms/TestListenerPasses.cpp b/llvm-external-projects/iree-dialects/test/lib/Transforms/TestListenerPasses.cpp
index 68f2103..04fc13a 100644
--- a/llvm-external-projects/iree-dialects/test/lib/Transforms/TestListenerPasses.cpp
+++ b/llvm-external-projects/iree-dialects/test/lib/Transforms/TestListenerPasses.cpp
@@ -17,7 +17,7 @@
 /// The test listener prints stuff to `stdout` so that it can be checked by lit
 /// tests.
 struct TestListener : public RewriteListener {
-  void notifyRootReplaced(Operation *op, ValueRange newValues) override {
+  void notifyOperationReplaced(Operation *op, ValueRange newValues) override {
     llvm::outs() << "REPLACED " << op->getName() << "\n";
   }
   void notifyOperationRemoved(Operation *op) override {
diff --git a/third_party/llvm-project b/third_party/llvm-project
index 8b3091b..0a836ff 160000
--- a/third_party/llvm-project
+++ b/third_party/llvm-project
@@ -1 +1 @@
-Subproject commit 8b3091b4b485ddaa64a69fbaf8d85f21d37a61f2
+Subproject commit 0a836ffb391e1aa9af84429298c8b7c93c805527
diff --git a/third_party/mlir-hlo b/third_party/mlir-hlo
index 9665c2b..23fc8f5 160000
--- a/third_party/mlir-hlo
+++ b/third_party/mlir-hlo
@@ -1 +1 @@
-Subproject commit 9665c2bd170a03f503f8177bb908ac9cafe63446
+Subproject commit 23fc8f581bc602786091ffe711c99ee5339f3e18