COMPMID-765: Sanitize permutation vector for Permute.

If permutation vector is bigger than the tensorshape to permute then
infer dimensions of size one for the extra dimensions.

Change-Id: I5addb292f770d925f47f756902e16073039e8f71
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/120473
Tested-by: Jenkins <bsgcomp@arm.com>
Reviewed-by: Stefana Simion <stefana.simion@arm.com>
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
diff --git a/arm_compute/core/Helpers.h b/arm_compute/core/Helpers.h
index c6a7db4..63fad1d 100644
--- a/arm_compute/core/Helpers.h
+++ b/arm_compute/core/Helpers.h
@@ -508,10 +508,28 @@
 template <typename T>
 inline void permute(Dimensions<T> &dimensions, const PermutationVector &perm)
 {
-    auto copy_dimensions = utility::make_array<Dimensions<T>::num_max_dimensions>(dimensions.begin(), dimensions.end());
+    auto dimensions_copy = utility::make_array<Dimensions<T>::num_max_dimensions>(dimensions.begin(), dimensions.end());
     for(unsigned int i = 0; i < perm.num_dimensions(); ++i)
     {
-        dimensions[i] = copy_dimensions[perm[i]];
+        T dimension_val = (perm[i] < dimensions.num_dimensions()) ? dimensions_copy[perm[i]] : 0;
+        dimensions.set(i, dimension_val);
+    }
+}
+
+/** Permutes given TensorShape according to a permutation vector
+ *
+ * @warning Validity of permutation is not checked
+ *
+ * @param[in, out] shape Shape to permute
+ * @param[in]      perm  Permutation vector
+ */
+inline void permute(TensorShape &shape, const PermutationVector &perm)
+{
+    auto shape_copy = utility::make_array<TensorShape::num_max_dimensions>(shape.begin(), shape.end());
+    for(unsigned int i = 0; i < perm.num_dimensions(); ++i)
+    {
+        size_t dimension_val = (perm[i] < shape.num_dimensions()) ? shape_copy[perm[i]] : 1;
+        shape.set(i, dimension_val);
     }
 }