program: globals: "p" { ptr } "save" { struct {int32, int32} } extern "print_sint": int4s -> void extern "newline": void "fact1"(int4s %0) locals: int4s %1, int4s %2, int4s %4, int4s %5, int1s %6, int4s %7, int4s %8 result: int4s %3 stacksize: struct {} entry: fact113 exit: fact10 fact19: emit _cost0 --> fact18 fact18: imm %6, imm_int 1 --> fact17 fact17: int1sto4 %3, %6 --> fact10 fact16: emit _cost1 --> fact15 fact15: imm %5, imm_int 1 --> fact14 fact14: sub %4, %0, %5 --> fact13 fact13: call "fact1", [%4], %2: int4s -> int4s --> fact12 fact12: id %1, %2 --> fact11 fact113: emit _cost2 --> fact112 fact112: imm %8, imm_int 1 --> fact111 fact111: le %7, %0, %8 --> fact110 fact110: %7? --> fact19, fact16 fact11: mul %3, %0, %1 --> fact10 fact10: return %3 "fact2"(int4s %0) locals: int4s %1, int4s %2, int4s %4, int4s %5, int4s %6, int1s %7, int1s %8 result: int4s %3 stacksize: struct {} entry: fact215 exit: fact20 fact29: notbool %5, %6 --> fact28 fact28: %5? --> fact22, fact27 fact27: emit _cost3 --> fact26 fact26: mul %2, %2, %1 --> fact25 fact25: imm %4, imm_int 1 --> fact24 fact24: add %1, %1, %4 --> fact23 fact23: --> fact210 fact22: emit _cost4 --> fact21 fact215: emit _cost5 --> fact214 fact214: imm %8, imm_int 1 --> fact213 fact213: int1sto4 %2, %8 --> fact212 fact212: imm %7, imm_int 1 --> fact211 fact211: int1sto4 %1, %7 --> fact23 fact210: le %6, %1, %0 --> fact29 fact21: id %3, %2 --> fact20 fact20: return %3 "main"() locals: int4s %0, int4s %1, int4s %2, int4s %3, int1s %5, int1u %6, int4s %7, int1u %8, int4s %9, int4s %10, ptr %11, ptr %12, offset %13, ptr %14, offset %15, ptr %16, ptr %17, offset %18, ptr %19, ptr %20, int1s %21, int1s %22, int1s %23, ptr %24, offset %25, ptr %26, ptr %27, offset %28, ptr %29, offset %30, int4s %31, ptr %32, ptr %33, offset %34, ptr %35, ptr %36, offset %37, ptr %38, offset %39, int4s %40, ptr %41, ptr %42, offset %43, ptr %44, int4s %45, ptr %46, ptr %47, offset %48, ptr %49, offset %50, ptr %51, offset %52, ptr %53, int4s %54, ptr %55, ptr %56, offset %57, ptr %58, offset %59, ptr %60, offset %61, ptr %62, ptr %63, ptr %64, offset %65, ptr %66, ptr %67, ptr %68, offset %69, ptr %70, int1s %71, int1s %72, int1s %73, ptr %74, offset %75, ptr %76, int4s %77, int1s %78, ptr %79, offset %80, ptr %81, offset %82 result: int4s %4 stacksize: struct {struct {int32, int32}, struct {int32, int32}, ptr[3]} entry: main91 exit: main0 main91: emit _cost6 --> main90 main90: imm %81, imm_addr STACK --> main89 main9: addp %12, %14, %15 --> main8 main89: imm %82, imm_offset { struct {struct {int32, int32}}, 0 } --> main88 main88: addp %79, %81, %82 --> main87 main87: imm %80, imm_offset { struct {int32, int32}, 1 } --> main86 main86: addp %76, %79, %80 --> main85 main85: imm %78, imm_int 5 --> main84 main84: int1sto4 %77, %78 --> main83 main83: store int32, %76, %77 --> main82 main82: imm %74, imm_addr STACK --> main81 main81: imm %75, imm_offset { struct {struct {int32, int32}, struct {int32, int32}, ptr[3]}, 2 } --> main80 main80: addp %70, %74, %75 --> main79 main8: imm %13, imm_offset { struct {int32, int32}, 1 } --> main7 main79: imm %72, imm_int 1 --> main78 main78: imm %73, imm_sizeof (ptr) --> main77 main77: mul %71, %72, %73 --> main76 main76: addp %66, %70, %71 --> main75 main75: imm %68, imm_addr STACK --> main74 main74: imm %69, imm_offset { struct {struct {int32, int32}}, 0 } --> main73 main73: addp %67, %68, %69 --> main72 main72: store ptr, %66, %67 --> main71 main71: imm %62, imm_addr "p" --> main70 main70: imm %64, imm_addr STACK --> main69 main7: addp %11, %12, %13 --> main6 main69: imm %65, imm_offset { struct {struct {int32, int32}}, 0 } --> main68 main68: addp %63, %64, %65 --> main67 main67: store ptr, %62, %63 --> main66 main66: imm %60, imm_addr "save" --> main65 main65: imm %61, imm_offset { struct {int32, int32}, 0 } --> main64 main64: addp %53, %60, %61 --> main63 main63: imm %58, imm_addr STACK --> main62 main62: imm %59, imm_offset { struct {struct {int32, int32}}, 0 } --> main61 main61: addp %56, %58, %59 --> main60 main60: imm %57, imm_offset { struct {int32, int32}, 0 } --> main59 main6: load int32, %11, %10 --> main5 main59: addp %55, %56, %57 --> main58 main58: load int32, %55, %54 --> main57 main57: store int32, %53, %54 --> main56 main56: imm %51, imm_addr "save" --> main55 main55: imm %52, imm_offset { struct {int32, int32}, 1 } --> main54 main54: addp %44, %51, %52 --> main53 main53: imm %49, imm_addr STACK --> main52 main52: imm %50, imm_offset { struct {struct {int32, int32}}, 0 } --> main51 main51: addp %47, %49, %50 --> main50 main50: imm %48, imm_offset { struct {int32, int32}, 1 } --> main49 main5: eq %7, %9, %10 --> main4 main49: addp %46, %47, %48 --> main48 main48: load int32, %46, %45 --> main47 main47: store int32, %44, %45 --> main46 main46: imm %42, imm_addr "save" --> main45 main45: imm %43, imm_offset { struct {int32, int32}, 1 } --> main44 main44: addp %41, %42, %43 --> main43 main43: load int32, %41, %40 --> main42 main42: call "fact1", [%40], %2: int4s -> int4s --> main41 main41: id %1, %2 --> main40 main40: imm %38, imm_addr STACK --> main39 main4: call "print_sint", [%7], %8: int4s -> void --> main3 main39: imm %39, imm_offset { struct {struct {int32, int32}}, 0 } --> main38 main38: addp %36, %38, %39 --> main37 main37: imm %37, imm_offset { struct {int32, int32}, 1 } --> main36 main36: addp %35, %36, %37 --> main35 main35: store int32, %35, %1 --> main34 main34: imm %33, imm_addr "save" --> main33 main33: imm %34, imm_offset { struct {int32, int32}, 1 } --> main32 main32: addp %32, %33, %34 --> main31 main31: load int32, %32, %31 --> main30 main30: call "fact2", [%31], %3: int4s -> int4s --> main29 main3: call "newline", [], %6: void --> main2 main29: id %0, %3 --> main28 main28: imm %29, imm_addr STACK --> main27 main27: imm %30, imm_offset { struct {struct {int32, int32}, struct {int32, int32}}, 1 } --> main26 main26: addp %27, %29, %30 --> main25 main25: imm %28, imm_offset { struct {int32, int32}, 1 } --> main24 main24: addp %26, %27, %28 --> main23 main23: store int32, %26, %0 --> main22 main22: imm %24, imm_addr STACK --> main21 main21: imm %25, imm_offset { struct {struct {int32, int32}, struct {int32, int32}, ptr[3]}, 2 } --> main20 main20: addp %20, %24, %25 --> main19 main2: imm %5, imm_int 0 --> main1 main19: imm %22, imm_int 1 --> main18 main18: imm %23, imm_sizeof (ptr) --> main17 main17: mul %21, %22, %23 --> main16 main16: addp %19, %20, %21 --> main15 main15: load ptr, %19, %17 --> main14 main14: imm %18, imm_offset { struct {int32, int32}, 1 } --> main13 main13: addp %16, %17, %18 --> main12 main12: load int32, %16, %9 --> main11 main11: imm %14, imm_addr STACK --> main10 main10: imm %15, imm_offset { struct {struct {int32, int32}, struct {int32, int32}}, 1 } --> main9 main1: int1sto4 %4, %5 --> main0 main0: return %4