Add a no-op builtin function which shouldn't generate code. (#5306)

This is part of a broader plan to have noop destructor functions for
trivial destruction.

Note this emits a SemIR call (`%no_op: init %empty_tuple.type = call
%NoOp.ref() [concrete = constants.%empty_tuple]`), but not LLVM IR. My
thought was this was probably okay, since even though it'll be a little
spammy with destructor calls, the flipside is there'll probably already
be a fair amount for the name reference, and this at least shows when
the call is injected (and discarded).

---------

Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
This commit is contained in:
Jon Ross-Perkins
2025-04-15 00:33:39 +00:00
committed by GitHub
co-authored by Chandler Carruth
parent da83b65aa2
commit b49e89e97e
8 changed files with 256 additions and 2 deletions
+10
View File
@@ -1379,6 +1379,16 @@ static auto MakeConstantForBuiltinCall(EvalContext& eval_context,
case SemIR::BuiltinFunctionKind::None:
CARBON_FATAL("Not a builtin function.");
case SemIR::BuiltinFunctionKind::NoOp: {
// Return an empty tuple value.
auto type_id = GetTupleType(eval_context.context(), {});
return MakeConstantResult(
eval_context.context(),
SemIR::TupleValue{.type_id = type_id,
.elements_id = SemIR::InstBlockId::Empty},
phase);
}
case SemIR::BuiltinFunctionKind::PrintChar:
case SemIR::BuiltinFunctionKind::PrintInt:
case SemIR::BuiltinFunctionKind::ReadChar: {