[llvm-commits] PATCH: Tailcallopt x86 byval argument handling
Evan Cheng
evan.cheng at apple.com
Tue Apr 8 14:38:18 PDT 2008
Hi Arnold,
Nitpicks:
I prefer function names which do not require decoding. :-)
How about EmitTailCallLoadRetAddress instead of EmitTCRetAddrLoad?
Same for EmitTCRetAddrStore.
+ MVT::ValueType VT = Is64Bit ? MVT::i64 : MVT::i32;
+ SDOperand NewRetAddrFrIdx = DAG.getFrameIndex(NewReturnAddrFI, VT);
Please use getPointerTy() instead.
+bool
+X86TargetLowering::CopyByValClobberedRegToVirtReg(bool
containsByValArg,
+ int CntUsedVRegsByVal,
+ unsigned VRegsByVal [3],
+ unsigned VRegsByValDest [3],
+ MVT::ValueType VRegsByValVTs [3],
+ std::pair<unsigned, SDOperand>
&RegToPass,
+ SDOperand &OutChain,
+ SDOperand &OutFlag,
+ MachineFunction &MF,
+ SelectionDAG & DAG) {
+ if (!containsByValArg || !(RegToPass.first == X86::RSI ||
+ RegToPass.first == X86::RDI ||
+ RegToPass.first == X86::ESI ||
+ RegToPass.first == X86::EDI ||
+ RegToPass.first == X86::ECX ||
+ RegToPass.first == X86::RCX)) return false;
I am not very comfortable with this. Is the registers that can be
impacted somehow specified in X86CallingConv.td? I don't want to get
into a situation where someone updates the .td file but forgot to
update this code. Will this work for all the CC that might want tail
call support?
/// RestoreByValClobberedReg - Restore registers which were
overwritten by byval
+/// tail call lowering from virtual registers.
+static SDOperand RestoreByValClobberedReg(SelectionDAG & DAG,
SDOperand Chain,
+ int CntUsedVRegsByVal,
+ unsigned VRegsByVal [3],
+ unsigned VRegsByValDest [3],
+ MVT::ValueType
VRegsByValVTs [3]) {
+ if (!CntUsedVRegsByVal) return Chain;
+ SDOperand InFlag;
+ while (CntUsedVRegsByVal) {
+ CntUsedVRegsByVal--;
+ SDOperand Tmp = DAG.getCopyFromReg(Chain,
VRegsByVal[CntUsedVRegsByVal],
+
VRegsByValVTs[CntUsedVRegsByVal],
+ InFlag);
+ Chain = DAG.getCopyToReg(Chain, VRegsByValDest[CntUsedVRegsByVal],
+ Tmp, InFlag);
+ InFlag = Chain.getValue(1);
+ }
+ return Chain;
+}
Is it necessary for all the copyfromreg and copytoreg to be chained
and flagged together? Perhaps each pair need to be flagged together
and chains from all pairs ended up feeding into a TokenFactor?
+ unsigned VRegsByVal [3];
Why the space between VRegsByVal and '['? :-)
+ // Remember fact that this call contains byval arguments.
+ if (!containsByValArg && IsTailCall && isByVal)
containsByValArg=true;
=>
containsByValArg |= isTailCall && isByVal;
?
+ MVT::ValueType VT = Is64Bit ? MVT::i64 : MVT::i32;
FI = MF.getFrameInfo()->CreateFixedObject(OpSize, Offset);
- FIN = DAG.getFrameIndex(FI, MVT::i32);
+ FIN = DAG.getFrameIndex(FI, VT);
getPointerTy().
Thanks,
Evan
On Apr 7, 2008, at 3:17 PM, Arnold Schwaighofer wrote:
> Hi Evan (and everyone else who wants to bash this patch :),
>
> this patch corrects handling of byval arguments for tailcall optimized
> x86-64 (and x86) calls so that they work (... at least for my test
> cases).
>
> Should fix the following problems:
>
> Problem 1: when i introduced the optimized handling of arguments for
> tail called functions (not always moving them to a spill slot -
> actually moving to the destination of the arg if the call were to be a
> normal function call - before storing them at their 'tailcall'
> position but using virtual registers) i did not handle byval arguments
> correctly.
>
> Problem 2: on x86-64 after the arguments of the tail called function
> are moved to their registers (which include ESI/RSI etc), tail call
> optimization performs byval lowering which causes xSI,xDI, xCX
> registers to be overwritten. this is handled in this patch by moving
> the arguments to virtual registers first and after the byval lowering
> the arguments are moved from those virtual registers back to
> RSI/RDI/RCX.
>
> Okay to commit?
>
> regards arnold
> <x86-byval.patch>_______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list