Index: llvm/trunk/docs/LangRef.rst =================================================================== --- llvm/trunk/docs/LangRef.rst +++ llvm/trunk/docs/LangRef.rst @@ -14868,7 +14868,7 @@ :: - declare void @llvm.trap() noreturn nounwind + declare void @llvm.trap() cold noreturn nounwind Overview: """"""""" Index: llvm/trunk/include/llvm/IR/Intrinsics.td =================================================================== --- llvm/trunk/include/llvm/IR/Intrinsics.td +++ llvm/trunk/include/llvm/IR/Intrinsics.td @@ -90,6 +90,10 @@ 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_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">; Index: llvm/trunk/test/Feature/intrinsics.ll =================================================================== --- llvm/trunk/test/Feature/intrinsics.ll +++ llvm/trunk/test/Feature/intrinsics.ll @@ -70,4 +70,4 @@ } ; CHECK: attributes #0 = { nounwind readnone speculatable } -; CHECK: attributes #1 = { noreturn nounwind } +; CHECK: attributes #1 = { cold noreturn nounwind } Index: llvm/trunk/test/Transforms/SimplifyCFG/switch-on-const-select.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/switch-on-const-select.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/switch-on-const-select.ll @@ -138,4 +138,4 @@ declare void @bees.b() nounwind ; CHECK: attributes [[$NUW]] = { nounwind } -; CHECK: attributes #1 = { noreturn nounwind } +; CHECK: attributes #1 = { cold noreturn nounwind } Index: llvm/trunk/utils/TableGen/CodeGenIntrinsics.h =================================================================== --- llvm/trunk/utils/TableGen/CodeGenIntrinsics.h +++ llvm/trunk/utils/TableGen/CodeGenIntrinsics.h @@ -124,6 +124,9 @@ /// 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; Index: llvm/trunk/utils/TableGen/CodeGenTarget.cpp =================================================================== --- llvm/trunk/utils/TableGen/CodeGenTarget.cpp +++ llvm/trunk/utils/TableGen/CodeGenTarget.cpp @@ -536,6 +536,7 @@ isCommutative = false; canThrow = false; isNoReturn = false; + isCold = false; isNoDuplicate = false; isConvergent = false; isSpeculatable = false; @@ -682,6 +683,8 @@ 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") Index: llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp =================================================================== --- llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp +++ llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp @@ -489,6 +489,9 @@ 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 @@ 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 @@ OS << "Attribute::NoReturn"; addComma = true; } + if (intrinsic.isCold) { + if (addComma) + OS << ","; + OS << "Attribute::Cold"; + addComma = true; + } if (intrinsic.isNoDuplicate) { if (addComma) OS << ",";