IVGCVSW-4997 'Superfluous memcopy workloads'

* If Output Layer is already connected to MemCopy Layer do not insert
  CopyMemGenericWorkload.

Signed-off-by: Sadik Armagan <sadik.armagan@arm.com>
Change-Id: I9f813be5a3de2bc62d16864edb3eeaf371ef48e0
diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp
index 7b64a88..3362574 100644
--- a/src/armnn/LoadedNetwork.cpp
+++ b/src/armnn/LoadedNetwork.cpp
@@ -685,24 +685,29 @@
     }
     else
     {
-        // If we got here then we didn't export the memory, so add an output workload which performs a memcopy.
-        outputQueueDescriptor.m_Inputs.push_back(inputTensorHandle);
-        info.m_InputTensorInfos.push_back(inputTensorInfo);
-
-        std::unique_ptr<IWorkload> outputWorkload =
-            std::make_unique<CopyMemGenericWorkload>(outputQueueDescriptor, info);
-        ARMNN_ASSERT_MSG(outputWorkload, "No output workload created");
-
-        std::unique_ptr<TimelineUtilityMethods> timelineUtils =
-                                TimelineUtilityMethods::GetTimelineUtils(m_ProfilingService);
-        if (timelineUtils)
+        const Layer& connectedLayer = layer.GetInputSlots()[0].GetConnectedOutputSlot()->GetOwningLayer();
+        // Do not add MemCopy Layer if OutputLayer is already connected the MemCopy Layer
+        if (connectedLayer.GetType() != LayerType::MemCopy)
         {
-            // Add Output Workload to the post-optimisation network structure
-            AddWorkloadStructure(timelineUtils, outputWorkload, layer);
-            timelineUtils->Commit();
-        }
+            // If we got here then we didn't export the memory, so add an output workload which performs a memcopy.
+            outputQueueDescriptor.m_Inputs.push_back(inputTensorHandle);
+            info.m_InputTensorInfos.push_back(inputTensorInfo);
 
-        m_OutputQueue.push_back(move(outputWorkload));
+            std::unique_ptr<IWorkload> outputWorkload =
+                std::make_unique<CopyMemGenericWorkload>(outputQueueDescriptor, info);
+            ARMNN_ASSERT_MSG(outputWorkload, "No output workload created");
+
+            std::unique_ptr<TimelineUtilityMethods> timelineUtils =
+                TimelineUtilityMethods::GetTimelineUtils(m_ProfilingService);
+            if (timelineUtils)
+            {
+                // Add Output Workload to the post-optimisation network structure
+                AddWorkloadStructure(timelineUtils, outputWorkload, layer);
+                timelineUtils->Commit();
+            }
+
+            m_OutputQueue.push_back(move(outputWorkload));
+        }
     }
 }