diff options
| author | Vedant Kumar <vsk@apple.com> | 2018-11-14 19:53:41 +0000 |
|---|---|---|
| committer | Vedant Kumar <vsk@apple.com> | 2018-11-14 19:53:41 +0000 |
| commit | 808e157356234ecc865c0baecb2e22df5e4d54a8 (patch) | |
| tree | 709d3fcfa3a621d154b82f49755bfb053498ed18 /llvm/utils/TableGen | |
| parent | c0830f55779adf07809f6b1af4351c3a2f293dfc (diff) | |
| download | bcm5719-llvm-808e157356234ecc865c0baecb2e22df5e4d54a8.tar.gz bcm5719-llvm-808e157356234ecc865c0baecb2e22df5e4d54a8.zip | |
Mark @llvm.trap cold
A call to @llvm.trap can be expected to be cold (i.e. unlikely to be
reached in a normal program execution).
Outlining paths which unconditionally trap is an important memory
saving. As the hot/cold splitting pass (imho) should not treat all
noreturn calls as cold, explicitly mark @llvm.trap cold so that it can
be outlined.
Split out of https://reviews.llvm.org/D54244.
Differential Revision: https://reviews.llvm.org/D54329
llvm-svn: 346885
Diffstat (limited to 'llvm/utils/TableGen')
| -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 | 11 |
3 files changed, 16 insertions, 1 deletions
diff --git a/llvm/utils/TableGen/CodeGenIntrinsics.h b/llvm/utils/TableGen/CodeGenIntrinsics.h index 5d071595912..9487a79c143 100644 --- a/llvm/utils/TableGen/CodeGenIntrinsics.h +++ b/llvm/utils/TableGen/CodeGenIntrinsics.h @@ -124,6 +124,9 @@ struct CodeGenIntrinsic { /// True if the intrinsic is no-return. bool isNoReturn; + /// True if the intrinsic is cold. + bool isCold; + /// True if the intrinsic is marked as convergent. bool isConvergent; diff --git a/llvm/utils/TableGen/CodeGenTarget.cpp b/llvm/utils/TableGen/CodeGenTarget.cpp index 305d2d19ff4..bcb65313555 100644 --- a/llvm/utils/TableGen/CodeGenTarget.cpp +++ b/llvm/utils/TableGen/CodeGenTarget.cpp @@ -536,6 +536,7 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R) { isCommutative = false; canThrow = false; isNoReturn = false; + isCold = false; isNoDuplicate = false; isConvergent = false; isSpeculatable = false; @@ -682,6 +683,8 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R) { isConvergent = true; else if (Property->getName() == "IntrNoReturn") isNoReturn = true; + else if (Property->getName() == "IntrCold") + isCold = true; else if (Property->getName() == "IntrSpeculatable") isSpeculatable = true; else if (Property->getName() == "IntrHasSideEffects") diff --git a/llvm/utils/TableGen/IntrinsicEmitter.cpp b/llvm/utils/TableGen/IntrinsicEmitter.cpp index 06e44e3b57c..049282e5ebf 100644 --- a/llvm/utils/TableGen/IntrinsicEmitter.cpp +++ b/llvm/utils/TableGen/IntrinsicEmitter.cpp @@ -489,6 +489,9 @@ struct AttributeComparator { if (L->isNoReturn != R->isNoReturn) return R->isNoReturn; + if (L->isCold != R->isCold) + return R->isCold; + if (L->isConvergent != R->isConvergent) return R->isConvergent; @@ -622,7 +625,7 @@ void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints, if (!intrinsic.canThrow || intrinsic.ModRef != CodeGenIntrinsic::ReadWriteMem || - intrinsic.isNoReturn || intrinsic.isNoDuplicate || + intrinsic.isNoReturn || intrinsic.isCold || intrinsic.isNoDuplicate || intrinsic.isConvergent || intrinsic.isSpeculatable) { OS << " const Attribute::AttrKind Atts[] = {"; bool addComma = false; @@ -636,6 +639,12 @@ void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints, OS << "Attribute::NoReturn"; addComma = true; } + if (intrinsic.isCold) { + if (addComma) + OS << ","; + OS << "Attribute::Cold"; + addComma = true; + } if (intrinsic.isNoDuplicate) { if (addComma) OS << ","; |

