IVGCVSW-5616 Don't fuse activation if quantization parameters are different

Signed-off-by: Teresa Charlin <teresa.charlinreyes@arm.com>
Change-Id: I6504e922113aa9e397f53e570ebcf47e1f133945
diff --git a/src/backends/aclCommon/ArmComputeSubgraphUtils.hpp b/src/backends/aclCommon/ArmComputeSubgraphUtils.hpp
index 860d88d..a0fca46 100644
--- a/src/backends/aclCommon/ArmComputeSubgraphUtils.hpp
+++ b/src/backends/aclCommon/ArmComputeSubgraphUtils.hpp
@@ -45,6 +45,33 @@
     return result;
 }
 
+bool checkDataTypeInputandOutput(const Layer& layer)
+{
+    auto inputInfo = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
+    auto outputInfo = layer.GetOutputSlot(0).GetTensorInfo();
+    bool sameDataType = (inputInfo.GetDataType() == outputInfo.GetDataType());
+
+    // Check is same quantization info (same scale and offset)
+    if (sameDataType)
+    {
+        if (IsQuantizedType(inputInfo.GetDataType()))
+        {
+            bool sameScale = (inputInfo.GetQuantizationScale() == outputInfo.GetQuantizationScale());
+            bool sameOffset = (inputInfo.GetQuantizationOffset() == outputInfo.GetQuantizationOffset());
+
+            return (sameScale && sameOffset);
+        }
+        else
+        {
+            return true;
+        }
+    }
+    else
+    {
+        return false;
+    }
+}
+
 } // namespace
 
 inline void ReportUntouchedLayers(OptimizationViews& optimizationViews, std::map<LayerGuid, Layer*> untouched)
diff --git a/src/backends/cl/ClBackend.cpp b/src/backends/cl/ClBackend.cpp
index 80c7969..928760e 100644
--- a/src/backends/cl/ClBackend.cpp
+++ b/src/backends/cl/ClBackend.cpp
@@ -187,7 +187,8 @@
                 {
                     for (auto&& childInput : output->GetConnections())
                     {
-                        if (childInput->GetOwningLayer().GetType() == LayerType::Activation)
+                        if ((childInput->GetOwningLayer().GetType() == LayerType::Activation) &&
+                            (checkDataTypeInputandOutput(childInput->GetOwningLayer())))
                         {
                             Layer& child = childInput->GetOwningLayer();
 
diff --git a/src/backends/neon/NeonBackend.cpp b/src/backends/neon/NeonBackend.cpp
index 240456f..d48b32b 100644
--- a/src/backends/neon/NeonBackend.cpp
+++ b/src/backends/neon/NeonBackend.cpp
@@ -163,7 +163,8 @@
                 {
                     for (auto&& childInput : output->GetConnections())
                     {
-                        if (childInput->GetOwningLayer().GetType() == LayerType::Activation)
+                        if ((childInput->GetOwningLayer().GetType() == LayerType::Activation) &&
+                            (checkDataTypeInputandOutput(childInput->GetOwningLayer())))
                         {
                             Layer& child = childInput->GetOwningLayer();