Skip to content

Commit f5dd817

Browse files
committed
Auto merge of #130051 - cjgillot:clone-mir, r=<try>
Post-mono MIR opts
2 parents fd9ca71 + 5a7e9c9 commit f5dd817

33 files changed

+160
-182
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3572,6 +3572,7 @@ dependencies = [
35723572
"rustc_macros",
35733573
"rustc_metadata",
35743574
"rustc_middle",
3575+
"rustc_mir_transform",
35753576
"rustc_query_system",
35763577
"rustc_serialize",
35773578
"rustc_session",

compiler/rustc_codegen_ssa/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ rustc_index = { path = "../rustc_index" }
3030
rustc_macros = { path = "../rustc_macros" }
3131
rustc_metadata = { path = "../rustc_metadata" }
3232
rustc_middle = { path = "../rustc_middle" }
33+
rustc_mir_transform = { path = "../rustc_mir_transform" }
3334
rustc_query_system = { path = "../rustc_query_system" }
3435
rustc_serialize = { path = "../rustc_serialize" }
3536
rustc_session = { path = "../rustc_session" }

compiler/rustc_codegen_ssa/src/mir/analyze.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,15 @@ use super::FunctionCx;
1414
use crate::traits::*;
1515

1616
pub(crate) fn non_ssa_locals<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
17-
fx: &FunctionCx<'a, 'tcx, Bx>,
18-
traversal_order: &[mir::BasicBlock],
17+
fx: &FunctionCx<'a, '_, 'tcx, Bx>,
1918
) -> DenseBitSet<mir::Local> {
2019
let mir = fx.mir;
2120
let dominators = mir.basic_blocks.dominators();
2221
let locals = mir
2322
.local_decls
2423
.iter()
2524
.map(|decl| {
26-
let ty = fx.monomorphize(decl.ty);
27-
let layout = fx.cx.spanned_layout_of(ty, decl.source_info.span);
25+
let layout = fx.cx.spanned_layout_of(decl.ty, decl.source_info.span);
2826
if layout.is_zst() { LocalKind::ZST } else { LocalKind::Unused }
2927
})
3028
.collect();
@@ -39,8 +37,7 @@ pub(crate) fn non_ssa_locals<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
3937
// If there exists a local definition that dominates all uses of that local,
4038
// the definition should be visited first. Traverse blocks in an order that
4139
// is a topological sort of dominance partial order.
42-
for bb in traversal_order.iter().copied() {
43-
let data = &mir.basic_blocks[bb];
40+
for (bb, data) in traversal::reverse_postorder(mir) {
4441
analyzer.visit_basic_block_data(bb, data);
4542
}
4643

@@ -65,9 +62,9 @@ enum LocalKind {
6562
SSA(DefLocation),
6663
}
6764

68-
struct LocalAnalyzer<'a, 'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> {
69-
fx: &'a FunctionCx<'b, 'tcx, Bx>,
70-
dominators: &'a Dominators<mir::BasicBlock>,
65+
struct LocalAnalyzer<'mir, 'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> {
66+
fx: &'mir FunctionCx<'b, 'mir, 'tcx, Bx>,
67+
dominators: &'mir Dominators<mir::BasicBlock>,
7168
locals: IndexVec<mir::Local, LocalKind>,
7269
}
7370

@@ -80,8 +77,7 @@ impl<'a, 'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> LocalAnalyzer<'a, 'b, 'tcx, Bx>
8077
LocalKind::ZST => {}
8178
LocalKind::Memory => {}
8279
LocalKind::Unused => {
83-
let ty = fx.monomorphize(decl.ty);
84-
let layout = fx.cx.spanned_layout_of(ty, decl.source_info.span);
80+
let layout = fx.cx.spanned_layout_of(decl.ty, decl.source_info.span);
8581
*kind =
8682
if fx.cx.is_backend_immediate(layout) || fx.cx.is_backend_scalar_pair(layout) {
8783
LocalKind::SSA(location)
@@ -117,10 +113,9 @@ impl<'a, 'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> LocalAnalyzer<'a, 'b, 'tcx, Bx>
117113
);
118114
if is_consume {
119115
let base_ty = place_base.ty(self.fx.mir, cx.tcx());
120-
let base_ty = self.fx.monomorphize(base_ty);
121116

122117
// ZSTs don't require any actual memory access.
123-
let elem_ty = base_ty.projection_ty(cx.tcx(), self.fx.monomorphize(elem)).ty;
118+
let elem_ty = base_ty.projection_ty(cx.tcx(), elem).ty;
124119
let span = self.fx.mir.local_decls[place_ref.local].source_info.span;
125120
if cx.spanned_layout_of(elem_ty, span).is_zst() {
126121
return;
@@ -246,7 +241,6 @@ impl<'a, 'b, 'tcx, Bx: BuilderMethods<'b, 'tcx>> Visitor<'tcx> for LocalAnalyzer
246241
let kind = &mut self.locals[local];
247242
if *kind != LocalKind::Memory {
248243
let ty = self.fx.mir.local_decls[local].ty;
249-
let ty = self.fx.monomorphize(ty);
250244
if self.fx.cx.type_needs_drop(ty) {
251245
// Only need the place if we're actually dropping it.
252246
*kind = LocalKind::Memory;

compiler/rustc_codegen_ssa/src/mir/block.rs

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,17 @@ enum MergingSucc {
3737

3838
/// Used by `FunctionCx::codegen_terminator` for emitting common patterns
3939
/// e.g., creating a basic block, calling a function, etc.
40-
struct TerminatorCodegenHelper<'tcx> {
40+
struct TerminatorCodegenHelper<'mir, 'tcx> {
4141
bb: mir::BasicBlock,
42-
terminator: &'tcx mir::Terminator<'tcx>,
42+
terminator: &'mir mir::Terminator<'tcx>,
4343
}
4444

45-
impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
45+
impl<'a, 'tcx> TerminatorCodegenHelper<'_, 'tcx> {
4646
/// Returns the appropriate `Funclet` for the current funclet, if on MSVC,
4747
/// either already previously cached, or newly created, by `landing_pad_for`.
4848
fn funclet<'b, Bx: BuilderMethods<'a, 'tcx>>(
4949
&self,
50-
fx: &'b mut FunctionCx<'a, 'tcx, Bx>,
50+
fx: &'b mut FunctionCx<'a, '_, 'tcx, Bx>,
5151
) -> Option<&'b Bx::Funclet> {
5252
let cleanup_kinds = fx.cleanup_kinds.as_ref()?;
5353
let funclet_bb = cleanup_kinds[self.bb].funclet_bb(self.bb)?;
@@ -73,7 +73,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
7373
/// stuff in it or next to it.
7474
fn llbb_with_cleanup<Bx: BuilderMethods<'a, 'tcx>>(
7575
&self,
76-
fx: &mut FunctionCx<'a, 'tcx, Bx>,
76+
fx: &mut FunctionCx<'a, '_, 'tcx, Bx>,
7777
target: mir::BasicBlock,
7878
) -> Bx::BasicBlock {
7979
let (needs_landing_pad, is_cleanupret) = self.llbb_characteristics(fx, target);
@@ -97,7 +97,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
9797

9898
fn llbb_characteristics<Bx: BuilderMethods<'a, 'tcx>>(
9999
&self,
100-
fx: &mut FunctionCx<'a, 'tcx, Bx>,
100+
fx: &mut FunctionCx<'a, '_, 'tcx, Bx>,
101101
target: mir::BasicBlock,
102102
) -> (bool, bool) {
103103
if let Some(ref cleanup_kinds) = fx.cleanup_kinds {
@@ -122,7 +122,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
122122

123123
fn funclet_br<Bx: BuilderMethods<'a, 'tcx>>(
124124
&self,
125-
fx: &mut FunctionCx<'a, 'tcx, Bx>,
125+
fx: &mut FunctionCx<'a, '_, 'tcx, Bx>,
126126
bx: &mut Bx,
127127
target: mir::BasicBlock,
128128
mergeable_succ: bool,
@@ -151,7 +151,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
151151
/// return destination `destination` and the unwind action `unwind`.
152152
fn do_call<Bx: BuilderMethods<'a, 'tcx>>(
153153
&self,
154-
fx: &mut FunctionCx<'a, 'tcx, Bx>,
154+
fx: &mut FunctionCx<'a, '_, 'tcx, Bx>,
155155
bx: &mut Bx,
156156
fn_abi: &'tcx FnAbi<'tcx, Ty<'tcx>>,
157157
fn_ptr: Bx::Value,
@@ -274,7 +274,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
274274
/// Generates inline assembly with optional `destination` and `unwind`.
275275
fn do_inlineasm<Bx: BuilderMethods<'a, 'tcx>>(
276276
&self,
277-
fx: &mut FunctionCx<'a, 'tcx, Bx>,
277+
fx: &mut FunctionCx<'a, '_, 'tcx, Bx>,
278278
bx: &mut Bx,
279279
template: &[InlineAsmTemplatePiece],
280280
operands: &[InlineAsmOperandRef<'tcx, Bx>],
@@ -341,9 +341,13 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
341341
}
342342

343343
/// Codegen implementations for some terminator variants.
344-
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
344+
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, '_, 'tcx, Bx> {
345345
/// Generates code for a `Resume` terminator.
346-
fn codegen_resume_terminator(&mut self, helper: TerminatorCodegenHelper<'tcx>, bx: &mut Bx) {
346+
fn codegen_resume_terminator(
347+
&mut self,
348+
helper: TerminatorCodegenHelper<'_, 'tcx>,
349+
bx: &mut Bx,
350+
) {
347351
if let Some(funclet) = helper.funclet(self) {
348352
bx.cleanup_ret(funclet, None);
349353
} else {
@@ -360,7 +364,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
360364

361365
fn codegen_switchint_terminator(
362366
&mut self,
363-
helper: TerminatorCodegenHelper<'tcx>,
367+
helper: TerminatorCodegenHelper<'_, 'tcx>,
364368
bx: &mut Bx,
365369
discr: &mir::Operand<'tcx>,
366370
targets: &SwitchTargets,
@@ -567,7 +571,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
567571
#[tracing::instrument(level = "trace", skip(self, helper, bx))]
568572
fn codegen_drop_terminator(
569573
&mut self,
570-
helper: TerminatorCodegenHelper<'tcx>,
574+
helper: TerminatorCodegenHelper<'_, 'tcx>,
571575
bx: &mut Bx,
572576
source_info: &mir::SourceInfo,
573577
location: mir::Place<'tcx>,
@@ -576,7 +580,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
576580
mergeable_succ: bool,
577581
) -> MergingSucc {
578582
let ty = location.ty(self.mir, bx.tcx()).ty;
579-
let ty = self.monomorphize(ty);
580583
let drop_fn = Instance::resolve_drop_in_place(bx.tcx(), ty);
581584

582585
if let ty::InstanceKind::DropGlue(_, None) = drop_fn.def {
@@ -665,7 +668,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
665668

666669
fn codegen_assert_terminator(
667670
&mut self,
668-
helper: TerminatorCodegenHelper<'tcx>,
671+
helper: TerminatorCodegenHelper<'_, 'tcx>,
669672
bx: &mut Bx,
670673
terminator: &mir::Terminator<'tcx>,
671674
cond: &mir::Operand<'tcx>,
@@ -755,7 +758,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
755758

756759
fn codegen_terminate_terminator(
757760
&mut self,
758-
helper: TerminatorCodegenHelper<'tcx>,
761+
helper: TerminatorCodegenHelper<'_, 'tcx>,
759762
bx: &mut Bx,
760763
terminator: &mir::Terminator<'tcx>,
761764
reason: UnwindTerminateReason,
@@ -785,7 +788,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
785788
/// Returns `Some` if this is indeed a panic intrinsic and codegen is done.
786789
fn codegen_panic_intrinsic(
787790
&mut self,
788-
helper: &TerminatorCodegenHelper<'tcx>,
791+
helper: &TerminatorCodegenHelper<'_, 'tcx>,
789792
bx: &mut Bx,
790793
intrinsic: ty::IntrinsicDef,
791794
instance: Instance<'tcx>,
@@ -851,7 +854,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
851854

852855
fn codegen_call_terminator(
853856
&mut self,
854-
helper: TerminatorCodegenHelper<'tcx>,
857+
helper: TerminatorCodegenHelper<'_, 'tcx>,
855858
bx: &mut Bx,
856859
terminator: &mir::Terminator<'tcx>,
857860
func: &mir::Operand<'tcx>,
@@ -985,10 +988,9 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
985988
let sig = callee.layout.ty.fn_sig(bx.tcx());
986989

987990
let extra_args = &args[sig.inputs().skip_binder().len()..];
988-
let extra_args = bx.tcx().mk_type_list_from_iter(extra_args.iter().map(|op_arg| {
989-
let op_ty = op_arg.node.ty(self.mir, bx.tcx());
990-
self.monomorphize(op_ty)
991-
}));
991+
let extra_args = bx.tcx().mk_type_list_from_iter(
992+
extra_args.iter().map(|op_arg| op_arg.node.ty(self.mir, bx.tcx())),
993+
);
992994

993995
let fn_abi = match instance {
994996
Some(instance) => bx.fn_abi_of_instance(instance, extra_args),
@@ -1153,7 +1155,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
11531155

11541156
fn codegen_asm_terminator(
11551157
&mut self,
1156-
helper: TerminatorCodegenHelper<'tcx>,
1158+
helper: TerminatorCodegenHelper<'_, 'tcx>,
11571159
bx: &mut Bx,
11581160
asm_macro: InlineAsmMacro,
11591161
terminator: &mir::Terminator<'tcx>,
@@ -1196,8 +1198,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
11961198
InlineAsmOperandRef::Const { string }
11971199
}
11981200
mir::InlineAsmOperand::SymFn { ref value } => {
1199-
let const_ = self.monomorphize(value.const_);
1200-
if let ty::FnDef(def_id, args) = *const_.ty().kind() {
1201+
if let ty::FnDef(def_id, args) = *value.const_.ty().kind() {
12011202
let instance = ty::Instance::resolve_for_fn_ptr(
12021203
bx.tcx(),
12031204
bx.typing_env(),
@@ -1287,7 +1288,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
12871288
&mut self,
12881289
bx: &mut Bx,
12891290
bb: mir::BasicBlock,
1290-
terminator: &'tcx mir::Terminator<'tcx>,
1291+
terminator: &mir::Terminator<'tcx>,
12911292
) -> MergingSucc {
12921293
debug!("codegen_terminator: {:?}", terminator);
12931294

compiler/rustc_codegen_ssa/src/mir/constant.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ use crate::errors;
99
use crate::mir::operand::OperandRef;
1010
use crate::traits::*;
1111

12-
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
12+
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, '_, 'tcx, Bx> {
1313
pub(crate) fn eval_mir_constant_to_operand(
1414
&self,
1515
bx: &mut Bx,
1616
constant: &mir::ConstOperand<'tcx>,
1717
) -> OperandRef<'tcx, Bx::Value> {
1818
let val = self.eval_mir_constant(constant);
19-
let ty = self.monomorphize(constant.ty());
20-
OperandRef::from_const(bx, val, ty)
19+
OperandRef::from_const(bx, val, constant.ty())
2120
}
2221

2322
pub fn eval_mir_constant(&self, constant: &mir::ConstOperand<'tcx>) -> mir::ConstValue<'tcx> {
2423
// `MirUsedCollector` visited all required_consts before codegen began, so if we got here
2524
// there can be no more constants that fail to evaluate.
26-
self.monomorphize(constant.const_)
25+
constant
26+
.const_
2727
.eval(self.cx.tcx(), self.cx.typing_env(), constant.span)
2828
.expect("erroneous constant missed by mono item collection")
2929
}
@@ -38,7 +38,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
3838
&self,
3939
constant: &mir::ConstOperand<'tcx>,
4040
) -> Result<Result<ty::ValTree<'tcx>, Ty<'tcx>>, ErrorHandled> {
41-
let uv = match self.monomorphize(constant.const_) {
41+
let uv = match constant.const_ {
4242
mir::Const::Unevaluated(uv, _) => uv.shrink(),
4343
mir::Const::Ty(_, c) => match c.kind() {
4444
// A constant that came from a const generic but was then used as an argument to
@@ -56,7 +56,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
5656
// real const generic, and get rid of this entire function.
5757
other => span_bug!(constant.span, "{other:#?}"),
5858
};
59-
let uv = self.monomorphize(uv);
6059
self.cx.tcx().const_eval_resolve_for_typeck(self.cx.typing_env(), uv, constant.span)
6160
}
6261

@@ -66,7 +65,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
6665
bx: &Bx,
6766
constant: &mir::ConstOperand<'tcx>,
6867
) -> (Bx::Value, Ty<'tcx>) {
69-
let ty = self.monomorphize(constant.ty());
68+
let ty = constant.ty();
7069
assert!(ty.is_simd());
7170
let field_ty = ty.simd_size_and_type(bx.tcx()).1;
7271

compiler/rustc_codegen_ssa/src/mir/coverageinfo.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,10 @@ use rustc_middle::mir::coverage::CoverageKind;
44
use super::FunctionCx;
55
use crate::traits::*;
66

7-
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
7+
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, '_, 'tcx, Bx> {
88
pub(crate) fn codegen_coverage(&self, bx: &mut Bx, kind: &CoverageKind, scope: SourceScope) {
99
// Determine the instance that coverage data was originally generated for.
10-
let instance = if let Some(inlined) = scope.inlined_instance(&self.mir.source_scopes) {
11-
self.monomorphize(inlined)
12-
} else {
13-
self.instance
14-
};
10+
let instance = scope.inlined_instance(&self.mir.source_scopes).unwrap_or(self.instance);
1511

1612
// Handle the coverage info in a backend-specific way.
1713
bx.add_coverage(instance, kind);

compiler/rustc_codegen_ssa/src/mir/debuginfo.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ fn calculate_debuginfo_offset<
213213
DebugInfoOffset { direct_offset, indirect_offsets, result: place }
214214
}
215215

216-
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
216+
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, '_, 'tcx, Bx> {
217217
pub fn set_debug_loc(&self, bx: &mut Bx, source_info: mir::SourceInfo) {
218218
bx.set_span(source_info.span);
219219
if let Some(dbg_loc) = self.dbg_loc(source_info) {
@@ -291,9 +291,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
291291
// FIXME(eddyb) is this `+ 1` needed at all?
292292
let kind = VariableKind::ArgumentVariable(arg_index + 1);
293293

294-
let arg_ty = self.monomorphize(decl.ty);
295-
296-
self.cx.create_dbg_var(name, arg_ty, dbg_scope, kind, span)
294+
self.cx.create_dbg_var(name, decl.ty, dbg_scope, kind, span)
297295
},
298296
)
299297
} else {
@@ -487,13 +485,13 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
487485
};
488486

489487
let var_ty = if let Some(ref fragment) = var.composite {
490-
self.monomorphize(fragment.ty)
488+
fragment.ty
491489
} else {
492490
match var.value {
493491
mir::VarDebugInfoContents::Place(place) => {
494492
self.monomorphized_place_ty(place.as_ref())
495493
}
496-
mir::VarDebugInfoContents::Const(c) => self.monomorphize(c.ty()),
494+
mir::VarDebugInfoContents::Const(c) => c.ty(),
497495
}
498496
};
499497

compiler/rustc_codegen_ssa/src/mir/intrinsic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ fn memset_intrinsic<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
5050
bx.memset(dst, val, size, align, flags);
5151
}
5252

53-
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
53+
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, '_, 'tcx, Bx> {
5454
/// In the `Err` case, returns the instance that should be called instead.
5555
pub fn codegen_intrinsic_call(
5656
&mut self,

0 commit comments

Comments
 (0)