diff options
author | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2019-01-09 19:46:15 +0000 |
---|---|---|
committer | Francis Visoiu Mistrih <francisvm@yahoo.com> | 2019-01-09 19:46:15 +0000 |
commit | ac6454a7f6cca0c8703b4f8c9eac125879d80409 (patch) | |
tree | e1e8356c1dfc0229ed5072b0cab61c826f653604 /llvm/lib/CodeGen/Analysis.cpp | |
parent | 227371ded6372e6ca813e3b3add6a74eb50b27a7 (diff) | |
download | bcm5719-llvm-ac6454a7f6cca0c8703b4f8c9eac125879d80409.tar.gz bcm5719-llvm-ac6454a7f6cca0c8703b4f8c9eac125879d80409.zip |
[CodeGen] Ignore return sext/zext attributes of unused results for tail calls
If the caller's return type does not have a zeroext attribute but the
callee does a tail call zeroext, we won't consider the tail call during
CodeGenPrepare because the attributes don't match.
However, if the result of the tail call has no uses, it makes sense to
drop the sext/zext attributes.
Differential Revision: https://reviews.llvm.org/D56486
llvm-svn: 350753
Diffstat (limited to 'llvm/lib/CodeGen/Analysis.cpp')
-rw-r--r-- | llvm/lib/CodeGen/Analysis.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/Analysis.cpp b/llvm/lib/CodeGen/Analysis.cpp index 27dce7fd7b7..797f05ee5cf 100644 --- a/llvm/lib/CodeGen/Analysis.cpp +++ b/llvm/lib/CodeGen/Analysis.cpp @@ -546,6 +546,21 @@ bool llvm::attributesPermitTailCall(const Function *F, const Instruction *I, CalleeAttrs.removeAttribute(Attribute::SExt); } + // Drop sext and zext return attributes if the result is not used. + // This enables tail calls for code like: + // + // define void @caller() { + // entry: + // %unused_result = tail call zeroext i1 @callee() + // br label %retlabel + // retlabel: + // ret void + // } + if (I->use_empty()) { + CalleeAttrs.removeAttribute(Attribute::SExt); + CalleeAttrs.removeAttribute(Attribute::ZExt); + } + // If they're still different, there's some facet we don't understand // (currently only "inreg", but in future who knows). It may be OK but the // only safe option is to reject the tail call. |