Avoid division with zero

- Check pixel alignment before calculating the padding extension for
CLGEMMReshapeRHSKernel
- Add missing control flow in NEWinogradLayer to avoid division with
zero for N_Blocks

Signed-off-by: Georgios Pinitas <georgios.pinitas@arm.com>
Change-Id: I53fa432e0a4c463840917d81bedeb64a29bb07a4
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/5177
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Manuel Bottini <manuel.bottini@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
diff --git a/src/core/CL/gemm/CLGEMMHelpers.cpp b/src/core/CL/gemm/CLGEMMHelpers.cpp
index 5abe224..61aa962 100644
--- a/src/core/CL/gemm/CLGEMMHelpers.cpp
+++ b/src/core/CL/gemm/CLGEMMHelpers.cpp
@@ -73,10 +73,17 @@
     constexpr unsigned int num_floats_per_pixel = 4;
 
     const unsigned int stride_y_in_elements = tensor->strides_in_bytes()[1] / tensor->element_size();
-    const unsigned int pixel_aligment       = get_cl_image_pitch_alignment(CLKernelLibrary::get().get_device());
-    const unsigned int row_pitch_alignment  = pixel_aligment * num_floats_per_pixel;
-    const unsigned int round_up_width       = ((stride_y_in_elements + row_pitch_alignment - 1) / row_pitch_alignment) * row_pitch_alignment;
-    const unsigned int padding              = round_up_width - stride_y_in_elements;
+    const unsigned int pixel_alignment       = get_cl_image_pitch_alignment(CLKernelLibrary::get().get_device());
+
+    ARM_COMPUTE_ERROR_ON_MSG(pixel_alignment == 0, "Cannot retrieve cl_image pitch alignment");
+    if(pixel_alignment == 0)
+    {
+        return;
+    }
+
+    const unsigned int row_pitch_alignment = pixel_alignment * num_floats_per_pixel;
+    const unsigned int round_up_width      = ((stride_y_in_elements + row_pitch_alignment - 1) / row_pitch_alignment) * row_pitch_alignment;
+    const unsigned int padding             = round_up_width - stride_y_in_elements;
 
     tensor->extend_padding(PaddingSize(0, padding, 0, 0));
 }
diff --git a/src/runtime/NEON/functions/NEWinogradConvolutionLayer.cpp b/src/runtime/NEON/functions/NEWinogradConvolutionLayer.cpp
index 21a4b79..dc3bbbe 100644
--- a/src/runtime/NEON/functions/NEWinogradConvolutionLayer.cpp
+++ b/src/runtime/NEON/functions/NEWinogradConvolutionLayer.cpp
@@ -336,8 +336,8 @@
     _output      = output;
     _is_prepared = false;
 
-    int n_gemms = 0;
-    int N_BLOCK = 0; // Size of block used by GEMM.
+    int n_gemms = 1;
+    int N_BLOCK = 1; // Size of block used by GEMM.
 
     std::unique_ptr<INEWinogradLayerTransformInputKernel>   transform_input_kernel;
     std::unique_ptr<INEWinogradLayerTransformWeightsKernel> transform_weights_kernel;
@@ -452,6 +452,10 @@
         }
     }
 #endif // __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
+    else
+    {
+        ARM_COMPUTE_ERROR("Not supported.");
+    }
 
     const PaddingType use_padding_type = (conv_info.pad_top() != 0u || conv_info.pad_left() != 0) ? PADDING_SAME : PADDING_VALID;
     const bool        use_same_padding = use_padding_type == PADDING_SAME;