[LLVMdev] Preserving the order of WRITE_REGISTER, READ_REGISTER in IR and ISelDAG
Johnson, Nicholas Paul
Nicholas.Paul.Johnson at DEShawResearch.com
Wed May 6 07:43:40 PDT 2015
Thanks Hal, and sorry about the confusion between llvm-commits, llvm-dev, and Bugzilla. For reference, this thread discusses Bug#23389.
From: Hal Finkel [mailto:hfinkel at anl.gov]
>It should not be modeled as read-write, however, but just as a read (thus, I
>think that IntrReadMem is appropriate).
>
Some embedded programmers might prefer the R/W semantics to prevent the compiler from re-ordering explicit register reads, but either semantics are acceptable for my purposes.
>> > // 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);
...
>> >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();
>
>No, I think the existing code is right. The SDAG intrinsic node should take the
>incoming chain as its first argument.
>
I disagree that the expression 'getValue(RegValue).getOperand(0)' evaluates to a chain.
RegValue refers to the second operand of llvm.write_register, i.e., an llvm::Value being assigned to a register. The SDValue result of getValue(RegValue) references an SDNode that doesn't necessarily have an operand 0, and if it does, that operand is not necessarily a chain.
In particular, consider:
1. if 'RegValue' is an llvm::ConstantInt, and
2. SelectionDAGBuilder::getValue has not yet cached it in NodeMap,
3. then SelectionDAGBuilder::getValueImpl will try to materialize it via SelectionDAG::getConstant.
4. If that constant is not yet in the SelectionDAG's CSEMap,
5. then SelectionDAG::getConstant returns an SDValue referencing a new ConstantSDNode.
6. That ConstantSDNode has no operands, let alone a chain operand.
There was also a third part of the patch that I mentioned at Bug#23389, but which was not mentioned in my initial llvm-dev post. I'll mention it here for sake of discussion:
SelectionDAGISel::Select_WRITE_REGISTER transcribes ISD::WRITE_REGISTER nodes into ISD::CopyToReg nodes. In doing so, it ignore replaces the WRITE_REGISTER's chain operand with CurDAG->getEntryNode(). I think it should instead preserve the chain operand found in the WRITE_REGISTER node. An analogous fix is necessary for in SelectionDAGISel::Select_READ_REGISTER.
N
More information about the llvm-commits
mailing list