diff options
| author | Hideto Ueno <uenoku.tokotoko@gmail.com> | 2019-07-17 15:15:43 +0000 |
|---|---|---|
| committer | Hideto Ueno <uenoku.tokotoko@gmail.com> | 2019-07-17 15:15:43 +0000 |
| commit | 11d3710c1cd25adf23a4690076e12d6ece267731 (patch) | |
| tree | ed74b460e55bfb9685fd813358aa526f8fbbd06c /llvm/utils | |
| parent | 629273ec09825b870ce53e6419296d73519b1e24 (diff) | |
| download | bcm5719-llvm-11d3710c1cd25adf23a4690076e12d6ece267731.tar.gz bcm5719-llvm-11d3710c1cd25adf23a4690076e12d6ece267731.zip | |
[Attributor] Deduce "willreturn" function attribute
Summary:
Deduce the "willreturn" attribute for functions.
For now, intrinsics are not willreturn. More annotation will be done in another patch.
Reviewers: jdoerfert
Subscribers: jvesely, nhaehnle, nicholas, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D63046
llvm-svn: 366335
Diffstat (limited to 'llvm/utils')
| -rw-r--r-- | llvm/utils/TableGen/CodeGenIntrinsics.h | 3 | ||||
| -rw-r--r-- | llvm/utils/TableGen/CodeGenTarget.cpp | 3 | ||||
| -rw-r--r-- | llvm/utils/TableGen/IntrinsicEmitter.cpp | 14 |
3 files changed, 18 insertions, 2 deletions
diff --git a/llvm/utils/TableGen/CodeGenIntrinsics.h b/llvm/utils/TableGen/CodeGenIntrinsics.h index 9dcd136463c..7b74bb07d6e 100644 --- a/llvm/utils/TableGen/CodeGenIntrinsics.h +++ b/llvm/utils/TableGen/CodeGenIntrinsics.h @@ -123,6 +123,9 @@ struct CodeGenIntrinsic { /// True if the intrinsic is no-return. bool isNoReturn; + /// True if the intrinsic is will-return. + bool isWillReturn; + /// True if the intrinsic is cold. bool isCold; diff --git a/llvm/utils/TableGen/CodeGenTarget.cpp b/llvm/utils/TableGen/CodeGenTarget.cpp index 702317283f9..b65e1b6af79 100644 --- a/llvm/utils/TableGen/CodeGenTarget.cpp +++ b/llvm/utils/TableGen/CodeGenTarget.cpp @@ -557,6 +557,7 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R) { isCommutative = false; canThrow = false; isNoReturn = false; + isWillReturn = false; isCold = false; isNoDuplicate = false; isConvergent = false; @@ -721,6 +722,8 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R) { isConvergent = true; else if (Property->getName() == "IntrNoReturn") isNoReturn = true; + else if (Property->getName() == "IntrWillReturn") + isWillReturn = true; else if (Property->getName() == "IntrCold") isCold = true; else if (Property->getName() == "IntrSpeculatable") diff --git a/llvm/utils/TableGen/IntrinsicEmitter.cpp b/llvm/utils/TableGen/IntrinsicEmitter.cpp index 6bcdc3d777a..979af98f676 100644 --- a/llvm/utils/TableGen/IntrinsicEmitter.cpp +++ b/llvm/utils/TableGen/IntrinsicEmitter.cpp @@ -545,6 +545,9 @@ struct AttributeComparator { if (L->isNoReturn != R->isNoReturn) return R->isNoReturn; + if (L->isWillReturn != R->isWillReturn) + return R->isWillReturn; + if (L->isCold != R->isCold) return R->isCold; @@ -686,8 +689,9 @@ void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints, if (!intrinsic.canThrow || (intrinsic.ModRef != CodeGenIntrinsic::ReadWriteMem && !intrinsic.hasSideEffects) || - intrinsic.isNoReturn || intrinsic.isCold || intrinsic.isNoDuplicate || - intrinsic.isConvergent || intrinsic.isSpeculatable) { + intrinsic.isNoReturn || intrinsic.isWillReturn || intrinsic.isCold || + intrinsic.isNoDuplicate || intrinsic.isConvergent || + intrinsic.isSpeculatable) { OS << " const Attribute::AttrKind Atts[] = {"; bool addComma = false; if (!intrinsic.canThrow) { @@ -700,6 +704,12 @@ void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints, OS << "Attribute::NoReturn"; addComma = true; } + if (intrinsic.isWillReturn) { + if (addComma) + OS << ","; + OS << "Attribute::WillReturn"; + addComma = true; + } if (intrinsic.isCold) { if (addComma) OS << ","; |

