[llvm-dev] Gluing arbitrary nodes together
Dylan McKay via llvm-dev
llvm-dev at lists.llvm.org
Fri Jun 3 21:15:11 PDT 2016
Hello all,
I am working on adding atomics support to the AVR backend.
Because the target can only have one core, it is sufficient to:
- Save the status register
- Disable interrupts
- Do the nonatomic LOAD/STORE/SWAP/ADD
- Restore the status register
I’d really like to be able to do this at the IR level. What I want to do is
write a custom lowering hook to convert ISD::ATOMIC_LOAD into a standard
ISD::LOAD with the save/restore/interrupt nodes glued to it.
Here’s what I have so far:
// Store `SREG`
auto Save = DAG.getCopyFromReg(DAG.getEntryNode(), DL, AVR::SREG, MVT::i8);
// Disable interrupts (`clr` is equivalent to `bclr 7`).
auto ClearInterrupts = DAG.getNode(AVRISD::BCLR, DL, MVT::Glue,
DAG.getConstant(7, DL, MVT::i8));
// Perform the nonatomic load.
auto *Node = cast<AtomicSDNode>(AtomicOp.getNode());
SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, SDLoc(AtomicOp),
AtomicOp.getValueType(),
Node->getChain(), Node->getBasePtr(),
Node->getMemoryVT(), Node->getMemOperand());
auto Restore = DAG.getCopyToReg(DAG.getEntryNode(), DL, AVR::SREG, Save);
return Load;
I can’t figure out how I can glue all these nodes together and return the
nonatomic load.
How can I do this?
Cheers,
Dylan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160604/8ac7af19/attachment.html>
More information about the llvm-dev
mailing list