Removing HAL ops that are unused and difficult to support long-term. (#6763)

* Removing hal.buffer_view.subview.
It will not work for anything but dense tensors and it should be needed.
The aliasing also complicates things.

* Removing hal.buffer_view.compute_offset/compute_range.
Buffer views are fully type erased and these won't work when we have
non-dense tensors.
diff --git a/iree/compiler/Dialect/HAL/IR/HALOpFolders.cpp b/iree/compiler/Dialect/HAL/IR/HALOpFolders.cpp
index 71cce15..312ead6 100644
--- a/iree/compiler/Dialect/HAL/IR/HALOpFolders.cpp
+++ b/iree/compiler/Dialect/HAL/IR/HALOpFolders.cpp
@@ -402,42 +402,6 @@
 
 namespace {
 
-/// Expands a hal.buffer_view.subview op into range computation and creation
-/// ops. This allows for greater opportunity to CSE/bypass/etc the buffer view
-/// operations.
-struct ExpandBufferViewSubviewOp
-    : public OpRewritePattern<BufferViewSubviewOp> {
-  using OpRewritePattern<BufferViewSubviewOp>::OpRewritePattern;
-
-  LogicalResult matchAndRewrite(BufferViewSubviewOp op,
-                                PatternRewriter &rewriter) const override {
-    auto computeRangeOp = rewriter.create<BufferViewComputeRangeOp>(
-        op.getLoc(), op.buffer_view(), op.indices(), op.lengths());
-
-    auto bufferValue = rewriter.createOrFold<BufferViewBufferOp>(
-        op.getLoc(), IREE::HAL::BufferType::get(rewriter.getContext()),
-        op.buffer_view());
-    auto subspanValue = rewriter.createOrFold<BufferSubspanOp>(
-        op.getLoc(), bufferValue.getType(), bufferValue,
-        computeRangeOp.offset(), computeRangeOp.length());
-
-    auto elementTypeValue = rewriter.createOrFold<BufferViewElementTypeOp>(
-        op.getLoc(), rewriter.getI32Type(), op.buffer_view());
-    rewriter.replaceOpWithNewOp<BufferViewCreateOp>(
-        op, subspanValue, elementTypeValue, op.lengths());
-    return success();
-  }
-};
-
-}  // namespace
-
-void BufferViewSubviewOp::getCanonicalizationPatterns(
-    OwningRewritePatternList &results, MLIRContext *context) {
-  results.insert<ExpandBufferViewSubviewOp>(context);
-}
-
-namespace {
-
 /// Skips a hal.buffer_view.buffer accessor when the buffer view was created in
 /// the same scope and we know the origin buffer.
 struct SkipBufferViewBufferOp : public OpRewritePattern<BufferViewBufferOp> {
@@ -463,77 +427,6 @@
 
 namespace {
 
-/// Expands a hal.buffer_view.compute_offset op to use
-/// hal.allocator.compute_offset. This allows for all of the shape math to
-/// happen in the VM where we can better optimize it.
-struct ExpandBufferViewComputeOffsetOp
-    : public OpRewritePattern<BufferViewComputeOffsetOp> {
-  using OpRewritePattern<BufferViewComputeOffsetOp>::OpRewritePattern;
-
-  LogicalResult matchAndRewrite(BufferViewComputeOffsetOp op,
-                                PatternRewriter &rewriter) const override {
-    auto bufferValue = rewriter.createOrFold<BufferViewBufferOp>(
-        op.getLoc(), IREE::HAL::BufferType::get(rewriter.getContext()),
-        op.buffer_view());
-    auto allocatorValue = rewriter.createOrFold<BufferAllocatorOp>(
-        op.getLoc(), AllocatorType::get(rewriter.getContext()), bufferValue);
-    int rank = op.indices().size();
-    SmallVector<Type, 4> dimTypes(rank, rewriter.getIndexType());
-    auto dimsOp = rewriter.create<BufferViewDimsOp>(op.getLoc(), dimTypes,
-                                                    op.buffer_view());
-    auto elementTypeValue = rewriter.createOrFold<BufferViewElementTypeOp>(
-        op.getLoc(), rewriter.getI32Type(), op.buffer_view());
-    rewriter.replaceOpWithNewOp<AllocatorComputeOffsetOp>(
-        op, allocatorValue, dimsOp.result(), elementTypeValue, op.indices());
-    return success();
-  }
-};
-
-}  // namespace
-
-void BufferViewComputeOffsetOp::getCanonicalizationPatterns(
-    OwningRewritePatternList &results, MLIRContext *context) {
-  results.insert<ExpandBufferViewComputeOffsetOp>(context);
-}
-
-namespace {
-
-/// Expands a hal.buffer_view.compute_range op to use
-/// hal.allocator.compute_range. This allows for all of the shape math to
-/// happen in the VM where we can better optimize it.
-struct ExpandBufferViewComputeRangeOp
-    : public OpRewritePattern<BufferViewComputeRangeOp> {
-  using OpRewritePattern<BufferViewComputeRangeOp>::OpRewritePattern;
-
-  LogicalResult matchAndRewrite(BufferViewComputeRangeOp op,
-                                PatternRewriter &rewriter) const override {
-    auto bufferValue = rewriter.createOrFold<BufferViewBufferOp>(
-        op.getLoc(), IREE::HAL::BufferType::get(rewriter.getContext()),
-        op.buffer_view());
-    auto allocatorValue = rewriter.createOrFold<BufferAllocatorOp>(
-        op.getLoc(), AllocatorType::get(rewriter.getContext()), bufferValue);
-    int rank = op.indices().size();
-    SmallVector<Type, 4> dimTypes(rank, rewriter.getIndexType());
-    auto dimsOp = rewriter.create<BufferViewDimsOp>(op.getLoc(), dimTypes,
-                                                    op.buffer_view());
-    auto elementTypeValue = rewriter.createOrFold<BufferViewElementTypeOp>(
-        op.getLoc(), rewriter.getI32Type(), op.buffer_view());
-    rewriter.replaceOpWithNewOp<AllocatorComputeRangeOp>(
-        op, allocatorValue, dimsOp.result(), elementTypeValue, op.indices(),
-        op.lengths());
-    return success();
-  }
-};
-
-}  // namespace
-
-void BufferViewComputeRangeOp::getCanonicalizationPatterns(
-    OwningRewritePatternList &results, MLIRContext *context) {
-  results.insert<ExpandBufferViewComputeRangeOp>(context);
-}
-
-namespace {
-
 /// Expands a hal.buffer_view.dims op into individual ops for each dimension.
 struct ExpandBufferViewDimsOp : public OpRewritePattern<BufferViewDimsOp> {
   using OpRewritePattern<BufferViewDimsOp>::OpRewritePattern;
diff --git a/iree/compiler/Dialect/HAL/IR/HALOps.cpp b/iree/compiler/Dialect/HAL/IR/HALOps.cpp
index be4314a..7e3fb55 100644
--- a/iree/compiler/Dialect/HAL/IR/HALOps.cpp
+++ b/iree/compiler/Dialect/HAL/IR/HALOps.cpp
@@ -523,15 +523,6 @@
 }
 
 //===----------------------------------------------------------------------===//
-// hal.buffer_view.subview
-//===----------------------------------------------------------------------===//
-
-void BufferViewSubviewOp::getAsmResultNames(
-    function_ref<void(Value, StringRef)> setNameFn) {
-  setNameFn(result(), "view");
-}
-
-//===----------------------------------------------------------------------===//
 // hal.buffer_view.buffer
 //===----------------------------------------------------------------------===//
 
@@ -556,41 +547,6 @@
 }
 
 //===----------------------------------------------------------------------===//
-// hal.buffer_view.compute_offset
-//===----------------------------------------------------------------------===//
-
-void BufferViewComputeOffsetOp::build(OpBuilder &builder, OperationState &state,
-                                      Value bufferView, ValueRange indices) {
-  state.addOperands({bufferView});
-  state.addOperands(indices);
-  state.addTypes({builder.getIndexType()});
-}
-
-void BufferViewComputeOffsetOp::getAsmResultNames(
-    function_ref<void(Value, StringRef)> setNameFn) {
-  setNameFn(offset(), "off");
-}
-
-//===----------------------------------------------------------------------===//
-// hal.buffer_view.compute_range
-//===----------------------------------------------------------------------===//
-
-void BufferViewComputeRangeOp::build(OpBuilder &builder, OperationState &state,
-                                     Value bufferView, ValueRange indices,
-                                     ValueRange lengths) {
-  state.addOperands({bufferView});
-  state.addOperands(indices);
-  state.addOperands(lengths);
-  state.addTypes({builder.getIndexType(), builder.getIndexType()});
-}
-
-void BufferViewComputeRangeOp::getAsmResultNames(
-    function_ref<void(Value, StringRef)> setNameFn) {
-  setNameFn(offset(), "off");
-  setNameFn(length(), "len");
-}
-
-//===----------------------------------------------------------------------===//
 // hal.command_buffer.create
 //===----------------------------------------------------------------------===//
 
diff --git a/iree/compiler/Dialect/HAL/IR/HALOps.td b/iree/compiler/Dialect/HAL/IR/HALOps.td
index c987084..91cfbf3 100644
--- a/iree/compiler/Dialect/HAL/IR/HALOps.td
+++ b/iree/compiler/Dialect/HAL/IR/HALOps.td
@@ -154,7 +154,6 @@
   let summary = [{buffer view indices to byte offset computation operation}];
   let description = [{
     Computes an element byte offset within a buffer produced by the allocator.
-    This returns the same value as `hal.buffer_view.compute_offset`.
   }];
 
   let arguments = (ins
@@ -194,7 +193,6 @@
   let summary = [{buffer view byte range computation operation}];
   let description = [{
     Computes a byte range within a buffer for one or more elements.
-    This returns the same value as `hal.buffer_view.compute_range`.
   }];
 
   let arguments = (ins
@@ -599,35 +597,6 @@
   ];
 }
 
-def HAL_BufferViewSubviewOp : HAL_PureOp<"buffer_view.subview", [
-    DeclareOpInterfaceMethods<OpAsmOpInterface>,
-    SameVariadicOperandSize,
-  ]> {
-  let summary = [{buffer view subview initializer}];
-  let description = [{
-    Returns a view into a another buffer view. The buffer is not copied and both
-    the original and sliced references must be synchronized.
-  }];
-
-  let arguments = (ins
-    HAL_BufferView:$buffer_view,
-    HAL_Dims:$indices,
-    HAL_Dims:$lengths
-  );
-  let results = (outs
-    HAL_BufferView:$result
-  );
-
-  let assemblyFormat = [{
-    $buffer_view `,`
-    `indices` `=` `[` $indices `]` `,`
-    `lengths` `=` `[` $lengths `]`
-    attr-dict `:` type($result)
-  }];
-
-  let hasCanonicalizer = 1;
-}
-
 def HAL_BufferViewBufferOp : HAL_PureOp<"buffer_view.buffer", [
     DeclareOpInterfaceMethods<OpAsmOpInterface>,
   ]> {
@@ -656,6 +625,9 @@
   let summary = [{buffer view buffer byte length accessor}];
   let description = [{
     Returns the allocated size of a shaped buffer view in bytes.
+    This may exceed the logical size of the buffer view; for example sparse
+    tensors will have an allocation size that may be for the maximum possible
+    size of the tensor when fully dense.
   }];
 
   let arguments = (ins
@@ -675,76 +647,6 @@
   ];
 }
 
-def HAL_BufferViewComputeOffsetOp : HAL_PureOp<"buffer_view.compute_offset", [
-    DeclareOpInterfaceMethods<OpAsmOpInterface>,
-  ]> {
-  let summary = [{buffer view indices to byte offset computation operation}];
-  let description = [{
-    Computes an element byte offset within a buffer view.
-  }];
-
-  let arguments = (ins
-    HAL_BufferView:$buffer_view,
-    HAL_Dims:$indices
-  );
-
-  let results = (outs
-    HAL_DeviceSize:$offset
-  );
-
-  let assemblyFormat = [{
-    $buffer_view `,`
-    `indices` `=` `[` $indices `]`
-    attr-dict `:` type($offset)
-  }];
-
-  let skipDefaultBuilders = 1;
-  let builders = [
-    OpBuilder<(ins "Value":$bufferView, "ValueRange":$indices)>,
-  ];
-
-  let hasCanonicalizer = 1;
-}
-
-def HAL_BufferViewComputeRangeOp : HAL_PureOp<"buffer_view.compute_range", [
-    DeclareOpInterfaceMethods<OpAsmOpInterface>,
-    SameVariadicOperandSize,
-  ]> {
-  let summary = [{buffer view byte range computation operation}];
-  let description = [{
-    Computes a byte range within a buffer for one or more elements.
-  }];
-
-  let arguments = (ins
-    HAL_BufferView:$buffer_view,
-    HAL_Dims:$indices,
-    HAL_Dims:$lengths
-  );
-  let results = (outs
-    // TODO(benvanik): return a strides tuple instead, or one per dim.
-    HAL_DeviceSize:$offset,
-    HAL_DeviceSize:$length
-  );
-
-  let assemblyFormat = [{
-    $buffer_view `,`
-    `indices` `=` `[` $indices `]` `,`
-    `lengths` `=` `[` $lengths `]`
-    attr-dict `:` type($offset) `,` type($length)
-  }];
-
-  let skipDefaultBuilders = 1;
-  let builders = [
-    OpBuilder<(ins
-      "Value":$bufferView,
-      "ValueRange":$indices,
-      "ValueRange":$lengths
-    )>,
-  ];
-
-  let hasCanonicalizer = 1;
-}
-
 def HAL_BufferViewElementTypeOp : HAL_PureOp<"buffer_view.element_type"> {
   let summary = [{buffer view element type query}];
   let description = [{
diff --git a/iree/compiler/Dialect/HAL/IR/test/buffer_view_folding.mlir b/iree/compiler/Dialect/HAL/IR/test/buffer_view_folding.mlir
index 3e215ab..802b0ae 100644
--- a/iree/compiler/Dialect/HAL/IR/test/buffer_view_folding.mlir
+++ b/iree/compiler/Dialect/HAL/IR/test/buffer_view_folding.mlir
@@ -1,30 +1,5 @@
 // RUN: iree-opt -allow-unregistered-dialect -split-input-file -canonicalize -cse %s | iree-opt -allow-unregistered-dialect -split-input-file | IreeFileCheck %s
 
-// CHECK-LABEL: func @expand_buffer_view_subview
-func @expand_buffer_view_subview(
-  // CHECK-SAME: %[[VIEW:.+]]: !hal.buffer_view,
-  %view : !hal.buffer_view,
-  // CHECK-SAME: %[[INDEX0:.+]]: index, %[[INDEX1:.+]]: index, %[[LENGTH0:.+]]: index, %[[LENGTH1:.+]]: index
-  %index0 : index, %index1 : index, %length0 : index, %length1 : index
-) -> !hal.buffer_view {
-  //      CHECK: = hal.buffer_view.dim %[[VIEW]], 1 : index
-  //      CHECK: %[[ELEMENT_TYPE:.+]] = hal.buffer_view.element_type %[[VIEW]] : i32
-  // << A BUNCH OF MATH >>
-  //      CHECK: %[[BUFFER:.+]] = hal.buffer_view.buffer %[[VIEW]] : !hal.buffer
-  // CHECK-NEXT: %[[SUBSPAN:.+]] = hal.buffer.subspan<%[[BUFFER]] : !hal.buffer>[%{{.+}}, %{{.+}}] : !hal.buffer
-  //      CHECK: %[[SUBVIEW:.+]] = hal.buffer_view.create
-  // CHECK-SAME:     %[[SUBSPAN]],
-  // CHECK-SAME:     element_type = %[[ELEMENT_TYPE]],
-  // CHECK-SAME:     shape = [%[[LENGTH0]], %[[LENGTH1]]] : !hal.buffer -> !hal.buffer_view
-  %subview = hal.buffer_view.subview %view,
-                                     indices = [%index0, %index1],
-                                     lengths = [%length0, %length1] : !hal.buffer_view
-  // CHECK-NEXT: return %[[SUBVIEW]]
-  return %subview : !hal.buffer_view
-}
-
-// -----
-
 // CHECK-LABEL: func @skip_buffer_view_buffer
 // CHECK-SAME: %[[BUFFER:.+]]: !hal.buffer
 func @skip_buffer_view_buffer(%buffer : !hal.buffer) -> !hal.buffer {
@@ -39,46 +14,6 @@
 
 // -----
 
-// CHECK-LABEL: func @buffer_view_compute_offset
-// CHECK-SAME: %[[VIEW:.+]]: !hal.buffer_view
-func @buffer_view_compute_offset(%arg0 : !hal.buffer_view) -> index {
-  // CHECK: %[[INDICES:.+]]:2 = "test_hal.indices"() : () -> (index, index)
-  %0:2 = "test_hal.indices"() : () -> (index, index)
-  // CHECK: %[[D0:.+]] = hal.buffer_view.dim %[[VIEW]], 1 : index
-  // CHECK: %[[TYPE:.+]] = hal.buffer_view.element_type %[[VIEW]] : i32
-  // CHECK: %[[T0:.+]] = muli %[[INDICES]]#0, %[[D0]] : index
-  // CHECK: %[[T1:.+]] = addi %[[T0]], %[[INDICES]]#1 : index
-  // CHECK: %[[T2:.+]] = index_cast %[[TYPE]] : i32 to index
-  // CHECK: %[[T3:.+]] = and %[[T2]], %c255 : index
-  // CHECK: %[[T4:.+]] = addi %[[T3]], %c7 : index
-  // CHECK: %[[T6:.+]] = divi_unsigned %[[T4]], %c8 : index
-  // CHECK: %[[T7:.+]] = muli %[[T1]], %[[T6]] : index
-  %off = hal.buffer_view.compute_offset %arg0, indices = [%0#0, %0#1] : index
-  // CHECK: return %[[T7]]
-  return %off : index
-}
-
-// -----
-
-// CHECK-LABEL: func @buffer_view_compute_range
-// CHECK-SAME: %[[VIEW:.+]]: !hal.buffer_view
-func @buffer_view_compute_range(%arg0 : !hal.buffer_view) -> (index, index) {
-  %0:2 = "test_hal.indices"() : () -> (index, index)
-  %1:2 = "test_hal.lengths"() : () -> (index, index)
-  // Testing things like this is brittle :/
-  // Since the canonicalizers are taking these buffer view ops to allocator ops
-  // the testing there should cover with the checks here just to make sure the
-  // right values from the buffer view are passed in.
-  //      CHECK: = hal.buffer_view.dim %[[VIEW]], 1 : index
-  //      CHECK: = hal.buffer_view.element_type %[[VIEW]] : i32
-  // << A BUNCH OF MATH >>
-  %off, %len = hal.buffer_view.compute_range %arg0, indices = [%0#0, %0#1], lengths = [%1#0, %1#1] : index, index
-  // CHECK: return
-  return %off, %len : index, index
-}
-
-// -----
-
 // CHECK-LABEL: func @expand_buffer_view_dims
 // CHECK-SAME: %[[VIEW:.+]]: !hal.buffer_view
 func @expand_buffer_view_dims(%arg0 : !hal.buffer_view) -> (index, index, index) {
diff --git a/iree/compiler/Dialect/HAL/IR/test/buffer_view_ops.mlir b/iree/compiler/Dialect/HAL/IR/test/buffer_view_ops.mlir
index 65b8fc0..d254350 100644
--- a/iree/compiler/Dialect/HAL/IR/test/buffer_view_ops.mlir
+++ b/iree/compiler/Dialect/HAL/IR/test/buffer_view_ops.mlir
@@ -11,17 +11,6 @@
 
 // -----
 
-// CHECK-LABEL: @buffer_view_subview
-func @buffer_view_subview(%arg0: !hal.buffer_view) -> !hal.buffer_view {
-  %0:2 = "test_hal.indices"() : () -> (index, index)
-  %1:2 = "test_hal.lengths"() : () -> (index, index)
-  // CHECK: %view = hal.buffer_view.subview %arg0, indices = [%0#0, %0#1], lengths = [%1#0, %1#1] : !hal.buffer_view
-  %view = hal.buffer_view.subview %arg0, indices = [%0#0, %0#1], lengths = [%1#0, %1#1] : !hal.buffer_view
-  return %view : !hal.buffer_view
-}
-
-// -----
-
 // CHECK-LABEL: @buffer_view_buffer
 func @buffer_view_buffer(%arg0: !hal.buffer_view) -> !hal.buffer {
   // CHECK: %buffer = hal.buffer_view.buffer %arg0 : !hal.buffer
@@ -40,27 +29,6 @@
 
 // -----
 
-// CHECK-LABEL: @buffer_view_compute_offset
-func @buffer_view_compute_offset(%arg0: !hal.buffer_view) -> index {
-  %0:2 = "test_hal.indices"() : () -> (index, index)
-  // CHECK: %off = hal.buffer_view.compute_offset %arg0, indices = [%0#0, %0#1]
-  %off = hal.buffer_view.compute_offset %arg0, indices = [%0#0, %0#1] : index
-  return %off : index
-}
-
-// -----
-
-// CHECK-LABEL: @buffer_view_compute_range
-func @buffer_view_compute_range(%arg0: !hal.buffer_view) -> (index, index) {
-  %0:2 = "test_hal.indices"() : () -> (index, index)
-  %1:2 = "test_hal.lengths"() : () -> (index, index)
-  // CHECK: %off, %len = hal.buffer_view.compute_range %arg0, indices = [%0#0, %0#1], lengths = [%1#0, %1#1]
-  %off, %len = hal.buffer_view.compute_range %arg0, indices = [%0#0, %0#1], lengths = [%1#0, %1#1] : index, index
-  return %off, %len : index, index
-}
-
-// -----
-
 // CHECK-LABEL: @buffer_view_shape_queries
 func @buffer_view_shape_queries(%arg0: !hal.buffer_view) -> (index, index, index, index) {
   // CHECK: %{{.+}} = hal.buffer_view.rank %arg0 : index
diff --git a/iree/compiler/Dialect/HAL/Utils/TypeUtils.cpp b/iree/compiler/Dialect/HAL/Utils/TypeUtils.cpp
index 1eb2477..36e091c 100644
--- a/iree/compiler/Dialect/HAL/Utils/TypeUtils.cpp
+++ b/iree/compiler/Dialect/HAL/Utils/TypeUtils.cpp
@@ -201,30 +201,19 @@
 }
 
 Value TensorRewriteAdaptor::computeOffset(ValueRange indices) {
-  if (isBufferView()) {
-    return rewriter_.createOrFold<IREE::HAL::BufferViewComputeOffsetOp>(
-        loc_, getBufferView(), indices);
-  } else {
-    auto shapeDims = getShapeDims();
-    if (!shapeDims) return {};
-    return rewriter_.createOrFold<IREE::HAL::AllocatorComputeOffsetOp>(
-        loc_, getAllocator(), *shapeDims, getElementType(), indices);
-  }
+  auto shapeDims = getShapeDims();
+  if (!shapeDims) return {};
+  return rewriter_.createOrFold<IREE::HAL::AllocatorComputeOffsetOp>(
+      loc_, getAllocator(), *shapeDims, getElementType(), indices);
 }
 
 llvm::Optional<TensorRewriteAdaptor::Range> TensorRewriteAdaptor::computeRange(
     ValueRange indices, ValueRange lengths) {
-  if (isBufferView()) {
-    auto range = rewriter_.create<IREE::HAL::BufferViewComputeRangeOp>(
-        loc_, getBufferView(), indices, lengths);
-    return Range{range.offset(), range.length()};
-  } else {
-    auto shapeDims = getShapeDims();
-    if (!shapeDims) return llvm::None;
-    auto range = rewriter_.create<IREE::HAL::AllocatorComputeRangeOp>(
-        loc_, getAllocator(), *shapeDims, getElementType(), indices, lengths);
-    return Range{range.offset(), range.length()};
-  }
+  auto shapeDims = getShapeDims();
+  if (!shapeDims) return llvm::None;
+  auto range = rewriter_.create<IREE::HAL::AllocatorComputeRangeOp>(
+      loc_, getAllocator(), *shapeDims, getElementType(), indices, lengths);
+  return Range{range.offset(), range.length()};
 }
 
 }  // namespace HAL
diff --git a/iree/compiler/Dialect/HAL/Utils/TypeUtils.h b/iree/compiler/Dialect/HAL/Utils/TypeUtils.h
index f640f2f..f91304a 100644
--- a/iree/compiler/Dialect/HAL/Utils/TypeUtils.h
+++ b/iree/compiler/Dialect/HAL/Utils/TypeUtils.h
@@ -91,7 +91,7 @@
   // Performs the equivalent of a hal.buffer_view.byte_length.
   Value getByteLength();
 
-  // Performs the equivalent of a hal.buffer_view.compute_offset.
+  // Performs the equivalent of a hal.allocator.compute_offset.
   Value computeOffset(ValueRange indices);
 
   struct Range {
@@ -99,7 +99,7 @@
     Value length;
   };
 
-  // Performs the equivalent of a hal.buffer_view.compute_range.
+  // Performs the equivalent of a hal.allocator.compute_range.
   llvm::Optional<Range> computeRange(ValueRange indices, ValueRange lengths);
 
  private:
diff --git a/iree/hal/buffer_view.c b/iree/hal/buffer_view.c
index 78e2201..af464d2 100644
--- a/iree/hal/buffer_view.c
+++ b/iree/hal/buffer_view.c
@@ -210,31 +210,6 @@
   }
 }
 
-IREE_API_EXPORT iree_status_t iree_hal_buffer_view_subview(
-    const iree_hal_buffer_view_t* buffer_view,
-    const iree_hal_dim_t* start_indices, iree_host_size_t indices_count,
-    const iree_hal_dim_t* lengths, iree_host_size_t lengths_count,
-    iree_hal_buffer_view_t** out_buffer_view) {
-  IREE_ASSERT_ARGUMENT(out_buffer_view);
-
-  // NOTE: we rely on the compute range call to do parameter validation.
-  iree_device_size_t start_offset = 0;
-  iree_device_size_t subview_length = 0;
-  IREE_RETURN_IF_ERROR(iree_hal_buffer_view_compute_range(
-      buffer_view, start_indices, indices_count, lengths, lengths_count,
-      &start_offset, &subview_length));
-
-  iree_hal_buffer_t* subview_buffer = NULL;
-  IREE_RETURN_IF_ERROR(iree_hal_buffer_subspan(
-      buffer_view->buffer, start_offset, subview_length, &subview_buffer));
-
-  iree_status_t status =
-      iree_hal_buffer_view_create(subview_buffer, lengths, lengths_count,
-                                  buffer_view->element_type, out_buffer_view);
-  iree_hal_buffer_release(subview_buffer);
-  return status;
-}
-
 IREE_API_EXPORT iree_hal_buffer_t* iree_hal_buffer_view_buffer(
     const iree_hal_buffer_view_t* buffer_view) {
   IREE_ASSERT_ARGUMENT(buffer_view);
diff --git a/iree/hal/buffer_view.h b/iree/hal/buffer_view.h
index f232985..a4595e6 100644
--- a/iree/hal/buffer_view.h
+++ b/iree/hal/buffer_view.h
@@ -182,13 +182,6 @@
     iree_hal_buffer_usage_t allowed_usage, iree_byte_span_t data,
     iree_allocator_t data_allocator, iree_hal_buffer_view_t** out_buffer_view);
 
-// Creates a buffer view referencing a subview of the given |buffer_view|.
-IREE_API_EXPORT iree_status_t iree_hal_buffer_view_subview(
-    const iree_hal_buffer_view_t* buffer_view,
-    const iree_hal_dim_t* start_indices, iree_host_size_t indices_count,
-    const iree_hal_dim_t* lengths, iree_host_size_t lengths_count,
-    iree_hal_buffer_view_t** out_buffer_view);
-
 // Retains the given |buffer_view| for the caller.
 IREE_API_EXPORT void iree_hal_buffer_view_retain(
     iree_hal_buffer_view_t* buffer_view);