Skip to content

Commit 1cb9ee7

Browse files
committed
Fixing crash issue in transpose_32 for unaligned buffers
1 parent 731097e commit 1cb9ee7

3 files changed

Lines changed: 30 additions & 45 deletions

File tree

backends/cadence/hifi/operators/op_permute_copy.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ Tensor& permute_copy_out(
6868
InvalidArgument,
6969
out);
7070

71-
const auto in_type = out.scalar_type();
72-
constexpr int kNnlibMaxDim = 16;
71+
const auto in_type = in.scalar_type();
72+
constexpr int kNnlibMaxDim = 5;
7373

7474
bool optimized = false;
7575

@@ -91,7 +91,13 @@ Tensor& permute_copy_out(
9191

9292
for (int i = 0; i < num_inp_dims; i++) {
9393
p_inp_shape[i] = in.size(i);
94-
p_out_shape[i] = in.size(dims[i]);
94+
}
95+
96+
for (int i = 0; i < num_out_dims; i++) {
97+
p_out_shape[i] = out.size(i);
98+
}
99+
100+
for (int i = 0; i < num_inp_dims; i++) {
95101
p_permute_vec[i] = dims[i];
96102
}
97103

backends/cadence/hifi/operators/op_transpose_copy.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Tensor& transpose_copy_int_out(
6464
ET_KERNEL_CHECK(
6565
ctx, tensors_have_same_dim_order(in, out), InvalidArgument, out);
6666

67-
const auto in_type = out.scalar_type();
67+
const auto in_type = in.scalar_type();
6868
constexpr int kNnlibMaxDim = 5;
6969

7070
bool optimized = false;
@@ -85,14 +85,12 @@ Tensor& transpose_copy_int_out(
8585
WORD32 p_out_shape[kNnlibMaxDim];
8686
WORD32 p_permute_vec[kNnlibMaxDim];
8787

88-
for (int i = 0; i < in.dim(); i++) {
88+
for (int i = 0; i < num_inp_dims; i++) {
8989
p_inp_shape[i] = in.size(i);
90-
}
91-
for (int i = 0; i < out.dim(); i++) {
9290
p_out_shape[i] = out.size(i);
9391
}
9492

95-
for (int i = 0; i < in.dim(); i++) {
93+
for (int i = 0; i < num_inp_dims; i++) {
9694
p_permute_vec[i] = i;
9795
}
9896

backends/cadence/hifi/third-party/nnlib/xa_nn_transpose_32.c

Lines changed: 18 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -170,44 +170,23 @@ WORD32 xa_nn_transpose_32_32(WORD32 * __restrict__ p_out
170170
for(itr3 = 0; itr3 < out_dim3; itr3++, p_out+=out_dim4)
171171
{
172172
WORD32 *p_inp4 = p_inp3+(itr3*inp_stride[p_5D_permute_vec[3]]);
173-
if((((unsigned)p_inp4 & 1) == 0) && (((unsigned)p_out & 1) == 0))
173+
ae_int32x2 *__restrict__ pae_i = (ae_int32x2 *)(p_inp4);
174+
ae_int32x2 *__restrict__ pae_o = (ae_int32x2 *)(p_out);
175+
ae_valign a_inp = AE_LA64_PP(pae_i);
176+
ae_valign a_out = AE_ZALIGN64();
177+
ae_int32x2 d0;
178+
for(itr4 = 0; itr4 < (out_dim4 >> 1); itr4++)
174179
{
175-
ae_int32x2 *__restrict__ pae_i = (ae_int32x2 *)(p_inp4);
176-
ae_int32x2 *__restrict__ pae_o = (ae_int32x2 *)(p_out);
177-
ae_int32x2 d0;
178-
for(itr4 = 0; itr4 < (out_dim4 >> 1); itr4++)
179-
{
180-
AE_L32X2_IP(d0, pae_i, 2 * sizeof(WORD32));
181-
AE_S32X2_IP(d0, pae_o, 2 * sizeof(WORD32));
182-
}
183-
ae_int32 *__restrict__ puae_i = (ae_int32 *)(pae_i);
184-
ae_int32 *__restrict__ puae_o = (ae_int32 *)(pae_o);
185-
#pragma loop_count max=3
186-
for(itr4 = 0; itr4 < (out_dim4 & 1); itr4++)
187-
{
188-
puae_o[itr4] = puae_i[itr4];
189-
}
180+
AE_LA32X2_IP(d0, a_inp, pae_i);
181+
AE_SA32X2_IP(d0, a_out, pae_o);
190182
}
191-
else
192-
{
193-
ae_int32x2 *__restrict__ pae_i = (ae_int32x2 *)(p_inp4);
194-
ae_int32x2 *__restrict__ pae_o = (ae_int32x2 *)(p_out);
195-
ae_valign a_inp = AE_LA64_PP(pae_i);
196-
ae_valign a_out = AE_ZALIGN64();
197-
ae_int32x2 d0;
198-
for(itr4 = 0; itr4 < (out_dim4 >> 1); itr4++)
199-
{
200-
AE_LA32X2_IP(d0, a_inp, pae_i);
201-
AE_SA32X2_IP(d0, a_out, pae_o);
202-
}
203-
AE_SA64POS_FP(a_out, pae_o);
204-
ae_int32 *__restrict__ puae_i = (ae_int32 *)(pae_i);
205-
ae_int32 *__restrict__ puae_o = (ae_int32 *)(pae_o);
183+
AE_SA64POS_FP(a_out, pae_o);
184+
ae_int32 *__restrict__ puae_i = (ae_int32 *)(pae_i);
185+
ae_int32 *__restrict__ puae_o = (ae_int32 *)(pae_o);
206186
#pragma loop_count max=3
207-
for(itr4 = 0; itr4 < (out_dim4 & 1); itr4++)
208-
{
209-
puae_o[itr4] = puae_i[itr4];
210-
}
187+
for(itr4 = 0; itr4 < (out_dim4 & 1); itr4++)
188+
{
189+
puae_o[itr4] = puae_i[itr4];
211190
}
212191
}
213192
}
@@ -237,8 +216,10 @@ WORD32 xa_nn_transpose_32_32(WORD32 * __restrict__ p_out
237216
ae_int32x2 d0, d1;
238217
ae_int32x2 tmp0;
239218

240-
AE_L32_XP(d0, (ae_int32 *)p_inp4, inp_stride[p_5D_permute_vec[4]] << 2);
241-
AE_L32_XP(d1, (ae_int32 *)p_inp4, inp_stride[p_5D_permute_vec[4]] << 2);
219+
d0 = AE_L32_X((ae_int32 *)p_inp4, 0);
220+
p_inp4 += inp_stride[p_5D_permute_vec[4]];
221+
d1 = AE_L32_X((ae_int32 *)p_inp4, 0);
222+
p_inp4 += inp_stride[p_5D_permute_vec[4]];
242223

243224
tmp0 = AE_SEL32_HH(d0, d1);
244225

0 commit comments

Comments
 (0)