[LLVMdev] A few questions from a newbie
Jakob Stoklund Olesen
stoklund at 2pi.dk
Sun Apr 19 23:01:32 PDT 2009
On 20/04/2009, at 07.35, Peter Bacon wrote:
> Hello, I am learning to write a new backend for LLVM and have a few
> simple questions.
I am a newbie too, but I have recently dealt with the same issues.
> 1) What are the differences between 'constant' and 'targetconstant',
> 'globaladdress' and 'targetglobaladdress'? It is not clear from the
> document when and which should be used.
The target* variants are 'done' and will not be changed further by the
instruction selection. After instruction selection, everything should
be converted to the target* variants.
> 2) On the processor I am working on, there is a 'move reg, mem_addr'
> When I try to match it using the pattern [(set Int32Regs::reg,
> tglobaladdr::mem_addr)]. the code generated by tblgen cannot be
> compiled because there will be a switch statement that contains two
> cases for the 'tglobaladdr', one is hard-coded in by tblgen and the
> other is generated by tbglen following the pattern I specified. The
> compilation fails because of the two duplicated and conflicting cases.
This happened to me too. I stole a solution from the other targets -
create a wrapper node:
def BfinWrapper: SDNode<"BfinISD::Wrapper", SDTIntUnaryOp>;
Then custom lower ISD::GlobalAddress, converting it to a wrapped
BlackfinTargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG
DebugLoc DL = Op.getDebugLoc();
GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
Op = DAG.getTargetGlobalAddress(GV, MVT::i32);
return DAG.getNode(BfinISD::Wrapper, DL, MVT::i32, Op);
Now you can pattern match on the wrapper:
def : Pat<(BfinWrapper (i32 tglobaladdr:$addr)),
If you think this is overly complicated, I agree.
Does anybody know why this is necessary?
More information about the llvm-dev