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

Steve Montgomery stephen.montgomery3 at btinternet.com
Sat Nov 24 09:23:47 PST 2012


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
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121124/e905bf2b/attachment.html>


More information about the llvm-dev mailing list