@@ -13,7 +13,6 @@ use arbitrary::{Arbitrary, Unstructured};
13
13
14
14
#[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
15
15
pub enum InstOpcode {
16
- Phi ,
17
16
Op ,
18
17
Ret ,
19
18
Branch ,
@@ -40,14 +39,10 @@ impl InstData {
40
39
is_safepoint : false ,
41
40
}
42
41
}
43
- pub fn branch ( uses : & [ usize ] ) -> InstData {
44
- let mut operands = vec ! [ ] ;
45
- for & u in uses {
46
- operands. push ( Operand :: reg_use ( VReg :: new ( u, RegClass :: Int ) ) ) ;
47
- }
42
+ pub fn branch ( ) -> InstData {
48
43
InstData {
49
44
op : InstOpcode :: Branch ,
50
- operands,
45
+ operands : vec ! [ ] ,
51
46
clobbers : vec ! [ ] ,
52
47
is_safepoint : false ,
53
48
}
@@ -68,7 +63,8 @@ pub struct Func {
68
63
blocks : Vec < InstRange > ,
69
64
block_preds : Vec < Vec < Block > > ,
70
65
block_succs : Vec < Vec < Block > > ,
71
- block_params : Vec < Vec < VReg > > ,
66
+ block_params_in : Vec < Vec < VReg > > ,
67
+ block_params_out : Vec < Vec < Vec < VReg > > > ,
72
68
num_vregs : usize ,
73
69
reftype_vregs : Vec < VReg > ,
74
70
}
@@ -100,7 +96,7 @@ impl Function for Func {
100
96
}
101
97
102
98
fn block_params ( & self , block : Block ) -> & [ VReg ] {
103
- & self . block_params [ block. index ( ) ] [ ..]
99
+ & self . block_params_in [ block. index ( ) ] [ ..]
104
100
}
105
101
106
102
fn is_ret ( & self , insn : Inst ) -> bool {
@@ -111,10 +107,8 @@ impl Function for Func {
111
107
self . insts [ insn. index ( ) ] . op == InstOpcode :: Branch
112
108
}
113
109
114
- fn branch_blockparam_arg_offset ( & self , _: Block , _: Inst ) -> usize {
115
- // Branch blockparam args always start at zero for this
116
- // Function implementation.
117
- 0
110
+ fn branch_blockparams ( & self , block : Block , _: Inst , succ : usize ) -> & [ VReg ] {
111
+ & self . block_params_out [ block. index ( ) ] [ succ] [ ..]
118
112
}
119
113
120
114
fn requires_refs_on_stack ( & self , insn : Inst ) -> bool {
@@ -164,7 +158,8 @@ impl FuncBuilder {
164
158
f : Func {
165
159
block_preds : vec ! [ ] ,
166
160
block_succs : vec ! [ ] ,
167
- block_params : vec ! [ ] ,
161
+ block_params_in : vec ! [ ] ,
162
+ block_params_out : vec ! [ ] ,
168
163
insts : vec ! [ ] ,
169
164
blocks : vec ! [ ] ,
170
165
num_vregs : 0 ,
@@ -181,7 +176,8 @@ impl FuncBuilder {
181
176
. push ( InstRange :: forward ( Inst :: new ( 0 ) , Inst :: new ( 0 ) ) ) ;
182
177
self . f . block_preds . push ( vec ! [ ] ) ;
183
178
self . f . block_succs . push ( vec ! [ ] ) ;
184
- self . f . block_params . push ( vec ! [ ] ) ;
179
+ self . f . block_params_in . push ( vec ! [ ] ) ;
180
+ self . f . block_params_out . push ( vec ! [ ] ) ;
185
181
self . insts_per_block . push ( vec ! [ ] ) ;
186
182
b
187
183
}
@@ -195,8 +191,12 @@ impl FuncBuilder {
195
191
self . f . block_preds [ to. index ( ) ] . push ( from) ;
196
192
}
197
193
198
- pub fn set_block_params ( & mut self , block : Block , params : & [ VReg ] ) {
199
- self . f . block_params [ block. index ( ) ] = params. iter ( ) . cloned ( ) . collect ( ) ;
194
+ pub fn set_block_params_in ( & mut self , block : Block , params : & [ VReg ] ) {
195
+ self . f . block_params_in [ block. index ( ) ] = params. iter ( ) . cloned ( ) . collect ( ) ;
196
+ }
197
+
198
+ pub fn set_block_params_out ( & mut self , block : Block , params : Vec < Vec < VReg > > ) {
199
+ self . f . block_params_out [ block. index ( ) ] = params;
200
200
}
201
201
202
202
fn compute_doms ( & mut self ) {
@@ -388,7 +388,7 @@ impl Func {
388
388
}
389
389
}
390
390
vregs_by_block_to_be_defined. last_mut ( ) . unwrap ( ) . reverse ( ) ;
391
- builder. set_block_params ( Block :: new ( block) , & block_params[ block] [ ..] ) ;
391
+ builder. set_block_params_in ( Block :: new ( block) , & block_params[ block] [ ..] ) ;
392
392
}
393
393
394
394
for block in 0 ..num_blocks {
@@ -510,9 +510,10 @@ impl Func {
510
510
// Define the branch with blockparam args that must end
511
511
// the block.
512
512
if builder. f . block_succs [ block] . len ( ) > 0 {
513
- let mut args = vec ! [ ] ;
513
+ let mut params = vec ! [ ] ;
514
514
for & succ in & builder. f . block_succs [ block] {
515
- for _ in 0 ..builder. f . block_params [ succ. index ( ) ] . len ( ) {
515
+ let mut args = vec ! [ ] ;
516
+ for _ in 0 ..builder. f . block_params_in [ succ. index ( ) ] . len ( ) {
516
517
let dom_block = choose_dominating_block (
517
518
& builder. idom [ ..] ,
518
519
Block :: new ( block) ,
@@ -524,10 +525,12 @@ impl Func {
524
525
} else {
525
526
u. choose ( & avail[ ..] ) ?
526
527
} ;
527
- args. push ( vreg. vreg ( ) ) ;
528
+ args. push ( * vreg) ;
528
529
}
530
+ params. push ( args) ;
529
531
}
530
- builder. add_inst ( Block :: new ( block) , InstData :: branch ( & args[ ..] ) ) ;
532
+ builder. set_block_params_out ( Block :: new ( block) , params) ;
533
+ builder. add_inst ( Block :: new ( block) , InstData :: branch ( ) ) ;
531
534
} else {
532
535
builder. add_inst ( Block :: new ( block) , InstData :: ret ( ) ) ;
533
536
}
@@ -552,15 +555,29 @@ impl std::fmt::Debug for Func {
552
555
. iter ( )
553
556
. map ( |b| b. index ( ) )
554
557
. collect :: < Vec < _ > > ( ) ;
555
- let params = self . block_params [ i]
558
+ let params_in = self . block_params_in [ i]
556
559
. iter ( )
557
560
. map ( |v| format ! ( "v{}" , v. vreg( ) ) )
558
561
. collect :: < Vec < _ > > ( )
559
562
. join ( ", " ) ;
563
+ let params_out = self . block_params_out [ i]
564
+ . iter ( )
565
+ . enumerate ( )
566
+ . map ( |( succ_idx, vec) | {
567
+ let succ = self . block_succs [ i] [ succ_idx] ;
568
+ let params = vec
569
+ . iter ( )
570
+ . map ( |v| format ! ( "v{}" , v. vreg( ) ) )
571
+ . collect :: < Vec < _ > > ( )
572
+ . join ( ", " ) ;
573
+ format ! ( "block{}({})" , succ. index( ) , params)
574
+ } )
575
+ . collect :: < Vec < _ > > ( )
576
+ . join ( ", " ) ;
560
577
write ! (
561
578
f,
562
579
" block{}({}): # succs:{:?} preds:{:?}\n " ,
563
- i, params , succs, preds
580
+ i, params_in , succs, preds
564
581
) ?;
565
582
for inst in blockrange. iter ( ) {
566
583
if self . requires_refs_on_stack ( inst) {
@@ -574,6 +591,9 @@ impl std::fmt::Debug for Func {
574
591
self . insts[ inst. index( ) ] . operands,
575
592
self . insts[ inst. index( ) ] . clobbers
576
593
) ?;
594
+ if let InstOpcode :: Branch = self . insts [ inst. index ( ) ] . op {
595
+ write ! ( f, " params: {}\n " , params_out) ?;
596
+ }
577
597
}
578
598
}
579
599
write ! ( f, "}}\n " ) ?;
0 commit comments