diff options
author | Dan Gohman <gohman@apple.com> | 2009-11-13 18:49:38 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-11-13 18:49:38 +0000 |
commit | f80dc08059cd8f4588470abe4c8bc051de855ef5 (patch) | |
tree | 9538cb7809eb6c85135b69d1579b89a8247053bb /llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp | |
parent | 4ef13f8ac919c0c056cc3fcd1d166bbf79ccad49 (diff) | |
download | bcm5719-llvm-f80dc08059cd8f4588470abe4c8bc051de855ef5.tar.gz bcm5719-llvm-f80dc08059cd8f4588470abe4c8bc051de855ef5.zip |
Don't let a noalias difference disrupt the tailcall optimization.
llvm-svn: 88672
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index b3d8d1dbee6..f2c623cd616 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -4349,7 +4349,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) { /// TargetLowering::IsEligibleForTailCallOptimization. /// static bool -isInTailCallPosition(const Instruction *I, Attributes RetAttr, +isInTailCallPosition(const Instruction *I, Attributes CalleeRetAttr, const TargetLowering &TLI) { const BasicBlock *ExitBB = I->getParent(); const TerminatorInst *Term = ExitBB->getTerminator(); @@ -4377,8 +4377,9 @@ isInTailCallPosition(const Instruction *I, Attributes RetAttr, if (!Ret || Ret->getNumOperands() == 0) return true; // Conservatively require the attributes of the call to match those of - // the return. - if (F->getAttributes().getRetAttributes() != RetAttr) + // the return. Ignore noalias because it doesn't affect the call sequence. + unsigned CallerRetAttr = F->getAttributes().getRetAttributes(); + if ((CalleeRetAttr ^ CallerRetAttr) & ~Attribute::NoAlias) return false; // Otherwise, make sure the unmodified return value of I is the return value. |