[LLVMdev] Fwd: Prevention register promotion at the isel codegen phase

Joseph Pusdesris joe at pusdesris.com
Sat Nov 24 09:27:44 PST 2012


Yes, this is very helpful! Thank you!

How does this work when exiting a variable's liveness range?  Will it
automatically know to free the stack slot for reuse?
-Joe


On Sat, Nov 24, 2012 at 12:23 PM, Steve Montgomery <
stephen.montgomery3 at btinternet.com> wrote:

> Sorry, forgot to Reply-All.
>
> Begin forwarded message:
>
> *From: *Steve Montgomery <stephen.montgomery3 at btinternet.com>
> *Subject: **Re: [LLVMdev] Prevention register promotion at the isel
> codegen phase*
> *Date: *24 November 2012 17:09:58 GMT
> *To: *Joseph Pusdesris <joe at pusdesris.com>
>
> I had a similar problem trying to implement reg-mem operations. The
> solution I chose was to use PreprocessISelDAG() to decide which operands
> needed spilling to memory and then to store and load them from a new stack
> slot. This seems to work OK for me, though I'm no expert in such matters -
> perhaps someone more knowledgeable could comment?
>
> Given that operand OpNo of Node needs to be a load, this is the code
> snippet I used:
>
>  // Now we know which node to spill, perform the spill.
>  SDValue SpillVal  = Node->getOperand(OpNo);
>  SDValue SpillSlot = CurDAG->CreateStackTemporary(SpillVal.getValueType());
>  int FI            = cast<FrameIndexSDNode>(SpillSlot)->getIndex();
>  SDValue Chain     = CurDAG->getStore(CurDAG->getEntryNode(),
>                                       SpillVal.getDebugLoc(),
>                                       SpillVal, SpillSlot,
>
>                                       MachinePointerInfo::getFixedStack(FI),
>                                       false, false, 0);
>  Chain = CurDAG->getLoad(SpillVal.getValueType(), SpillVal.getDebugLoc(),
>                          Chain, SpillSlot,
>                          MachinePointerInfo::getFixedStack(FI),
>                          false, false, false, 0);
>
>  SmallVector<SDValue, 4> Ops;
>  unsigned NumOps = Node->getNumOperands();
>
>  for (unsigned i = 0; i < NumOps; ++i) {
>    if (i == OpNo)
>      Ops.push_back(Chain);
>    else
>      Ops.push_back(Node->getOperand(i));
>  }
>
>  CurDAG->UpdateNodeOperands(Node, &Ops[0], NumOps);
>
> Note: you can't do this during ISelLowering because the combiner will just
> remove the store and load again unless you mark one or the other as
> volatile and that doesn't seem like the right thing to do.
>
> Hope that helps.
>
> On 23 Nov 2012, at 18:02, Joseph Pusdesris wrote:
>
> I am trying to implement mem-mem operations, but I can't seem to figure
> out how to prevent register promotion for most cases.
>
>
> I can successfully compile:
>
> int foo(int a, int b){
>
>  return a + b;
>
> }
>
>
> because it gets matched to store(add(load)(load)), but when I attempt to
> compile:
>
> int foo(int a, int b, int c){
>
>  return a + b + c;
>
> }
>
>
> I can't match the add anymore since it is of the form
> store(add(add(load)(load))(load)).  I think I need to figure out how to
> force a load/store between the two adds.  I am not sure where to load/store
> to though, I need to allocate a spill location or something I assume.
>
>
> Any insight would be greatly appreciated.
>
> _______________________________________________
>
> LLVM Developers mailing list
>
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121124/117e9e90/attachment.html>


More information about the llvm-dev mailing list