Skip to content

Commit 091b6f2

Browse files
committed
Inst macro derives Visitable/VisitableMut
1 parent c2ca164 commit 091b6f2

File tree

15 files changed

+120
-334
lines changed

15 files changed

+120
-334
lines changed

crates/codegen/src/optim/adce.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ impl AdceSolver {
113113

114114
fn mark_by_inst(&mut self, func: &Function, inst_id: InstId, pdf_set: &PDFSet) {
115115
let inst = func.dfg.inst(inst_id);
116-
inst.visit_values(&mut |value| {
116+
inst.for_each_value(&mut |value| {
117117
if let Some(value_inst) = func.dfg.value_inst(value) {
118118
self.mark_inst(func, value_inst);
119119
}

crates/codegen/src/optim/licm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ impl LicmSolver {
7474

7575
let mut invariant = true;
7676
let inst = func.dfg.inst(inst_id);
77-
inst.visit_values(&mut |value| invariant &= !loop_var.contains(&value));
77+
inst.for_each_value(&mut |value| invariant &= !loop_var.contains(&value));
7878
invariant
7979
}
8080

crates/codegen/src/optim/sccp.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ impl SccpSolver {
128128
.reachable_blocks
129129
.contains(&func.layout.inst_block(inst)));
130130

131-
func.dfg.inst(inst).visit_values(&mut |value| {
131+
func.dfg.inst(inst).for_each_value(&mut |value| {
132132
if let Some(imm) = func.dfg.value_imm(value) {
133133
self.set_lattice_cell(value, LatticeCell::Const(imm));
134134
}
@@ -164,7 +164,7 @@ impl SccpSolver {
164164

165165
fn eval_inst(&mut self, func: &Function, inst_id: InstId) {
166166
debug_assert!(!func.dfg.is_phi(inst_id));
167-
func.dfg.inst(inst_id).visit_values(&mut |value| {
167+
func.dfg.inst(inst_id).for_each_value(&mut |value| {
168168
if let Some(imm) = func.dfg.value_imm(value) {
169169
self.set_lattice_cell(value, LatticeCell::Const(imm));
170170
}

crates/ir/src/dfg.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use std::{collections::BTreeSet, io};
33

44
use cranelift_entity::{entity_impl, packed_option::PackedOption, PrimaryMap, SecondaryMap};
5-
use rustc_hash::FxHashMap;
5+
use rustc_hash::{FxHashMap, FxHashSet};
66

77
use super::{Immediate, Type, Value, ValueId};
88
use crate::{
@@ -108,7 +108,7 @@ impl DataFlowGraph {
108108
let old = &mut std::mem::replace(slot, new);
109109

110110
// Remove the arguments of the old inst from the user set.
111-
old.visit_values(&mut |value| {
111+
old.for_each_value(&mut |value| {
112112
self.remove_user(value, inst_id);
113113
});
114114

@@ -149,14 +149,14 @@ impl DataFlowGraph {
149149

150150
pub fn attach_user(&mut self, inst_id: InstId) {
151151
let inst = &self.insts[inst_id];
152-
inst.visit_values(&mut |value| {
152+
inst.for_each_value(&mut |value| {
153153
self.users[value].insert(inst_id);
154154
})
155155
}
156156

157157
pub fn untrack_inst(&mut self, inst_id: InstId) {
158158
let inst = &self.insts[inst_id];
159-
inst.visit_values(&mut |value| {
159+
inst.for_each_value(&mut |value| {
160160
self.users[value].remove(&inst_id);
161161
})
162162
}
@@ -239,7 +239,7 @@ impl DataFlowGraph {
239239
pub fn change_to_alias(&mut self, value: ValueId, alias: ValueId) {
240240
let mut users = std::mem::take(&mut self.users[value]);
241241
for inst in &users {
242-
self.insts[*inst].visit_values_mut(&mut |user_value| {
242+
self.insts[*inst].for_each_value_mut(&mut |user_value| {
243243
if *user_value == value {
244244
*user_value = alias;
245245
}
@@ -285,8 +285,16 @@ impl DataFlowGraph {
285285
}
286286

287287
fn remove_old_users(&mut self, inst: InstId, new: &dyn Inst) {
288-
let old_values = self.inst(inst).collect_value_set();
289-
let new_values = new.collect_value_set();
288+
let mut old_values = FxHashSet::default();
289+
let mut new_values = FxHashSet::default();
290+
291+
self.inst(inst).for_each_value(&mut |value| {
292+
old_values.insert(value);
293+
});
294+
new.for_each_value(&mut |value| {
295+
new_values.insert(value);
296+
});
297+
290298
assert!(old_values.is_superset(&new_values));
291299

292300
let removed_values = old_values.difference(&new_values);

crates/ir/src/inst/arith.rs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,86 +4,65 @@ use crate::ValueId;
44

55
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
66
pub struct Neg {
7-
#[inst(value)]
87
arg: ValueId,
98
}
109

1110
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
1211
pub struct Add {
13-
#[inst(value)]
1412
lhs: ValueId,
15-
#[inst(value)]
1613
rhs: ValueId,
1714
}
1815

1916
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
2017
pub struct Mul {
21-
#[inst(value)]
2218
lhs: ValueId,
23-
#[inst(value)]
2419
rhs: ValueId,
2520
}
2621

2722
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
2823
pub struct Sub {
29-
#[inst(value)]
3024
lhs: ValueId,
31-
#[inst(value)]
3225
rhs: ValueId,
3326
}
3427

3528
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
3629
pub struct Sdiv {
37-
#[inst(value)]
3830
lhs: ValueId,
39-
#[inst(value)]
4031
rhs: ValueId,
4132
}
4233

4334
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
4435
pub struct Udiv {
45-
#[inst(value)]
4636
lhs: ValueId,
47-
#[inst(value)]
4837
rhs: ValueId,
4938
}
5039

5140
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
5241
pub struct Umod {
53-
#[inst(value)]
5442
lhs: ValueId,
55-
#[inst(value)]
5643
rhs: ValueId,
5744
}
5845

5946
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
6047
pub struct Smod {
61-
#[inst(value)]
6248
lhs: ValueId,
63-
#[inst(value)]
6449
rhs: ValueId,
6550
}
6651

6752
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
6853
pub struct Shl {
69-
#[inst(value)]
7054
bits: ValueId,
71-
#[inst(value)]
7255
value: ValueId,
7356
}
7457

7558
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
7659
pub struct Shr {
77-
#[inst(value)]
7860
bits: ValueId,
79-
#[inst(value)]
8061
value: ValueId,
8162
}
8263

8364
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
8465
pub struct Sar {
85-
#[inst(value)]
8666
bits: ValueId,
87-
#[inst(value)]
8867
value: ValueId,
8968
}

crates/ir/src/inst/cast.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,36 @@ use crate::{Type, ValueId};
44

55
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
66
pub struct Sext {
7-
#[inst(value)]
87
from: ValueId,
98
ty: Type,
109
}
1110

1211
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
1312
pub struct Zext {
14-
#[inst(value)]
1513
from: ValueId,
1614
ty: Type,
1715
}
1816

1917
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
2018
pub struct Trunc {
21-
#[inst(value)]
2219
from: ValueId,
2320
ty: Type,
2421
}
2522

2623
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
2724
pub struct Bitcast {
28-
#[inst(value)]
2925
from: ValueId,
3026
ty: Type,
3127
}
3228

3329
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
3430
pub struct IntToPtr {
35-
#[inst(value)]
3631
from: ValueId,
3732
ty: Type,
3833
}
3934

4035
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
4136
pub struct PtrToInt {
42-
#[inst(value)]
4337
from: ValueId,
4438
ty: Type,
4539
}

crates/ir/src/inst/cmp.rs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,86 +4,65 @@ use crate::ValueId;
44

55
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
66
pub struct Lt {
7-
#[inst(value)]
87
lhs: ValueId,
9-
#[inst(value)]
108
rhs: ValueId,
119
}
1210

1311
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
1412
pub struct Gt {
15-
#[inst(value)]
1613
lhs: ValueId,
17-
#[inst(value)]
1814
rhs: ValueId,
1915
}
2016

2117
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
2218
pub struct Slt {
23-
#[inst(value)]
2419
lhs: ValueId,
25-
#[inst(value)]
2620
rhs: ValueId,
2721
}
2822

2923
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
3024
pub struct Sgt {
31-
#[inst(value)]
3225
lhs: ValueId,
33-
#[inst(value)]
3426
rhs: ValueId,
3527
}
3628

3729
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
3830
pub struct Le {
39-
#[inst(value)]
4031
lhs: ValueId,
41-
#[inst(value)]
4232
rhs: ValueId,
4333
}
4434

4535
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
4636
pub struct Ge {
47-
#[inst(value)]
4837
lhs: ValueId,
49-
#[inst(value)]
5038
rhs: ValueId,
5139
}
5240

5341
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
5442
pub struct Sle {
55-
#[inst(value)]
5643
lhs: ValueId,
57-
#[inst(value)]
5844
rhs: ValueId,
5945
}
6046

6147
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
6248
pub struct Sge {
63-
#[inst(value)]
6449
lhs: ValueId,
65-
#[inst(value)]
6650
rhs: ValueId,
6751
}
6852

6953
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
7054
pub struct Eq {
71-
#[inst(value)]
7255
lhs: ValueId,
73-
#[inst(value)]
7456
rhs: ValueId,
7557
}
7658

7759
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
7860
pub struct Ne {
79-
#[inst(value)]
8061
lhs: ValueId,
81-
#[inst(value)]
8262
rhs: ValueId,
8363
}
8464

8565
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
8666
pub struct IsZero {
87-
#[inst(value)]
8867
lhs: ValueId,
8968
}

crates/ir/src/inst/control_flow.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ pub struct Jump {
1212
#[derive(Debug, Clone, PartialEq, Eq, Hash, Inst)]
1313
#[inst(terminator)]
1414
pub struct Br {
15-
#[inst(value)]
1615
cond: ValueId,
1716
nz_dest: BlockId,
1817
z_dest: BlockId,
@@ -21,17 +20,14 @@ pub struct Br {
2120
#[derive(Debug, Clone, PartialEq, Eq, Hash, Inst)]
2221
#[inst(terminator)]
2322
pub struct BrTable {
24-
#[inst(value)]
2523
scrutinee: ValueId,
2624

2725
default: Option<BlockId>,
28-
#[inst(value)]
2926
table: Vec<(ValueId, BlockId)>,
3027
}
3128

3229
#[derive(Debug, Clone, PartialEq, Eq, Hash, Inst)]
3330
pub struct Phi {
34-
#[inst(value)]
3531
args: Vec<(ValueId, BlockId)>,
3632
}
3733

@@ -63,15 +59,13 @@ impl Phi {
6359
pub struct Call {
6460
callee: FuncRef,
6561

66-
#[inst(value)]
6762
args: SmallVec<[ValueId; 8]>,
6863
}
6964

7065
#[derive(Debug, Clone, PartialEq, Eq, Hash, Inst)]
7166
#[inst(side_effect(super::SideEffect::Write))]
7267
#[inst(terminator)]
7368
pub struct Return {
74-
#[inst(value)]
7569
arg: Option<ValueId>,
7670
}
7771

0 commit comments

Comments
 (0)