<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/59585>59585</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            MLIR: tosa.resize offset is signed, but is lowered as unsigned
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          rwalkr
      </td>
    </tr>
</table>

<pre>
    `tosa.resize` takes an offset parameter which can be negative, so should be treated as a signed value.  However, in floating point mode, it is converted to a float using `arith::UIToFPOp`  at [line 1515 of TosaToLinalg.cpp](https://github.com/llvm/llvm-project/blob/8febe67851458645f93efa33d72717b732007ca7/mlir/lib/Conversion/TosaToLinalg/TosaToLinalg.cpp#L1515). This results in a large positive value, effectively sampling outside the bounds of the input - which is then clipped to the edge of the input

This test case upscales, sampling at half pixel offsets:

```
// RUN: mlir-opt --split-input-file -pass-pipeline="builtin.module(func.func(tosa-to-linalg),empty-tensor-to-alloc-tensor,convert-tensor-to-linalg,one-shot-bufferize{bufferize-function-boundaries allow-return-allocs},buffer-results-to-out-params,func.func(finalizing-bufferize,buffer-deallocation),test-lower-to-llvm)" %s -o - | mlir-cpu-runner -e main -entry-point-result=void -shared-libs=./build-mlir/lib/libmlir_c_runner_utils.so,./build-mlir/lib/libmlir_runner_utils.so | FileCheck %s


func.func @main() {
    %input_f32 = arith.constant dense<[
      [[[  1.], [  2.], [  3.], [  4.]],
 [[  5.], [  6.], [  7.], [  8.]],
       [[  9.], [ 10.], [ 11.], [ 12.]],
       [[ 13.], [ 14.], [ 15.], [ 16.]]]]> : tensor<1x4x4x1xf32>

    // CHECK: sizes = [8, 8]
    // CHECK: [1, 1.25, 1.75, 2.25, 2.75, 3.25, 3.75, 4]
    // CHECK: [2, 2.25, 2.75, 3.25, 3.75, 4.25, 4.75, 5]
    // CHECK: [4, 4.25, 4.75, 5.25, 5.75, 6.25, 6.75, 7]
    // CHECK: [6, 6.25, 6.75, 7.25, 7.75, 8.25, 8.75, 9]
    // CHECK: [8, 8.25, 8.75, 9.25, 9.75, 10.25, 10.75, 11]
    // CHECK: [10, 10.25, 10.75, 11.25, 11.75, 12.25, 12.75, 13]
    // CHECK: [12, 12.25, 12.75, 13.25, 13.75, 14.25, 14.75, 15]
    // CHECK: [13, 13.25, 13.75, 14.25, 14.75, 15.25, 15.75, 16]
    %resize_2x = "tosa.resize"(%input_f32) {border = [0, 0], mode = "BILINEAR", offset = [-2, -2], scale = [8, 4, 8, 4]} : (tensor<1x4x4x1xf32>) -> tensor<1x8x8x1xf32>

   // simplify and print
    %resize_2d = "tosa.reshape"(%resize_2x) {new_shape = [8, 8]} : (tensor<1x8x8x1xf32>) -> tensor<8x8xf32>
    %dyn = tensor.cast %resize_2d : tensor<8x8xf32> to tensor<?x?xf32>
    %unranked = tensor.cast %dyn : tensor<?x?xf32> to tensor<*xf32>
    func.call @printMemrefF32(%unranked) : (tensor<*xf32>) -> ()

    return
}

func.func private @printMemrefF32(%ptr : tensor<*xf32>)
```

Should produce

```
Unranked Memref base@ = 0xaaaafff83e40 rank = 2 offset = 0 sizes = [8, 8] strides = [8, 1] data =
[[1,   1.25,   1.75,   2.25,   2.75,   3.25,   3.75,   4],
 [2, 2.25,   2.75,   3.25,   3.75,   4.25,   4.75,   5],
 [4,   4.25,   4.75, 5.25,   5.75,   6.25,   6.75,   7],
 [6,   6.25,   6.75,   7.25,   7.75, 8.25,   8.75,   9],
 [8,   8.25,   8.75,   9.25,   9.75,   10.25, 10.75,   11],
 [10,   10.25,   10.75,   11.25,   11.75,   12.25,   12.75, 13],
 [12,   12.25,   12.75,   13.25,   13.75,   14.25,   14.75, 15],
 [13,   13.25,   13.75,   14.25,   14.75,   15.25,   15.75, 16]]
```

But instead produces
```
Unranked Memref base@ = 0xaaaac4d9b600 rank = 2 offset = 0 sizes = [8, 8] strides = [8, 1] data =
[[16,   16,   16,   16,   16,   16,   16,   16],
 [16,   16,   16, 16,   16,   16,   16,   16],
 [16,   16,   16,   16,   16,   16,   16, 16],
 [16,   16,   16,   16,   16,   16,   16,   16],
 [16,   16,   16, 16,   16,   16,   16,   16],
 [16,   16,   16,   16,   16,   16,   16, 16],
 [16,   16,   16,   16,   16,   16,   16,   16],
 [16,   16,   16, 16,   16,   16,   16,   16]]
```

The incorrect offset constant can be observed with `mlir-opt -pass-pipeline="builtin.module(func.func(tosa-to-linalg),cse,canonicalize)" resize_e2e.mlir`  producing `%cst = arith.constant 4.2949673E+9 : f32` which is then used as the offset

The `arith::UIToFPOp` should be a `arith::SIToFPOp` (and the tests update) - I can submit a patch to fix this if required.

cc @rsuderman 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWM2S2zgOfhr2BSWXRP0ffOh2xzWpzcxuzSTnLkqC2tzQopak-meefosUJUuOHWemsret6lgBBHwEAYIfRaY1f-4QtyR9IOnjHRvMQaqtemXiq7qrZPO-JVlopGYbhZr_iSQLwbCvqIF1INtWo4GeKXZEgwpeD7w-QM06qBA6fGaGvyChO9AS9EEOorEvjEJmsAGmgYEbv4EXJgbcAPwiX_EFlfXhHbRCMsO7Z-gl7wwcZePQuAGuoZbdCyoLZCSw0RYGbc1JFjLFzYHE9yS-__Lxs9z_65-9jR2YAZI-CN4hRGmUgmzhs9Tss_zEOyaeN3Xfk_SR0OJgTK8tAN0Tun_m5jBUm1oeCd0L8TI9gl7Jf2NtCN1XQlaE7osWK8zyIo2StMiStC1jbFkcNznNo7zKYxqGec1yQvdHwZXF4dZv56ajuewI3S9DOhNdhDT-ZKMntNzA5wPXoFAPwmibNAaCqWeEXmpu8z_m1uYN2xZrqxLvoNmxFzZXcjCaNwjmgFDJoWu0zYmVeNcPBgJfVa6tsoNa8L4fk26NsHnGlQMJH0l4P_660AxqAzXTCEOvayZQuxUxjc8MHJhooedvKPyScnlf4JAs9H-j6EoCv3_5jcT3YLMYyN5AEOhecBO4MIKWC4SgZ1oHPe_RVpzEj4TSauDC8G5zlM0gkNCiHbp6Y38ILexSD4wMhE99SegOj715Dwx2Wir7jgkhay8TuvPrcGEwOe9kh4E-SBNUQ9uisv2TP8z_D-yYhssucHlnitu2EkK-BgrNoLpxJE3yR0J3o1vgC22HkYMJXO_ZhC4n0drx-Z-8e14MPCM06GCZcUvNTtBWKBDyFcfo3eouCaVAaKohkBAAyXdjout-CNTQdaggQDgy3kGAnVHvgetRHx-JH18kbyDQB6awCQSvNIkfN7ZNBi6aYLX0Ba-s_FQ_jchPg-FCb7QkdHfD5czBxbnnAncHrL-6-FfryP3OqQKShHYGhBaElkDyh9EAAKyrW0dPbUyBxI_gNpRNLTttWGegwU4jiXd245ydANw-av8Aoo3bSHbgJLqS4pWUOMkpPNaEka7sspWUr6TiG4xlQADl0joKV9Iq0oh-HylaxR4lK2kVb5RNSONf_AFsv_rGiXfRW_KWvEVvbUxJ_GFZobEArsl3v3zY_cO6WfbRrhIkfSjsGIUFvWpP0ofIWkUbmo7P3D2pl6mXYy_HXk5uodIfQvFy4uX0Fmpy0cvLqZczL2dezm-hZhe9vJx7ufBy4eXyFmpx0cvLpZejcEp8OGmimwULr3lOmqmK0VSAaKpAFN9Ep9c8J81UvWgqRDRVIrpZwCj-caxJM9U1ys7Q0_G09UTfxhVP6fIMRqnbsU4blN-9KqkaVFOPuFyGvh_t0WmCevj46eNvH-5_dzi76RTnvQKnC6j3c4S96rpkbL2pU_JH19SWOq_0NS0hsL2_eF-8Fdf63mdWc3s8aN-BdQ30infmYnqa8_QcWH_Kz5xEn58OX5-cxbfbyMVprML8Zhr27XIKPrTmvXPwo92mZtqcR3x_CcQdqCY1ifdv9t8F_KFTrPuKzaVBxrHvr-Gsh6D338A7ZqyZEJYZXdZ_xaPCdh_7jE6Du4Se5WsBOOVqJNbznX083Hht_niZmnvFX5jBa4H0Rp3NdDn65VOj-_1j_AzplWyGGr9zyPwy5XkcGSqmkSShS3v4xhhjbdsWMSYhWEOnp8tmCq9QFmijeHP2wm6N0DDDrNbH4_jWcRjMLAYzj8HMQTCzEMw8BDMTwdiny6PFisFues-6ZNal54jJNdt01qSzdzbrslmXnyNm37GddecMBjMbwchiS8RisrhgO-vKWfctC4FnsCXoyFgLa1jbn7SnukWn1J-x1wqZXreGE8_AiWngxDVwzlwr5PivYsCJs-CctSbiuthtD4MB3mmDbG45_Te7rU6assrC_3G3-WX3N57nSb5o-bNwbj1_Fs7_Z_ajM_tuG3x2lyO1VAprM63a-VPS35fJSqN6wQZeuTkAycLTxcbPuMWoNdpf1smO10y4c6T7yPcnE6S4cZ_YWQi-V_1VGqFprc2lj-BkQ8ukzHJLug_jicBycBae3RkNerzuMwf0sz_PzvUbu9O9ITuz-mNhRWhhT4p2AIPaaBj6hhl0JxH46FKsh-rIDTDomakP9izU8jcwB66Bt6DwPwNX2GyWkdXuikDpoUF1ZB3cNdu4KeOS3eE2yvIoSbKSFneHLeZRi0UZ1g0tmqrEKimLAouI5iyhUZze8S0NKY1oVEZhUiTFJklonYd1FjVJWNRtSZIQj4yLjRAvx41Uz3dc6wG3aZkW6Z1gFQo93dKqrbt6rIZnTZJQcG30yc1wI3D766ePv7vz0emzYVp3XPtLV7t8q8Ep3OXPWKOhG9_eDUps__IlqAtaE7p3cf83AAD__3jr3sU">