aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeresa Charlin <teresa.charlinreyes@arm.com>2023-07-27 16:20:19 +0100
committerTeresaARM <teresa.charlinreyes@arm.com>2023-08-03 16:32:13 +0000
commit608000e2381dd4178d30a00b0c05c108d3c57cca (patch)
tree8925feba046d180a2dd860e3c177dfcb1d77111e
parentb4c493430567bff25e61e9df0dbab554c29f635d (diff)
downloadarmnn-608000e2381dd4178d30a00b0c05c108d3c57cca.tar.gz
IVGCVSW-7892 Segmentation fault when an input is directly connected to an output
Signed-off-by: Teresa Charlin <teresa.charlinreyes@arm.com> Change-Id: I850970b4ebae68fc252f5468e3709725305961cc
-rw-r--r--src/armnn/LoadedNetwork.cpp75
1 files changed, 42 insertions, 33 deletions
diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp
index 7150261ddd..5967685ebb 100644
--- a/src/armnn/LoadedNetwork.cpp
+++ b/src/armnn/LoadedNetwork.cpp
@@ -451,8 +451,12 @@ LoadedNetwork::LoadedNetwork(std::unique_ptr<IOptimizedNetwork> net,
m_InputWorkloadSlotPairs[bindingId].emplace_back(WorkloadIndices{
armnn::numeric_cast<unsigned int>(workloadIndex), inputSlot->GetSlotIndex()});
- auto workload = m_WorkloadQueue[m_InputWorkloadSlotPairs[bindingId].back().m_WorkloadIndex].get();
- supportsReplacement &= workload->SupportsTensorHandleReplacement();
+ // Avoid if input is connected directly to an output
+ if (inputSlot->GetOwningLayer().GetType() != LayerType::Output)
+ {
+ auto workload = m_WorkloadQueue[m_InputWorkloadSlotPairs[bindingId].back().m_WorkloadIndex].get();
+ supportsReplacement &= workload->SupportsTensorHandleReplacement();
+ }
}
ITensorHandleFactory::FactoryId factoryId = layer->GetOutputSlot(0).GetTensorHandleFactoryId();
@@ -482,44 +486,49 @@ LoadedNetwork::LoadedNetwork(std::unique_ptr<IOptimizedNetwork> net,
const auto outputSlot = layer->GetInputSlot(0).GetConnectedOutputSlot();
auto& indices = m_OutputWorkloadSlotPairs[bindingId];
- auto workloadIndex = std::distance(order.begin(), order.GetPosInGraph(outputSlot->GetOwningLayer()));
- workloadIndex -= noOfInputs;
+ // Avoid if output is connected directly to an input
+ if (outputSlot->GetOwningLayer().GetType() != LayerType::Input)
+ {
+ auto workloadIndex = std::distance(order.begin(), order.GetPosInGraph(outputSlot->GetOwningLayer()));
+ workloadIndex -= noOfInputs;
- indices.m_OutputSlotIndices = WorkloadIndices{numeric_cast<unsigned int>(workloadIndex),
- outputSlot->CalculateIndexOnOwner()};
+ indices.m_OutputSlotIndices = WorkloadIndices{numeric_cast<unsigned int>(workloadIndex),
+ outputSlot->CalculateIndexOnOwner()};
- bool supportsReplacement = true;
- auto outputWorkload = m_WorkloadQueue[indices.m_OutputSlotIndices.m_WorkloadIndex].get();
- supportsReplacement &= outputWorkload->SupportsTensorHandleReplacement();
+ bool supportsReplacement = true;
+ auto outputWorkload = m_WorkloadQueue[indices.m_OutputSlotIndices.m_WorkloadIndex].get();
+ supportsReplacement &= outputWorkload->SupportsTensorHandleReplacement();
- for (auto &inputSlot: outputSlot->GetConnections())
- {
- if(inputSlot->GetOwningLayer().GetType() != LayerType::Output)
+ for (auto &inputSlot: outputSlot->GetConnections())
{
- auto inWorkloadIndex = std::distance(order.begin(),
- order.GetPosInGraph(inputSlot->GetOwningLayer()));
- inWorkloadIndex -= noOfInputs;
- indices.m_InputSlotIndices.emplace_back(WorkloadIndices{numeric_cast<unsigned int>(inWorkloadIndex),
- inputSlot->GetSlotIndex()});
- auto inputWorkload = m_WorkloadQueue[indices.m_InputSlotIndices.back().m_WorkloadIndex].get();
- supportsReplacement &= inputWorkload->SupportsTensorHandleReplacement();
+ if (inputSlot->GetOwningLayer().GetType() != LayerType::Output)
+ {
+ auto inWorkloadIndex = std::distance(order.begin(),
+ order.GetPosInGraph(inputSlot->GetOwningLayer()));
+ inWorkloadIndex -= noOfInputs;
+ indices.m_InputSlotIndices.emplace_back(
+ WorkloadIndices{numeric_cast<unsigned int>(inWorkloadIndex),
+ inputSlot->GetSlotIndex()});
+ auto inputWorkload = m_WorkloadQueue[indices.m_InputSlotIndices.back().m_WorkloadIndex].get();
+ supportsReplacement &= inputWorkload->SupportsTensorHandleReplacement();
+ }
}
- }
- ITensorHandleFactory::FactoryId factoryId = outputSlot->GetTensorHandleFactoryId();
- // Get matching import factory Id
- ITensorHandleFactory::FactoryId importFactoryId =
- m_TensorHandleFactoryRegistry.GetMatchingImportFactoryId(factoryId);
- ITensorHandleFactory *importFactory = m_TensorHandleFactoryRegistry.GetFactory(importFactoryId);
+ ITensorHandleFactory::FactoryId factoryId = outputSlot->GetTensorHandleFactoryId();
+ // Get matching import factory Id
+ ITensorHandleFactory::FactoryId importFactoryId =
+ m_TensorHandleFactoryRegistry.GetMatchingImportFactoryId(factoryId);
+ ITensorHandleFactory *importFactory = m_TensorHandleFactoryRegistry.GetFactory(importFactoryId);
- if (supportsReplacement && importFactory)
- {
- m_PreImportedOutputHandles.emplace_back(
- bindingId, importFactory->CreateTensorHandle(outputSlot->GetTensorInfo(), false));
- }
- else
- {
- m_PreImportedOutputHandles.emplace_back(bindingId, nullptr);
+ if (supportsReplacement && importFactory)
+ {
+ m_PreImportedOutputHandles.emplace_back(
+ bindingId, importFactory->CreateTensorHandle(outputSlot->GetTensorInfo(), false));
+ }
+ else
+ {
+ m_PreImportedOutputHandles.emplace_back(bindingId, nullptr);
+ }
}
}
}