@@ -415,7 +415,9 @@ def to_c(self) -> str:
415415 f .write ("HANDLES();\n " )
416416 for param in self .params :
417417 f .write (f"GC_PROTECT({ param } );\n " )
418- self ._to_c (f , self .cfg .entry , InstrId (), self .cfg .doms ())
418+ gvn = InstrId ()
419+ for block in self .cfg .rpo ():
420+ self ._to_c (f , block , gvn )
419421 f .write ("}" )
420422 return f .getvalue ()
421423 return
@@ -424,7 +426,7 @@ def c_decl(self) -> str:
424426 params = ", " .join (f"struct object *{ param } " for param in self .params )
425427 return f"struct object *fn{ self .id } ({ params } )\n "
426428
427- def _instr_to_c (self , instr : Instr , gvn : InstrId , doms : dict [ Block , set [ Block ]] ) -> str :
429+ def _instr_to_c (self , instr : Instr , gvn : InstrId ) -> str :
428430 def _handle (rhs : str ) -> str :
429431 return f"OBJECT_HANDLE({ gvn .name (instr )} , { rhs } );\n "
430432
@@ -470,24 +472,21 @@ def op(idx: int) -> str:
470472 return f"if ({ op (0 )} == NULL) {{ abort(); }}\n " + _handle (op (0 ))
471473 raise NotImplementedError (type (instr ))
472474
473- def _to_c (self , f : io .StringIO , block : Block , gvn : InstrId , doms : dict [ Block , set [ Block ]] ) -> None :
475+ def _to_c (self , f : io .StringIO , block : Block , gvn : InstrId ) -> None :
474476 f .write (f"{ block .name ()} :;\n " )
475477 for instr in block .instrs :
476478 if isinstance (instr , Control ):
477479 break
478- f .write (self ._instr_to_c (instr .find (), gvn , doms ))
480+ f .write (self ._instr_to_c (instr .find (), gvn ))
479481 assert isinstance (instr , Control )
480482 if isinstance (instr , Return ):
481483 f .write (f"return { gvn .name (instr .operands [0 ])} ;\n " )
482484 elif isinstance (instr , Jump ):
483485 f .write (f"goto { instr .target .name ()} ;\n " )
484- self ._to_c (f , instr .target , gvn , doms )
485486 elif isinstance (instr , CondBranch ):
486487 f .write (
487488 f"if ({ gvn .name (instr .operands [0 ])} ) {{ goto { instr .conseq .name ()} ; }} else {{ goto { instr .alt .name ()} ; }}\n "
488489 )
489- self ._to_c (f , instr .conseq , gvn , doms )
490- self ._to_c (f , instr .alt , gvn , doms )
491490 elif isinstance (instr , MatchFail ):
492491 f .write ("""fprintf(stderr, "no matching cases\\ n");\n """ )
493492 f .write ("abort();\n " )
0 commit comments