55use fxhash:: { FxHashMap , FxHashSet } ;
66use std:: collections:: { BTreeMap , VecDeque } ;
77use waffle:: {
8- cfg:: CFGInfo , entity:: PerEntity , pool:: ListRef , Block , FunctionBody , MemoryArg , Operator ,
9- Terminator , Type , Value , ValueDef ,
8+ cfg:: CFGInfo , entity:: PerEntity , pool:: ListRef , Block , FunctionBody , Operator , Terminator ,
9+ Type , Value , ValueDef ,
1010} ;
1111
1212/// Dataflow analysis lattice: a value is either some original SSA
@@ -37,56 +37,6 @@ impl AbsValue {
3737 }
3838}
3939
40- fn is_load_or_store ( op : & Operator ) -> bool {
41- match op {
42- Operator :: I32Load { .. }
43- | Operator :: I32Load8S { .. }
44- | Operator :: I32Load8U { .. }
45- | Operator :: I32Load16S { .. }
46- | Operator :: I32Load16U { .. }
47- | Operator :: I64Load { .. }
48- | Operator :: I64Load8S { .. }
49- | Operator :: I64Load8U { .. }
50- | Operator :: I64Load16S { .. }
51- | Operator :: I64Load16U { .. }
52- | Operator :: I64Load32S { .. }
53- | Operator :: I64Load32U { .. } => true ,
54- Operator :: I32Store { .. }
55- | Operator :: I32Store8 { .. }
56- | Operator :: I32Store16 { .. }
57- | Operator :: I64Store { .. }
58- | Operator :: I64Store8 { .. }
59- | Operator :: I64Store16 { .. }
60- | Operator :: I64Store32 { .. } => true ,
61- _ => false ,
62- }
63- }
64-
65- fn update_load_or_store_memarg < F : Fn ( & mut MemoryArg ) > ( op : & mut Operator , f : F ) {
66- match op {
67- Operator :: I32Load { memory }
68- | Operator :: I32Load8S { memory }
69- | Operator :: I32Load8U { memory }
70- | Operator :: I32Load16S { memory }
71- | Operator :: I32Load16U { memory }
72- | Operator :: I64Load { memory }
73- | Operator :: I64Load8S { memory }
74- | Operator :: I64Load8U { memory }
75- | Operator :: I64Load16S { memory }
76- | Operator :: I64Load16U { memory }
77- | Operator :: I64Load32S { memory }
78- | Operator :: I64Load32U { memory }
79- | Operator :: I32Store { memory }
80- | Operator :: I32Store8 { memory }
81- | Operator :: I32Store16 { memory }
82- | Operator :: I64Store { memory }
83- | Operator :: I64Store8 { memory }
84- | Operator :: I64Store16 { memory }
85- | Operator :: I64Store32 { memory } => f ( memory) ,
86- _ => { }
87- }
88- }
89-
9040pub fn run ( func : & mut FunctionBody , cfg : & CFGInfo ) {
9141 waffle:: passes:: resolve_aliases:: run ( func) ;
9242 log:: trace!(
@@ -235,7 +185,7 @@ pub fn run(func: &mut FunctionBody, cfg: &CFGInfo) {
235185 let mut used_as_addr = FxHashSet :: default ( ) ;
236186 for ( _, def) in func. values . entries ( ) {
237187 if let ValueDef :: Operator ( op, args, _) = def {
238- if is_load_or_store ( op ) {
188+ if op . is_load ( ) || op . is_store ( ) {
239189 used_as_addr. insert ( func. arg_pool [ * args] [ 0 ] ) ;
240190 }
241191 }
@@ -311,7 +261,7 @@ pub fn run(func: &mut FunctionBody, cfg: &CFGInfo) {
311261
312262 // Handle loads/stores.
313263 if let ValueDef :: Operator ( op, args, tys) = & func. values [ inst] {
314- if is_load_or_store ( op ) {
264+ if op . is_load ( ) || op . is_store ( ) {
315265 let args = & func. arg_pool [ * args] ;
316266 let tys = * tys;
317267 let addr = args[ 0 ] ;
@@ -327,7 +277,7 @@ pub fn run(func: &mut FunctionBody, cfg: &CFGInfo) {
327277 let offset = * min_offset_from. get ( & base) . unwrap ( ) ;
328278 assert ! ( offset <= 0 ) ;
329279 let addend = ( -offset) as u32 ;
330- update_load_or_store_memarg ( & mut op , |memory| {
280+ op . update_memory_arg ( |memory| {
331281 memory. offset =
332282 memory. offset . wrapping_add ( addend) . wrapping_add ( this_offset)
333283 } ) ;
0 commit comments