1. What is the usage of DUMMY_READ_VOLATILE ? In line 4092 to 4103 of SDCCicode.c, why geniCodeDummyRead is called rather than direct ast2iCode, just like the else branch?

  /* if we find a nullop */
  if (tree->type == EX_OP && (tree->opval.op == NULLOP || tree->opval.op == BLOCK))
    {
      if (tree->left && tree->left->type == EX_VALUE)
        geniCodeDummyRead (ast2iCode (tree->left, lvl + 1));
      else
        ast2iCode (tree->left, lvl + 1);
      if (tree->right && tree->right->type == EX_VALUE)
        geniCodeDummyRead (ast2iCode (tree->right, lvl + 1));
      else
        ast2iCode (tree->right, lvl + 1);
      return NULL;
    }

2. In the function geniCodeDummyRead in SDCCicode.c, Why the passed in parameter op is assigned to the right operand rather than the left one?

/*-----------------------------------------------------------------*/
/* geniCodeDummyRead - generate code for dummy read                */
/*-----------------------------------------------------------------*/
static void
geniCodeDummyRead (operand * op)
{
  iCode *ic;
  sym_link *type = operandType (op);

  if (!IS_VOLATILE (type))
    return;

  ic = newiCode (DUMMY_READ_VOLATILE, NULL, op);
  ADDTOCHAIN (ic);

  ic->nosupdate = 1;
}