Support legalization of tf.SplitV op for dynamic shapes
For this example
```
func.func @splitv_dynamic(%input: tensor<?x6xf32>) -> (tensor<?x1xf32>, tensor<?x2xf32>, tensor<?x3xf32>) {
  %split_sizes = "tf.Const"() {value = dense<[1, 2, 3]> : tensor<3xi32>} : () -> tensor<3xi32>
  %split_dim = "tf.Const"() {value = dense<1> : tensor<i32>} : () -> tensor<i32>
  %0:3 = "tf.SplitV"(%input, %split_sizes, %split_dim) : (tensor<?x6xf32>, tensor<3xi32>, tensor<i32>) -> (tensor<?x1xf32>, tensor<?x2xf32>, tensor<?x3xf32>)
  func.return %0#0, %0#1, %0#2 : tensor<?x1xf32>, tensor<?x2xf32>, tensor<?x3xf32>
}
```


it will be converted to
```
module {
  func.func @splitv_dynamic(%arg0: tensor<?x6xf32>) -> (tensor<?x1xf32>, tensor<?x2xf32>, tensor<?x3xf32>) {
    %0 = mhlo.constant dense<[1, 2, 3]> : tensor<3xi32>
    %1 = mhlo.constant dense<1> : tensor<i32>
    %cst = arith.constant dense<1> : tensor<2xindex>
    %cst_0 = arith.constant dense<0> : tensor<2xindex>
    %cst_1 = arith.constant dense<[0, 1]> : tensor<2xindex>
    %cst_2 = arith.constant dense<[0, 3]> : tensor<2xindex>
    %c0 = arith.constant 0 : index
    %dim = tensor.dim %arg0, %c0 : tensor<?x6xf32>
    %c1 = arith.constant 1 : index
    %from_elements = tensor.from_elements %dim, %c1 : tensor<2xindex>
    %2 = mhlo.real_dynamic_slice %arg0, %cst_0, %from_elements, %cst : (tensor<?x6xf32>, tensor<2xindex>, tensor<2xindex>, tensor<2xindex>) -> tensor<?x1xf32>
    %c3 = arith.constant 3 : index
    %from_elements_3 = tensor.from_elements %dim, %c3 : tensor<2xindex>
    %3 = mhlo.real_dynamic_slice %arg0, %cst_1, %from_elements_3, %cst : (tensor<?x6xf32>, tensor<2xindex>, tensor<2xindex>, tensor<2xindex>) -> tensor<?x2xf32>
    %c6 = arith.constant 6 : index
    %from_elements_4 = tensor.from_elements %dim, %c6 : tensor<2xindex>
    %4 = mhlo.real_dynamic_slice %arg0, %cst_2, %from_elements_4, %cst : (tensor<?x6xf32>, tensor<2xindex>, tensor<2xindex>, tensor<2xindex>) -> tensor<?x3xf32>
    return %2, %3, %4 : tensor<?x1xf32>, tensor<?x2xf32>, tensor<?x3xf32>
  }
}
``` AMD ROCm -- Community CI Build — rocm CI build failure was caused by `unrecognized gcc command line option`, which shouldn't be caused by my patch.
<img width="1147" alt="image" src="https://github.com/tensorflow/tensorflow/assets/19923746/b9223db6-7a6b-4053-b9ba-3ad488b21260">
 Hi @rdzhabarov , could you please help to review this change?
Thanks. Hi @rdzhabarov, Can you please review this PR ? Thank you! Hi @rdzhabarov , any comments on this change?
Thanks. Hi @rdzhabarov, Can you please review this PR ? Thank you! Hi @rdzhabarov , could you please taking a look at this PR?
Thanks.
Hi all,

This patch implements the legalization of `tf.SplitV` op for dynamic shapes, which is helpful for dynamic shape compilation
May I get reviews for it?

- Testing:  the following tests all passed
```
   tensorflow/compiler/mlir/tf2xla/tests:all_tests \
   tensorflow/compiler/mlir/tensorflow/tests:all_tests
```

Thanks.
Best regards,
Jie