Skip to content

Commit fdd29c1

Browse files
committed
[2024] linker/inline: use bottom-up inlining to minimize redundancy.
1 parent 95ee5bc commit fdd29c1

7 files changed

Lines changed: 311 additions & 243 deletions

File tree

crates/rustc_codegen_spirv/src/linker/inline.rs

Lines changed: 217 additions & 231 deletions
Large diffs are not rendered by default.

crates/rustc_codegen_spirv/src/linker/ipo.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use indexmap::IndexSet;
66
use rspirv::dr::Module;
7-
use rspirv::spirv::Op;
7+
use rspirv::spirv::{Op, Word};
88
use rustc_data_structures::fx::FxHashMap;
99

1010
// FIXME(eddyb) use newtyped indices and `IndexVec`.
@@ -19,6 +19,9 @@ pub struct CallGraph {
1919

2020
impl CallGraph {
2121
pub fn collect(module: &Module) -> Self {
22+
Self::collect_with_func_id_to_idx(module).0
23+
}
24+
pub fn collect_with_func_id_to_idx(module: &Module) -> (Self, FxHashMap<Word, FuncIdx>) {
2225
let func_id_to_idx: FxHashMap<_, _> = module
2326
.functions
2427
.iter()
@@ -51,10 +54,13 @@ impl CallGraph {
5154
.collect()
5255
})
5356
.collect();
54-
Self {
55-
entry_points,
56-
callees,
57-
}
57+
(
58+
Self {
59+
entry_points,
60+
callees,
61+
},
62+
func_id_to_idx,
63+
)
5864
}
5965

6066
/// Order functions using a post-order traversal, i.e. callees before callers.

tests/compiletests/ui/dis/panic_builtin_bounds_check.stderr

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,13 @@ OpLine %5 32 4
2828
%21 = OpVariable %12 Function
2929
OpLine %5 32 23
3030
%22 = OpCompositeConstruct %6 %13 %14 %15 %16
31-
OpLine %5 32 4
31+
OpLine %5 27 4
3232
%23 = OpCompositeExtract %9 %22 0
3333
%24 = OpCompositeExtract %9 %22 1
3434
%25 = OpCompositeExtract %9 %22 2
3535
%26 = OpCompositeExtract %9 %22 3
3636
%27 = OpCompositeConstruct %11 %23 %24 %25 %26
3737
OpStore %21 %27
38-
OpLine %5 27 4
3938
%28 = OpULessThan %17 %18 %10
4039
OpNoLine
4140
OpSelectionMerge %29 None
Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
1-
warning: `#[inline(never)]` function `nested_ref::deep_load` needs to be inlined because it has illegal argument or return types
1+
warning: `#[inline(never)]` function `nested_ref::deep_load` has been inlined
2+
--> $DIR/nested-ref.rs:12:4
3+
|
4+
LL | fn deep_load(r: &'static &'static u32) -> u32 {
5+
| ^^^^^^^^^
6+
|
7+
= note: inlining was required due to illegal parameter type
8+
= note: called from `nested_ref::main`
29

3-
warning: `#[inline(never)]` function `nested_ref::deep_transpose` needs to be inlined because it has illegal argument or return types
10+
warning: `#[inline(never)]` function `nested_ref::deep_transpose` has been inlined
11+
--> $DIR/nested-ref.rs:19:4
12+
|
13+
LL | fn deep_transpose(r: &'static &'static Mat2) -> Mat2 {
14+
| ^^^^^^^^^^^^^^
15+
|
16+
= note: inlining was required due to illegal parameter type
17+
= note: called from `nested_ref::main`
418

519
warning: 2 warnings emitted
620

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,44 @@
1-
warning: `#[inline(never)]` function `member_ref_arg_broken::h` needs to be inlined because it has illegal argument or return types
1+
warning: `#[inline(never)]` function `member_ref_arg_broken::f` has been inlined
2+
--> $DIR/member_ref_arg-broken.rs:20:4
3+
|
4+
LL | fn f(x: &u32) -> u32 {
5+
| ^
6+
|
7+
= note: inlining was required due to illegal (pointer) argument
8+
= note: called from `member_ref_arg_broken::main`
9+
10+
warning: `#[inline(never)]` function `member_ref_arg_broken::g` has been inlined
11+
--> $DIR/member_ref_arg-broken.rs:25:4
12+
|
13+
LL | fn g(xy: (&u32, &u32)) -> (u32, u32) {
14+
| ^
15+
|
16+
= note: inlining was required due to illegal (pointer) argument
17+
= note: called from `member_ref_arg_broken::main`
218

3-
warning: `#[inline(never)]` function `member_ref_arg_broken::h_newtyped` needs to be inlined because it has illegal argument or return types
19+
warning: `#[inline(never)]` function `member_ref_arg_broken::h` has been inlined
20+
--> $DIR/member_ref_arg-broken.rs:30:4
21+
|
22+
LL | fn h(xyz: (&u32, &u32, &u32)) -> (u32, u32, u32) {
23+
| ^
24+
|
25+
= note: inlining was required due to illegal parameter type
26+
= note: called from `member_ref_arg_broken::main`
27+
28+
warning: `#[inline(never)]` function `member_ref_arg_broken::h_newtyped` has been inlined
29+
--> $DIR/member_ref_arg-broken.rs:41:4
30+
|
31+
LL | fn h_newtyped(xyz: ((&u32, &u32, &u32),)) -> (u32, u32, u32) {
32+
| ^^^^^^^^^^
33+
|
34+
= note: inlining was required due to illegal parameter type
35+
= note: called from `member_ref_arg_broken::main`
436

537
error: error:0:0 - OpLoad Pointer <id> '$ID[%$ID]' is not a logical pointer.
638
%39 = OpLoad %uint %38
739
|
840
= note: spirv-val failed
941
= note: module `$TEST_BUILD_DIR/lang/core/ref/member_ref_arg-broken`
1042

11-
error: aborting due to 1 previous error; 2 warnings emitted
43+
error: aborting due to 1 previous error; 4 warnings emitted
1244

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
warning: `#[inline(never)]` function `member_ref_arg::f` has been inlined
2+
--> $DIR/member_ref_arg.rs:14:4
3+
|
4+
LL | fn f(x: &u32) {}
5+
| ^
6+
|
7+
= note: inlining was required due to illegal (pointer) argument
8+
= note: called from `member_ref_arg::main`
9+
10+
warning: `#[inline(never)]` function `member_ref_arg::g` has been inlined
11+
--> $DIR/member_ref_arg.rs:17:4
12+
|
13+
LL | fn g(xy: (&u32, &u32)) {}
14+
| ^
15+
|
16+
= note: inlining was required due to illegal (pointer) argument
17+
= note: called from `member_ref_arg::main`
18+
19+
warning: 2 warnings emitted
20+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
warning: `#[inline(never)]` function `track_caller::track_caller_maybe_panic::panic_cold_explicit` has been inlined
2+
--> $DIR/track_caller.rs:10:9
3+
|
4+
LL | panic!();
5+
| ^^^^^^^^
6+
|
7+
= note: inlining was required due to panicking
8+
= note: called from `track_caller::track_caller_maybe_panic`
9+
10+
warning: 1 warning emitted
11+

0 commit comments

Comments
 (0)