[LLVMdev] Obligatory monthly tail call patch

Evan Cheng evan.cheng at apple.com
Mon Feb 25 13:08:30 PST 2008


Hi Arnold,

Thanks! Some comments.

+static bool IsPossiblyOverwrittenArgumentOfTailCall(SDOperand Op,
+                                                    MachineFrameInfo  
* MFI) {
    RegisterSDNode * OpReg = NULL;
+  FrameIndexSDNode * FrameIdxNode = NULL;
+  int FrameIdx = 0;
    if (Op.getOpcode() == ISD::FORMAL_ARGUMENTS ||
        (Op.getOpcode()== ISD::CopyFromReg &&
-       (OpReg = cast<RegisterSDNode>(Op.getOperand(1))) &&
-       OpReg->getReg() >= TargetRegisterInfo::FirstVirtualRegister))
+       (OpReg = dyn_cast<RegisterSDNode>(Op.getOperand(1))) &&
+       (OpReg->getReg() >= TargetRegisterInfo::FirstVirtualRegister))  
||
+      (Op.getOpcode() == ISD::LOAD &&
+       (FrameIdxNode = dyn_cast<FrameIndexSDNode>(Op.getOperand(1))) &&
+       ((FrameIdx = FrameIdxNode->getIndex()) < 0) &&
+       (MFI->getObjectOffset(FrameIdx) >= 0)))


Instead of assuming negative frame index has some special meaning,  
perhaps use isImmutableObjectIndex()?


+  int NewReturnAddrFI;
    if (IsTailCall) {
      // Adjust the Return address stack slot.
      if (FPDiff) {
@@ -1453,7 +1462,7 @@
          DAG.getLoad(VT, Chain,RetAddrFrIdx, NULL, 0);
        // Calculate the new stack slot for the return address.
        int SlotSize = Is64Bit ? 8 : 4;
-      int NewReturnAddrFI =
+      NewReturnAddrFI =
          MF.getFrameInfo()->CreateFixedObject(SlotSize, FPDiff- 
SlotSize);
        NewRetAddrFrIdx = DAG.getFrameIndex(NewReturnAddrFI, VT);
        Chain = SDOperand(RetAddrFrIdx.Val, 1);
@@ -1461,13 +1470,13 @@
    }

...
      if (FPDiff)
+      Chain = DAG.getStore(Chain, RetAddrFrIdx, NewRetAddrFrIdx,
+                           PseudoSourceValue::getFixedStack(),  
NewReturnAddrFI);

Looks like this may cause a compile time warning of using undefined  
value? How about moving the CreateFixedObject call down to the last if  
(FPDiff)?

+  SmallVector<std::pair<unsigned, SDOperand>, 8> EndangeredVRegs;

Picking on your choice of variable name here. :-) How about  
TailCallClobberedVRegs?

+    // Do not flag preceeding copytoreg stuff together with the  
following stuff.
+    InFlag = SDOperand();
+    // Create virtual register sources for all arguments to force  
arguments into
+    // (virtual) memory. To force (virtual) loading and guarantee  
that arguments
+    // sourcing from incomming parameters are not overwritten by each  
other.
+    for (unsigned i = 0, e = EndangeredVRegs.size(); i != e; i++) {
+      SDOperand Arg = EndangeredVRegs[i].second;
+      unsigned Idx = EndangeredVRegs[i].first;
+      unsigned VReg =
+        MF.getRegInfo().
+        createVirtualRegister(getRegClassFor(Arg.getValueType()));
+      Chain = DAG.getCopyToReg(Chain, VReg, Arg, InFlag);
+      InFlag = Chain.getValue(1);
+      Arg = DAG.getCopyFromReg(Chain, VReg, Arg.getValueType(),  
InFlag);
+      EndangeredVRegs[i] = std::make_pair(Idx, Arg);
+      Chain = Arg.getValue(1);
+      InFlag = Arg.getValue(2);
+    }

Please refactor this out to a static function.

Otherwise it looks great to me! Please commit after you've updated the  
patch.Thanks!

Evan


On Feb 23, 2008, at 1:01 PM, Arnold Schwaighofer wrote:

> Hello everybody, hi Evan,
>
> this patch changes the lowering of arguments for tail call optimized
> calls. Before arguments that could be overwritten by each other were
> explicitly lowered to a stack slot, not giving the register allocator
> a chance to optimize. Now a sequence of copyto/copyfrom virtual
> registers ensures that arguments are loaded in (virtual) registers
> before they are lowered to the stack slot (and might overwrite each
> other). Also parameter stack slots are marked mutable for
> (potentially) tail caling functions.
>
> okay to commit?
>
> regards
> arnold
> <r47531-tc.patch>_______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list