I inserted the following code in the NMPBackend module:
template <typename T> static void RescaleBias(Node &node, Function *F) {
  auto res = dyn_cast<T>(&node)->getResult();
  const TypeRef resTy = res.getType();
  auto bias = dyn_cast<T>(&node)->getBias();
  const TypeRef biasTy = bias.getType();
  auto ElemTy = biasTy->getElementType();
  const TypeRef newTy = F->getParent()->uniqueType(
      ElemTy, biasTy->dims(), resTy->getScale(), resTy->getOffset());
  bias.setType(newTy);
}

Expected<bool>
NMPBackend::transformPostOptPipeline(Function *F,
                                     CompilationContext &cctx) const {
  for (auto &node : F->getNodes()) {
    switch (node.getKind()) {
    case Kinded::Kind::ConvolutionNodeKind:
      RescaleBias<ConvolutionNode>(node, F);
      break;
    case Kinded::Kind::FullyConnectedNodeKind:
      RescaleBias<FullyConnectedNode>(node, F);
      break;
    default:;
    }
    continue;
  }
  convertQuantizedConstants(F, cctx);

Dumping the graph and LIR, the type and quantization information is correct, but the data is not quantized correctly. Apparently, the convertQuantizedConstants(F, cctx) call has no effect. Any tips?