From d660eada35bd6ed863970f08adb0b916c907c09e Mon Sep 17 00:00:00 2001 From: Yuduo Wu Date: Wed, 23 Jul 2025 09:23:10 -0700 Subject: [PATCH] [QNN-EP] Fix data type check to skip optional I/Os --- .../qnn/builder/opbuilder/base_op_builder.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/onnxruntime/core/providers/qnn/builder/opbuilder/base_op_builder.cc b/onnxruntime/core/providers/qnn/builder/opbuilder/base_op_builder.cc index 0152ad27c0ba2..e248034f225ec 100644 --- a/onnxruntime/core/providers/qnn/builder/opbuilder/base_op_builder.cc +++ b/onnxruntime/core/providers/qnn/builder/opbuilder/base_op_builder.cc @@ -8,6 +8,13 @@ namespace onnxruntime { namespace qnn { +namespace { +bool IsOptionalNodeUnitIODef(const NodeUnitIODef& node_io_def) { + const NodeArg& arg = node_io_def.node_arg; + return !arg.Exists() || arg.Name().empty(); +} +} // namespace + std::string BaseOpBuilder::GetOpBuilderType() const { return op_builder_type_; } @@ -46,12 +53,18 @@ Status BaseOpBuilder::ProcessDataTypes(QnnModelWrapper& qnn_model_wrapper, const auto& inputs = node_unit.Inputs(); const auto& outputs = node_unit.Outputs(); for (auto input : inputs) { + if (IsOptionalNodeUnitIODef(input)) { + continue; + } TensorInfo tensor_info = {}; ORT_RETURN_IF_ERROR(qnn_model_wrapper.GetTensorInfo(input, tensor_info)); Qnn_DataType_t qnn_data_type = tensor_info.qnn_data_type; input_qnn_dtypes.push_back(qnn_data_type); } for (auto output : outputs) { + if (IsOptionalNodeUnitIODef(output)) { + continue; + } TensorInfo tensor_info = {}; ORT_RETURN_IF_ERROR(qnn_model_wrapper.GetTensorInfo(output, tensor_info)); Qnn_DataType_t qnn_data_type = tensor_info.qnn_data_type;