def _first_call_op_prepare_after_hook_adjust_subgraphs(
        self,
        op: Callable,
        outputs: Any,
        args: Tuple[Any, ...],
        qtensor_id: List[int],
        op_quantizeability_type: OpQuantizeabilityType,
    ) -> None:
        """
        After `op` was just executed, modifies the subgraph recorded
        for this op with the information about the output. Note, this
        has to be done in the "after" hook because the output of the op
        does not exist in the "before" hook.
        """

        # TODO(future PR): handle non-tensor outputs
        def _add_output_qtensor_info(output):
            output._qtensor_info = QTensorInfo(
                qtensor_id[0], output.dtype, output.dtype
            )  # type: ignore[arg-type]
            if op_quantizeability_type is OpQuantizeabilityType.QUANTIZEABLE:
                target = self.idx_to_seen_q_op_infos[self.idx].output_tensor_infos
                self.idx_to_seen_q_op_infos[
                    self.idx
                ].insert_fake_quant_after_outputs.append(False)
            else:
                target = self.seen_nonq_op_infos[-1].output_tensor_infos
            target.append(output._qtensor_info)
            qtensor_id[0] += 1

        if isinstance(outputs, torch.Tensor):
            _add_output_qtensor_info(outputs)
        elif isinstance(outputs, tuple):
            for element in outputs:
                if isinstance(element, torch.Tensor):
                    _add_output_qtensor_info(element)

        After `op` was just executed, modifies the subgraph recorded
        for this op with the information about the output. Note, this
        has to be done in the "after" hook because the output of the op
        does not exist in the "before" hook.
        
intel_extension_for_pytorch/quantization/_quantization_state.py