[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