[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),
                                 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?

-------------- 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