mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
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
This commit is contained in:
parent
df484d50ec
commit
d61070716c
@ -14868,7 +14868,7 @@ Syntax:
|
||||
|
||||
::
|
||||
|
||||
declare void @llvm.trap() noreturn nounwind
|
||||
declare void @llvm.trap() cold noreturn nounwind
|
||||
|
||||
Overview:
|
||||
"""""""""
|
||||
|
@ -90,6 +90,10 @@ class ReadNone<int argNo> : IntrinsicProperty {
|
||||
|
||||
def IntrNoReturn : IntrinsicProperty;
|
||||
|
||||
// IntrCold - Calls to this intrinsic are cold.
|
||||
// Parallels the cold attribute on LLVM IR functions.
|
||||
def IntrCold : IntrinsicProperty;
|
||||
|
||||
// IntrNoduplicate - Calls to this intrinsic cannot be duplicated.
|
||||
// Parallels the noduplicate attribute on LLVM IR functions.
|
||||
def IntrNoDuplicate : IntrinsicProperty;
|
||||
@ -867,7 +871,7 @@ def int_coro_subfn_addr : Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty, llvm_i8_ty],
|
||||
//
|
||||
def int_flt_rounds : Intrinsic<[llvm_i32_ty]>,
|
||||
GCCBuiltin<"__builtin_flt_rounds">;
|
||||
def int_trap : Intrinsic<[], [], [IntrNoReturn]>,
|
||||
def int_trap : Intrinsic<[], [], [IntrNoReturn, IntrCold]>,
|
||||
GCCBuiltin<"__builtin_trap">;
|
||||
def int_debugtrap : Intrinsic<[]>,
|
||||
GCCBuiltin<"__builtin_debugtrap">;
|
||||
|
@ -70,4 +70,4 @@ define void @trap() {
|
||||
}
|
||||
|
||||
; CHECK: attributes #0 = { nounwind readnone speculatable }
|
||||
; CHECK: attributes #1 = { noreturn nounwind }
|
||||
; CHECK: attributes #1 = { cold noreturn nounwind }
|
||||
|
@ -138,4 +138,4 @@ declare void @bees.a() nounwind
|
||||
declare void @bees.b() nounwind
|
||||
|
||||
; CHECK: attributes [[$NUW]] = { nounwind }
|
||||
; CHECK: attributes #1 = { noreturn nounwind }
|
||||
; CHECK: attributes #1 = { cold noreturn nounwind }
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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 << ",";
|
||||
|
Loading…
x
Reference in New Issue
Block a user