MLCE-545 INT8 TFLite model execution abnormal

 * Fix for Debug mode in ExNet does not work with ConstTensorsAsInputs
 * Remove unnecessary assertion with ambiguous message in LoadedNetwork

Signed-off-by: Keith Davis <keith.davis@arm.com>
Change-Id: I9cd5d1f811dbbc89072d1190c510bf1b22e3069c
diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp
index d55b99e..40fbde8 100644
--- a/src/armnn/LoadedNetwork.cpp
+++ b/src/armnn/LoadedNetwork.cpp
@@ -740,13 +740,6 @@
 
     ARMNN_ASSERT_MSG(workloadFactory, "No workload factory");
 
-    std::string reasonIfUnsupported;
-    ARMNN_ASSERT_MSG(IWorkloadFactory::IsLayerSupported(layer,
-                                                        {},
-                                                        reasonIfUnsupported,
-                                                        m_OptimizedNetwork->pOptimizedNetworkImpl->GetModelOptions()),
-        "Factory does not support layer");
-    IgnoreUnused(reasonIfUnsupported);
     return *workloadFactory;
 }
 
diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp
index 3508ee8..5930805 100644
--- a/src/armnn/Network.cpp
+++ b/src/armnn/Network.cpp
@@ -1797,6 +1797,17 @@
         throw InvalidArgumentException("Failed to apply the backend-specific optimizations");
     }
 
+    // Convert constants
+    {
+        ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ConvertConstants");
+        Optimizer::Pass(optGraph, MakeOptimizations(ConvertConstantsFloatToHalf()));
+        Optimizer::Pass(optGraph, MakeOptimizations(ConvertConstantsHalfToFloat()));
+
+        // Once the constants are converted we can now safely call RedirectMembersToConstantInputs
+        Optimizer::Pass(optGraph, MakeOptimizations(RedirectMembersToConstantInputs()));
+    }
+
+    // This must occur after all topological changes to the graph and any redirection of variables
     // If the debug flag is set, then insert a DebugLayer after each layer
     // Doing this after applying the backend optimizations as they might have changed some layers
     if (options.m_Debug)
@@ -1824,15 +1835,6 @@
         optGraph.AddCompatibilityLayers(backends, tensorHandleFactoryRegistry);
     }
 
-    // Convert constants
-    {
-        ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ConvertConstants");
-        Optimizer::Pass(optGraph, MakeOptimizations(ConvertConstantsFloatToHalf()));
-        Optimizer::Pass(optGraph, MakeOptimizations(ConvertConstantsHalfToFloat()));
-
-        // Once the constants are converted we can now safely call RedirectMembersToConstantInputs
-        Optimizer::Pass(optGraph, MakeOptimizations(RedirectMembersToConstantInputs()));
-    }
     return optNet;
 }
 
diff --git a/src/armnn/layers/DebugLayer.cpp b/src/armnn/layers/DebugLayer.cpp
index 57cf3b7..8342c53 100644
--- a/src/armnn/layers/DebugLayer.cpp
+++ b/src/armnn/layers/DebugLayer.cpp
@@ -8,7 +8,6 @@
 
 #include <armnn/backends/WorkloadData.hpp>
 #include <armnn/backends/WorkloadFactory.hpp>
-#include <armnn/utility/IgnoreUnused.hpp>
 
 namespace armnn
 {
@@ -54,9 +53,7 @@
 
 void DebugLayer::ExecuteStrategy(IStrategy& strategy) const
 {
-    // by design debug layers are never in input graphs
-    IgnoreUnused(strategy);
-    throw armnn::Exception("DebugLayer should never appear in an input graph");
+    strategy.ExecuteStrategy(this, GetParameters(), {}, GetName());
 }
 
 } // namespace armnn
diff --git a/src/armnn/optimizations/RedirectMembersToConstantInputs.hpp b/src/armnn/optimizations/RedirectMembersToConstantInputs.hpp
index 4833774..a2bad71 100644
--- a/src/armnn/optimizations/RedirectMembersToConstantInputs.hpp
+++ b/src/armnn/optimizations/RedirectMembersToConstantInputs.hpp
@@ -63,6 +63,8 @@
         for (unsigned int inputSlotIndex = 1; inputSlotIndex != layerPtr->GetNumInputSlots(); ++inputSlotIndex)
         {
             OutputSlot* outputSlot = layerPtr->GetInputSlot(inputSlotIndex).GetConnectedOutputSlot();
+            // Debug layers should not be inserted in optimize process yet
+            ARMNN_ASSERT(outputSlot->GetOwningLayer().GetType() != LayerType::Debug);
             if (outputSlot->GetOwningLayer().GetType() == LayerType::Constant)
             {
                 // Get constant layer and redirect base layer member variables.