[LLVMdev] Preserving the order of WRITE_REGISTER, READ_REGISTER in IR and ISelDAG

Johnson, Nicholas Paul Nicholas.Paul.Johnson at DEShawResearch.com
Wed Apr 29 10:26:08 PDT 2015


Hello,

I have a few questions regarding intrinsics llvm.write_register, llvm.read_register and the corresponding selection DAG node types ISD::WRITE_REGISTER, ISD::READ_REGISTER.  As background, I'll mention that Clang emits these in response to variables declared as ``register int eax asm("eax");''

(1) Per include/llvm/IR/Intrinsics.td, the intrinsic llvm.write_register is modeled with a memory side effect, but llvm.read_register is not (i.e, the intrinsic is declared with IntrNoMem).  If I understand correctly, this means that the relative ordering of calls to llvm.write_register will be preserved, but that optimizations may freely reorder llvm.read_register.  Why is this?  It seems like llvm.read_register should be ordered w.r.t. llvm.write_register, or the register-asm syntax is pretty much useless.

(2) Per SelectionDAGBuilder::visitIntrinsicCall, the Chain operand for ISD::WRITE_REGISTER SDNodes is derived from the second operand of the llvm.write_register intrinsic call (i.e., from the value being written to the registger), as follows:

  // excerpt from lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  case Intrinsic::write_register: {
    Value *Reg = I.getArgOperand(0);
    Value *RegValue = I.getArgOperand(1);
    SDValue Chain = getValue(RegValue).getOperand(0);
    SDValue RegName =
      DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
    DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
      RegName, getValue(RegValue)));
    return nullptr;
  }

Is this a bug?  It seems that the chain should instead be the selection DAG root, as so:

-    SDValue Chain = getValue(RegValue).getOperand(0);
+   SDValue Chain = DAG.getRoot();


Thank you,
Nick





More information about the llvm-dev mailing list