@@ -55,14 +55,37 @@ fn cross_crate_inlinable(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
55
55
}
56
56
57
57
let mir = tcx. optimized_mir ( def_id) ;
58
- let mut checker =
59
- CostChecker { tcx, callee_body : mir, calls : 0 , statements : 0 , landing_pads : 0 , resumes : 0 } ;
58
+ let mut checker = CostChecker {
59
+ tcx,
60
+ callee_body : mir,
61
+ calls : 0 ,
62
+ statements : 0 ,
63
+ landing_pads : 0 ,
64
+ resumes : 0 ,
65
+ branches : 0 ,
66
+ asserts : 0 ,
67
+ } ;
60
68
checker. visit_body ( mir) ;
61
- checker. calls == 0
69
+ let is_leaf = checker. calls == 0
62
70
&& checker. resumes == 0
63
71
&& checker. landing_pads == 0
64
72
&& checker. statements
65
- <= tcx. sess . opts . unstable_opts . cross_crate_inline_threshold . unwrap_or ( 100 )
73
+ <= tcx. sess . opts . unstable_opts . cross_crate_inline_threshold . unwrap_or ( 100 ) ;
74
+
75
+ let is_trivial_wrapper = checker. calls == 1
76
+ && checker. resumes == 0
77
+ && checker. landing_pads == 0
78
+ && mir. basic_blocks . len ( ) == 2 ;
79
+
80
+ if is_trivial_wrapper {
81
+ let span = tcx. def_span ( def_id) ;
82
+ tcx. sess . emit_warning ( crate :: errors:: SuggestAddingInline {
83
+ place : span,
84
+ suggest_inline : span. with_hi ( span. lo ( ) ) ,
85
+ statements : checker. statements ,
86
+ } ) ;
87
+ }
88
+ is_leaf
66
89
}
67
90
68
91
struct CostChecker < ' b , ' tcx > {
@@ -72,6 +95,8 @@ struct CostChecker<'b, 'tcx> {
72
95
statements : usize ,
73
96
landing_pads : usize ,
74
97
resumes : usize ,
98
+ branches : usize ,
99
+ asserts : usize ,
75
100
}
76
101
77
102
impl < ' tcx > Visitor < ' tcx > for CostChecker < ' _ , ' tcx > {
@@ -105,7 +130,7 @@ impl<'tcx> Visitor<'tcx> for CostChecker<'_, 'tcx> {
105
130
}
106
131
}
107
132
TerminatorKind :: Assert { unwind, .. } => {
108
- self . calls += 1 ;
133
+ self . asserts += 1 ;
109
134
if let UnwindAction :: Cleanup ( _) = unwind {
110
135
self . landing_pads += 1 ;
111
136
}
@@ -117,6 +142,10 @@ impl<'tcx> Visitor<'tcx> for CostChecker<'_, 'tcx> {
117
142
self . landing_pads += 1 ;
118
143
}
119
144
}
145
+ TerminatorKind :: SwitchInt { .. } => {
146
+ self . statements += 1 ;
147
+ self . branches += 1 ;
148
+ }
120
149
TerminatorKind :: Return => { }
121
150
_ => self . statements += 1 ,
122
151
}
0 commit comments