@@ -31,6 +31,7 @@ pub struct EffectSet {
3131// TODO(Jacob): Add tests for Effect
3232// TODO(Jacob): Modify ruby generation of effects to include nice labels for Effects instead of just EffectSets
3333// TODO(Jacob): Modify these labels to be callected effect_sets in the inc.rs, and create others called effects
34+ #[ derive( Clone , Copy , Debug ) ]
3435pub struct Effect {
3536 /// Unlike ZJIT's type system, effects do not have a notion of subclasses.
3637 /// Instead of specializations, the Effect struct contains two EffectSet bitsets.
@@ -50,7 +51,7 @@ pub struct Effect {
5051include ! ( "hir_effect.inc.rs" ) ;
5152
5253
53- /// Print adaptor for [`Effect `]. See [`PtrPrintMap`].
54+ /// Print adaptor for [`EffectSet `]. See [`PtrPrintMap`].
5455pub struct EffectSetPrinter < ' a > {
5556 inner : EffectSet ,
5657 ptr_map : & ' a PtrPrintMap ,
@@ -87,6 +88,27 @@ impl std::fmt::Display for EffectSet {
8788 }
8889}
8990
91+ /// Print adaptor for [`Effect`]. See [`PtrPrintMap`].
92+ pub struct EffectPrinter < ' a > {
93+ inner : Effect ,
94+ ptr_map : & ' a PtrPrintMap ,
95+ }
96+
97+ impl < ' a > std:: fmt:: Display for EffectPrinter < ' a > {
98+ fn fmt ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
99+ let read = format ! ( "{}" , self . inner. read) ;
100+ let write = format ! ( "{}" , self . inner. write) ;
101+ write ! ( f, "{read}, {write}" ) ?;
102+ Ok ( ( ) )
103+ }
104+ }
105+
106+ impl std:: fmt:: Display for Effect {
107+ fn fmt ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
108+ self . print ( & PtrPrintMap :: identity ( ) ) . fmt ( f)
109+ }
110+ }
111+
90112impl EffectSet {
91113 const fn from_bits ( bits : EffectBits ) -> Self {
92114 Self { bits }
@@ -127,6 +149,7 @@ impl EffectSet {
127149 }
128150}
129151
152+ // TODO(Jacob): Add interferes function
130153impl Effect {
131154 pub fn from_sets ( read : EffectSet , write : EffectSet ) -> Effect {
132155 Effect { read, write }
@@ -183,6 +206,10 @@ impl Effect {
183206 self . intersect ( other)
184207 )
185208 }
209+
210+ pub fn print ( self , ptr_map : & PtrPrintMap ) -> EffectPrinter < ' _ > {
211+ EffectPrinter { inner : self , ptr_map }
212+ }
186213}
187214
188215#[ cfg( test) ]
@@ -195,35 +222,45 @@ mod tests {
195222 }
196223
197224 #[ track_caller]
198- fn assert_subeffect ( left : EffectSet , right : EffectSet ) {
225+ fn assert_subeffect_set ( left : EffectSet , right : EffectSet ) {
226+ assert ! ( right. includes( left) , "{left} is not a subeffect set of {right}" ) ;
227+ }
228+
229+ #[ track_caller]
230+ fn assert_not_subeffect_set ( left : EffectSet , right : EffectSet ) {
231+ assert ! ( !right. includes( left) , "{left} is a subeffect set of {right}" ) ;
232+ }
233+
234+ #[ track_caller]
235+ fn assert_subeffect ( left : Effect , right : Effect ) {
199236 assert ! ( right. includes( left) , "{left} is not a subeffect of {right}" ) ;
200237 }
201238
202239 #[ track_caller]
203- fn assert_not_subeffect ( left : EffectSet , right : EffectSet ) {
240+ fn assert_not_subeffect ( left : Effect , right : Effect ) {
204241 assert ! ( !right. includes( left) , "{left} is a subeffect of {right}" ) ;
205242 }
206243
207244 #[ test]
208245 fn none_is_subeffect_of_everything ( ) {
209- assert_subeffect ( effect_sets:: Empty , effect_sets:: Empty ) ;
210- assert_subeffect ( effect_sets:: Empty , effect_sets:: Any ) ;
211- assert_subeffect ( effect_sets:: Empty , effect_sets:: Control ) ;
212- assert_subeffect ( effect_sets:: Empty , effect_sets:: Frame ) ;
213- assert_subeffect ( effect_sets:: Empty , effect_sets:: Stack ) ;
214- assert_subeffect ( effect_sets:: Empty , effect_sets:: Locals ) ;
215- assert_subeffect ( effect_sets:: Empty , effect_sets:: Allocator ) ;
246+ assert_subeffect_set ( effect_sets:: Empty , effect_sets:: Empty ) ;
247+ assert_subeffect_set ( effect_sets:: Empty , effect_sets:: Any ) ;
248+ assert_subeffect_set ( effect_sets:: Empty , effect_sets:: Control ) ;
249+ assert_subeffect_set ( effect_sets:: Empty , effect_sets:: Frame ) ;
250+ assert_subeffect_set ( effect_sets:: Empty , effect_sets:: Stack ) ;
251+ assert_subeffect_set ( effect_sets:: Empty , effect_sets:: Locals ) ;
252+ assert_subeffect_set ( effect_sets:: Empty , effect_sets:: Allocator ) ;
216253 }
217254
218255 #[ test]
219256 fn everything_is_subeffect_of_any ( ) {
220- assert_subeffect ( effect_sets:: Empty , effect_sets:: Any ) ;
221- assert_subeffect ( effect_sets:: Any , effect_sets:: Any ) ;
222- assert_subeffect ( effect_sets:: Control , effect_sets:: Any ) ;
223- assert_subeffect ( effect_sets:: Frame , effect_sets:: Any ) ;
224- assert_subeffect ( effect_sets:: Memory , effect_sets:: Any ) ;
225- assert_subeffect ( effect_sets:: Locals , effect_sets:: Any ) ;
226- assert_subeffect ( effect_sets:: PC , effect_sets:: Any ) ;
257+ assert_subeffect_set ( effect_sets:: Empty , effect_sets:: Any ) ;
258+ assert_subeffect_set ( effect_sets:: Any , effect_sets:: Any ) ;
259+ assert_subeffect_set ( effect_sets:: Control , effect_sets:: Any ) ;
260+ assert_subeffect_set ( effect_sets:: Frame , effect_sets:: Any ) ;
261+ assert_subeffect_set ( effect_sets:: Memory , effect_sets:: Any ) ;
262+ assert_subeffect_set ( effect_sets:: Locals , effect_sets:: Any ) ;
263+ assert_subeffect_set ( effect_sets:: PC , effect_sets:: Any ) ;
227264 }
228265
229266 #[ test]
@@ -232,9 +269,9 @@ mod tests {
232269 for i in [ 0 , 1 , 4 , 6 , 10 , 15 ] {
233270 let e = EffectSet :: from_bits ( i) ;
234271 // Testing on bottom, top, and some arbitrary element in the middle
235- assert_subeffect ( effect_sets:: Empty , effect_sets:: Empty . union ( e) ) ;
236- assert_subeffect ( effect_sets:: Any , effect_sets:: Any . union ( e) ) ;
237- assert_subeffect ( effect_sets:: Frame , effect_sets:: Frame . union ( e) ) ;
272+ assert_subeffect_set ( effect_sets:: Empty , effect_sets:: Empty . union ( e) ) ;
273+ assert_subeffect_set ( effect_sets:: Any , effect_sets:: Any . union ( e) ) ;
274+ assert_subeffect_set ( effect_sets:: Frame , effect_sets:: Frame . union ( e) ) ;
238275 }
239276 }
240277
@@ -244,9 +281,9 @@ mod tests {
244281 for i in [ 0 , 3 , 6 , 8 , 15 ] {
245282 let e = EffectSet :: from_bits ( i) ;
246283 // Testing on bottom, top, and some arbitrary element in the middle
247- assert_subeffect ( effect_sets:: Empty . intersect ( e) , effect_sets:: Empty ) ;
248- assert_subeffect ( effect_sets:: Any . intersect ( e) , effect_sets:: Any ) ;
249- assert_subeffect ( effect_sets:: Frame . intersect ( e) , effect_sets:: Frame ) ;
284+ assert_subeffect_set ( effect_sets:: Empty . intersect ( e) , effect_sets:: Empty ) ;
285+ assert_subeffect_set ( effect_sets:: Any . intersect ( e) , effect_sets:: Any ) ;
286+ assert_subeffect_set ( effect_sets:: Frame . intersect ( e) , effect_sets:: Frame ) ;
250287 }
251288 }
252289
@@ -259,9 +296,9 @@ mod tests {
259296
260297 #[ test]
261298 fn frame_includes_stack_locals_and_pc ( ) {
262- assert_subeffect ( effect_sets:: Stack , effect_sets:: Frame ) ;
263- assert_subeffect ( effect_sets:: Locals , effect_sets:: Frame ) ;
264- assert_subeffect ( effect_sets:: PC , effect_sets:: Frame ) ;
299+ assert_subeffect_set ( effect_sets:: Stack , effect_sets:: Frame ) ;
300+ assert_subeffect_set ( effect_sets:: Locals , effect_sets:: Frame ) ;
301+ assert_subeffect_set ( effect_sets:: PC , effect_sets:: Frame ) ;
265302 }
266303
267304 #[ test]
@@ -272,11 +309,25 @@ mod tests {
272309
273310 #[ test]
274311 fn any_includes_some_subeffects ( ) {
275- assert_subeffect ( effect_sets:: Allocator , effect_sets:: Any ) ;
276- assert_subeffect ( effect_sets:: Frame , effect_sets:: Any ) ;
277- assert_subeffect ( effect_sets:: Memory , effect_sets:: Any ) ;
312+ assert_subeffect_set ( effect_sets:: Allocator , effect_sets:: Any ) ;
313+ assert_subeffect_set ( effect_sets:: Frame , effect_sets:: Any ) ;
314+ assert_subeffect_set ( effect_sets:: Memory , effect_sets:: Any ) ;
278315 }
279316
317+ // TODO(Jacob): Fill In
318+ #[ test]
319+ fn any_includes_everything ( ) {
320+ }
321+
322+ // TODO(Jacob): Test the following
323+ // union
324+ // intersect
325+ // includes
326+ // exclude
327+ // bit_equal
328+ // overlaps
329+ // print
330+
280331 #[ test]
281332 fn display_exact_bits_match ( ) {
282333 assert_eq ! ( format!( "{}" , effect_sets:: Empty ) , "Empty" ) ;
0 commit comments