summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/Analysis.cpp
diff options
context:
space:
mode:
authorFrancis Visoiu Mistrih <francisvm@yahoo.com>2019-01-09 19:46:15 +0000
committerFrancis Visoiu Mistrih <francisvm@yahoo.com>2019-01-09 19:46:15 +0000
commitac6454a7f6cca0c8703b4f8c9eac125879d80409 (patch)
treee1e8356c1dfc0229ed5072b0cab61c826f653604 /llvm/lib/CodeGen/Analysis.cpp
parent227371ded6372e6ca813e3b3add6a74eb50b27a7 (diff)
downloadbcm5719-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.cpp15
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.
OpenPOWER on IntegriCloud