[llvm-commits] [llvm] r104737 - /llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Evan Cheng
evan.cheng at apple.com
Wed May 26 13:48:02 PDT 2010
Definitely not vfork. That's unnecessary. gcc is mistaken, we shouldn't follow it. Also, getcontext is such a generic name. It's a really bad idea to look for it.
Evan
On May 26, 2010, at 1:39 PM, Bill Wendling wrote:
> Author: void
> Date: Wed May 26 15:39:00 2010
> New Revision: 104737
>
> URL: http://llvm.org/viewvc/llvm-project?rev=104737&view=rev
> Log:
> Add "setjmp_syscall", "savectx", "qsetjmp", "vfork", "getcontext" to the list of
> usual suspects that could "return twice".
>
> Modified:
> llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=104737&r1=104736&r2=104737&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed May 26 15:39:00 2010
> @@ -193,31 +193,34 @@
> }
>
> /// FunctionCallsSetJmp - Return true if the function has a call to setjmp or
> -/// sigsetjmp. This is used to limit code-gen optimizations on the machine
> -/// function.
> +/// other function that gcc recognizes as "returning twice". This is used to
> +/// limit code-gen optimizations on the machine function.
> static bool FunctionCallsSetJmp(const Function *F) {
> const Module *M = F->getParent();
> - const Function *SetJmp = M->getFunction("setjmp");
> - const Function *SigSetJmp = M->getFunction("sigsetjmp");
> -
> - if (!SetJmp && !SigSetJmp)
> - return false;
> -
> - if (SetJmp && !SetJmp->use_empty())
> - for (Value::const_use_iterator
> - I = SetJmp->use_begin(), E = SetJmp->use_end(); I != E; ++I)
> - if (const CallInst *CI = dyn_cast<CallInst>(I))
> - if (CI->getParent()->getParent() == F)
> - return true;
> -
> - if (SigSetJmp && !SigSetJmp->use_empty())
> - for (Value::const_use_iterator
> - I = SigSetJmp->use_begin(), E = SigSetJmp->use_end(); I != E; ++I)
> - if (const CallInst *CI = dyn_cast<CallInst>(I))
> - if (CI->getParent()->getParent() == F)
> - return true;
> + static const char *ReturnsTwiceFns[] = {
> + "setjmp",
> + "sigsetjmp",
> + "setjmp_syscall",
> + "savectx",
> + "qsetjmp",
> + "vfork",
> + "getcontext"
> + };
> +#define NUM_RETURNS_TWICE_FNS sizeof(ReturnsTwiceFns) / sizeof(const char *)
> +
> + for (unsigned I = 0; I < NUM_RETURNS_TWICE_FNS; ++I)
> + if (const Function *Callee = M->getFunction(ReturnsTwiceFns[I])) {
> + if (!Callee->use_empty())
> + for (Value::const_use_iterator
> + I = Callee->use_begin(), E = Callee->use_end();
> + I != E; ++I)
> + if (const CallInst *CI = dyn_cast<CallInst>(I))
> + if (CI->getParent()->getParent() == F)
> + return true;
> + }
>
> return false;
> +#undef NUM_RETURNS_TWICE_FNS
> }
>
> bool SelectionDAGISel::runOnMachineFunction(MachineFunction &mf) {
>
>
> _______________________________________________
> 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