[LLVMdev] Inserting nodes into SelectionDAG (X86)
Artjom Kochtchi
artjom.kochtchi at googlemail.com
Fri Jul 3 13:56:25 PDT 2009
Thanks to your help I've actually made some progress... Especially the
SelectionDAGNodes.h was a good hint.
But there are still some things that I can't figure out:
// 'mov eax, 41'
Chain = DAG.getCopyToReg(Chain, DAG.getRegister(X86::EAX, MVT::i32),
DAG.getConstant(41, MVT::i32), InFlag);
InFlag = Chain.getValue(1);
// 'inc eax'
SDValue eaxVal = DAG.getCopyFromReg(Chain, X86::EAX, MVT::i32);
SDValue inc = DAG.getNode(ISD::ADD, MVT::i32, eaxVal, DAG.getConstant(1,
MVT::i32));
InFlag = SDValue();
Chain = DAG.getCopyToReg(Chain, DAG.getRegister(X86::EAX, MVT::i32), inc,
InFlag);
InFlag = Chain.getValue(1);
This code produces the following assembly instructions:
movl $41, %eax
movl $41, %eax
incl %eax
I guess that's because what I want to become 'incl %eax' actually becomes
'movl $41, %eax' for the first parameter for the ADD-node and 'incl %eax'
for the second.
So in order to fix this problem, I tried:
SDValue inc = DAG.getNode(ISD::ADD, MVT::i32, DAG.getConstant(41,
MVT::i32) DAG.getConstant(1, MVT::i32));
InFlag = SDValue();
Chain = DAG.getCopyToReg(Chain, DAG.getRegister(X86::EAX, MVT::i32), inc,
InFlag);
InFlag = Chain.getValue(1);
Unfortunately, this becomes
movl $42, %eax
1) That is, the ADD-operation is being folded. Is there a way to prevent
this from happening? I tried creating the constants wit
DAG::getTargetConstant, but it didn't help.
2) The second thing in this code is that InFlag. If I don't place InFlag =
SDValue(); there, llc complains about wrong topological ordering. What's
that about? Related to that: If I recover the Flag-result from the Chain by
InFlag = Chain.getValue(1);, what is it good for?
The last thing is that for the runtime check I want to insert I need to
compare the contents of eax with the parameter of the first instruction of
the call-target. If they are unequal, I want to jump to an error label. So,
the assembly to produce should look something like this (where callee is the
call destination):
cmp eax, 4(callee)
jne error
So what I've produced is:
// expected (from eax)
SDValue lhs = DAG.getCopyFromReg(Chain, X86::EAX, MVT::i32);
// operand of first callee instruction
SDValue rhs = DAG.getNode(ISD::ADD, MVT::i32, Callee, DAG.getConstant(4,
MVT::i32));
Ops.push_back(Chain);
Ops.push_back(DAG.getCondCode(ISD::SETEQ));
Ops.push_back(lhs);
Ops.push_back(rhs);
MachineBasicBlock *error_block;
Ops.push_back(DAG.getBasicBlock(error_block));
Chain = DAG.getNode(ISD::BR_CC, MVT::Other, &Ops[0], Ops.size());
Now, there are, I guess, basically two things here:
3) How to access the value at address [callee + 4]? I guess, Callee won't
work as a parameter for add, and the result of the add in the cmp
instruction wont be interpreted as a memory location (but as a constant).
4) The ISD::BR_CC instruction requires to be passed a MachineBasicBlock.
Obviously, the uninitialized pointer in my example won't work. Is there any
way to access any MBB in the Program from X86ISelLowering::LowerCALL?
- Artjom
--
View this message in context: http://www.nabble.com/Inserting-nodes-into-SelectionDAG-%28X86%29-tp24211066p24328767.html
Sent from the LLVM - Dev mailing list archive at Nabble.com.
More information about the llvm-dev
mailing list