[LLVMdev] Inserting nodes into SelectionDAG (X86)

Artjom K. artjom.kochtchi at googlemail.com
Fri Jun 26 04:49:31 PDT 2009

Thank you for your help.

I think I managed to create the instruction I wanted:

  // mov eax, 41
  Chain = DAG.getCopyToReg(Chain, DAG.getRegister(X86::EAX, MVT::i32),
DAG.getConstant(41, MVT::i32), InFlag);
  InFlag = Chain.getValue(1);

I don't understand though what InFlag is for. As I read the code, it even
remains uninitialized when first passed to some node creation method.

Unfortunately I still don't manage to create more sophisticated error free
instructions that actually appear in the assembly generated by llc. For
example after the CopyToReg instruction, I want to increase eax by 1. In X86
'inc eax' would probably be the way to go, which I try to model by ISD 'addc
eax, eax, 1' or something of that sort (it's probably rather 'addc eax, 1').

I've tried all sorts of combinations and ordering of operands I could come
up with, but I seem to be missing the point. This is the most complete

  // inc eax
  Ops.push_back(DAG.getRegister(X86::EAX, MVT::i32)); // rather without
target register?
  Ops.push_back(DAG.getRegister(X86::EAX, MVT::i32));
  Ops.push_back(DAG.getConstant(1, MVT::i32));
  Chain = DAG.getNode(ISD::ADDC, DAG.getVTList(MVT::Other, MVT::Flag),
&Ops[0], Ops.size());
  InFlag = Chain.getValue(1);

Usually, llc quits with the error message
llc: SelectionDAG.cpp:4417: llvm::SDValue
llvm::SelectionDAG::UpdateNodeOperands(llvm::SDValue, llvm::SDValue,
llvm::SDValue): Assertion `N->getNumOperands() == 2 && "Update with wrong
number of operands"' failed.
Omiting the target register or switching operand order seems not to change

I'd really appreciate your help on this.
View this message in context: http://www.nabble.com/Inserting-nodes-into-SelectionDAG-%28X86%29-tp24211066p24218876.html
Sent from the LLVM - Dev mailing list archive at Nabble.com.

More information about the llvm-dev mailing list