Skip to content

Instantly share code, notes, and snippets.

@bollu
Last active April 3, 2024 14:14
Show Gist options
  • Save bollu/0783b677f73d3a2c17a5e5ff48fd3ad2 to your computer and use it in GitHub Desktop.
Save bollu/0783b677f73d3a2c17a5e5ff48fd3ad2 to your computer and use it in GitHub Desktop.
Lean (version 4.8.0, commit 1f4dea858243, Release)
Lean (version 4.8.0, commit 5281a01ae3a9, Release)
16c16,17
< let x_13 : usize := ptrAddrUnsafe ◾ x_9;
---
> let x_13 : obj := proj[1] x_10;
> let x_14 : usize := ptrAddrUnsafe ◾ x_9;
18,20c19,21
< let x_14 : usize := ptrAddrUnsafe ◾ x_12;
< let x_15 : u8 := USize.decEq x_13 x_14;
< case x_15 : u8 of
---
> let x_15 : usize := ptrAddrUnsafe ◾ x_12;
> let x_16 : u8 := USize.decEq x_14 x_15;
> case x_16 : u8 of
22,23c23,24
< let x_16 : u8 := isShared x_1;
< case x_16 : u8 of
---
> let x_17 : u8 := isShared x_1;
> case x_17 : u8 of
25,27c26
< let x_17 : obj := proj[1] x_1;
< dec x_17;
< let x_18 : obj := proj[0] x_1;
---
> let x_18 : obj := proj[1] x_1;
29,31c28,34
< set x_1[1] := x_12;
< set x_10[0] := x_1;
< ret x_10
---
> let x_19 : obj := proj[0] x_1;
> dec x_19;
> set x_10[1] := x_12;
> set x_10[0] := x_8;
> set x_1[1] := x_13;
> set x_1[0] := x_10;
> ret x_1
34,36c37,40
< let x_19 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_12;
< set x_10[0] := x_19;
< ret x_10
---
> set x_10[1] := x_12;
> set x_10[0] := x_8;
> let x_20 : obj := ctor_0[EStateM.Result.ok] x_10 x_13;
> ret x_20
38,40c42,44
< let x_20 : usize := ptrAddrUnsafe ◾ x_8;
< let x_21 : u8 := USize.decEq x_20 x_20;
< case x_21 : u8 of
---
> let x_21 : usize := ptrAddrUnsafe ◾ x_8;
> let x_22 : u8 := USize.decEq x_21 x_21;
> case x_22 : u8 of
42,43c46,47
< let x_22 : u8 := isShared x_1;
< case x_22 : u8 of
---
> let x_23 : u8 := isShared x_1;
> case x_23 : u8 of
45,47c49
< let x_23 : obj := proj[1] x_1;
< dec x_23;
< let x_24 : obj := proj[0] x_1;
---
> let x_24 : obj := proj[1] x_1;
49,51c51,57
< set x_1[1] := x_12;
< set x_10[0] := x_1;
< ret x_10
---
> let x_25 : obj := proj[0] x_1;
> dec x_25;
> set x_10[1] := x_12;
> set x_10[0] := x_8;
> set x_1[1] := x_13;
> set x_1[0] := x_10;
> ret x_1
54,56c60,63
< let x_25 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_12;
< set x_10[0] := x_25;
< ret x_10
---
> set x_10[1] := x_12;
> set x_10[0] := x_8;
> let x_26 : obj := ctor_0[EStateM.Result.ok] x_10 x_13;
> ret x_26
63,64c70,72
< let x_26 : obj := proj[0] x_10;
< let x_27 : obj := proj[1] x_10;
---
> let x_27 : obj := proj[0] x_10;
> let x_28 : obj := proj[1] x_10;
> inc x_28;
66d73
< inc x_26;
68c75
< let x_28 : usize := ptrAddrUnsafe ◾ x_9;
---
> let x_29 : usize := ptrAddrUnsafe ◾ x_9;
70,72c77,79
< let x_29 : usize := ptrAddrUnsafe ◾ x_26;
< let x_30 : u8 := USize.decEq x_28 x_29;
< case x_30 : u8 of
---
> let x_30 : usize := ptrAddrUnsafe ◾ x_27;
> let x_31 : u8 := USize.decEq x_29 x_30;
> case x_31 : u8 of
74,77c81,84
< let x_31 : obj := reset[2] x_1;
< let x_32 : obj := reuse x_31 in ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_26;
< let x_33 : obj := ctor_0[EStateM.Result.ok] x_32 x_27;
< ret x_33
---
> let x_32 : obj := reset[2] x_1;
> let x_33 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_27;
> let x_34 : obj := reuse x_32 in ctor_0[EStateM.Result.ok] x_33 x_28;
> ret x_34
79,81c86,88
< let x_34 : usize := ptrAddrUnsafe ◾ x_8;
< let x_35 : u8 := USize.decEq x_34 x_34;
< case x_35 : u8 of
---
> let x_35 : usize := ptrAddrUnsafe ◾ x_8;
> let x_36 : u8 := USize.decEq x_35 x_35;
> case x_36 : u8 of
83,86c90,93
< let x_36 : obj := reset[2] x_1;
< let x_37 : obj := reuse x_36 in ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_26;
< let x_38 : obj := ctor_0[EStateM.Result.ok] x_37 x_27;
< ret x_38
---
> let x_37 : obj := reset[2] x_1;
> let x_38 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_27;
> let x_39 : obj := reuse x_37 in ctor_0[EStateM.Result.ok] x_38 x_28;
> ret x_39
88c95
< dec x_26;
---
> dec x_27;
90,91c97,98
< let x_39 : obj := ctor_0[EStateM.Result.ok] x_1 x_27;
< ret x_39
---
> let x_40 : obj := ctor_0[EStateM.Result.ok] x_1 x_28;
> ret x_40
96,97c103,104
< let x_40 : u8 := isShared x_10;
< case x_40 : u8 of
---
> let x_41 : u8 := isShared x_10;
> case x_41 : u8 of
101,102c108,110
< let x_41 : obj := proj[0] x_10;
< let x_42 : obj := proj[1] x_10;
---
> let x_42 : obj := proj[0] x_10;
> let x_43 : obj := proj[1] x_10;
> inc x_43;
104d111
< inc x_41;
106,107c113,114
< let x_43 : obj := ctor_1[EStateM.Result.error] x_41 x_42;
< ret x_43
---
> let x_44 : obj := ctor_1[EStateM.Result.error] x_42 x_43;
> ret x_44
109,111c116
< let x_44 : obj := proj[0] x_1;
< inc x_44;
< let x_45 : obj := proj[1] x_1;
---
> let x_45 : obj := proj[0] x_1;
113c118
< let x_46 : obj := proj[4] x_44;
---
> let x_46 : obj := proj[1] x_1;
114a120,121
> let x_47 : obj := proj[4] x_45;
> inc x_47;
120,121c127,128
< let x_47 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_46 x_2 x_3 x_4 x_5 x_6 x_7;
< case x_47 : obj of
---
> let x_48 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_47 x_2 x_3 x_4 x_5 x_6 x_7;
> case x_48 : obj of
123,125c130
< let x_48 : obj := proj[0] x_47;
< inc x_48;
< let x_49 : obj := proj[1] x_47;
---
> let x_49 : obj := proj[0] x_48;
127,128c132
< dec x_47;
< let x_50 : obj := proj[3] x_44;
---
> let x_50 : obj := proj[1] x_48;
130c134,135
< let x_51 : obj := proj[2] x_44;
---
> dec x_48;
> let x_51 : obj := proj[3] x_45;
132,138c137,138
< inc x_44;
< let x_52 : obj := _private.Lean.Compiler.LCNF.CompilerM.0.Lean.Compiler.LCNF.updateFunDeclImp x_44 x_50 x_51 x_48 x_3 x_4 x_5 x_6 x_49;
< let x_53 : obj := proj[0] x_52;
< inc x_53;
< let x_54 : obj := proj[1] x_52;
< inc x_54;
< dec x_52;
---
> let x_52 : obj := proj[2] x_45;
> inc x_52;
140,151c140,151
< let x_55 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_45 x_2 x_3 x_4 x_5 x_6 x_54;
< case x_55 : obj of
< EStateM.Result.ok →
< let x_56 : u8 := isShared x_55;
< case x_56 : u8 of
< Bool.false →
< let x_57 : obj := proj[0] x_55;
< let x_58 : usize := ptrAddrUnsafe ◾ x_45;
< dec x_45;
< let x_59 : usize := ptrAddrUnsafe ◾ x_57;
< let x_60 : u8 := USize.decEq x_58 x_59;
< case x_60 : u8 of
---
> let x_53 : obj := _private.Lean.Compiler.LCNF.CompilerM.0.Lean.Compiler.LCNF.updateFunDeclImp x_45 x_51 x_52 x_49 x_3 x_4 x_5 x_6 x_50;
> let x_54 : u8 := isShared x_53;
> case x_54 : u8 of
> Bool.false →
> let x_55 : obj := proj[0] x_53;
> let x_56 : obj := proj[1] x_53;
> inc x_46;
> let x_57 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_46 x_2 x_3 x_4 x_5 x_6 x_56;
> case x_57 : obj of
> EStateM.Result.ok →
> let x_58 : u8 := isShared x_57;
> case x_58 : u8 of
153,155c153,159
< dec x_44;
< let x_61 : u8 := isShared x_1;
< case x_61 : u8 of
---
> let x_59 : obj := proj[0] x_57;
> let x_60 : obj := proj[1] x_57;
> let x_61 : usize := ptrAddrUnsafe ◾ x_46;
> dec x_46;
> let x_62 : usize := ptrAddrUnsafe ◾ x_59;
> let x_63 : u8 := USize.decEq x_61 x_62;
> case x_63 : u8 of
157,165c161
< let x_62 : obj := proj[1] x_1;
< dec x_62;
< let x_63 : obj := proj[0] x_1;
< dec x_63;
< set x_1[1] := x_57;
< set x_1[0] := x_53;
< set x_55[0] := x_1;
< ret x_55
< Bool.true →
---
> dec x_45;
167,169c163,188
< let x_64 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_57;
< set x_55[0] := x_64;
< ret x_55
---
> setTag x_57 := 1;
> set x_57[1] := x_59;
> set x_57[0] := x_55;
> set x_53[1] := x_60;
> set x_53[0] := x_57;
> ret x_53
> Bool.true →
> let x_64 : usize := ptrAddrUnsafe ◾ x_45;
> dec x_45;
> let x_65 : usize := ptrAddrUnsafe ◾ x_55;
> let x_66 : u8 := USize.decEq x_64 x_65;
> case x_66 : u8 of
> Bool.false →
> dec x_1;
> setTag x_57 := 1;
> set x_57[1] := x_59;
> set x_57[0] := x_55;
> set x_53[1] := x_60;
> set x_53[0] := x_57;
> ret x_53
> Bool.true →
> dec x_59;
> del x_53;
> dec x_55;
> set x_57[0] := x_1;
> ret x_57
171,175c190,199
< let x_65 : usize := ptrAddrUnsafe ◾ x_44;
< dec x_44;
< let x_66 : usize := ptrAddrUnsafe ◾ x_53;
< let x_67 : u8 := USize.decEq x_65 x_66;
< case x_67 : u8 of
---
> let x_67 : obj := proj[0] x_57;
> let x_68 : obj := proj[1] x_57;
> inc x_68;
> inc x_67;
> dec x_57;
> let x_69 : usize := ptrAddrUnsafe ◾ x_46;
> dec x_46;
> let x_70 : usize := ptrAddrUnsafe ◾ x_67;
> let x_71 : u8 := USize.decEq x_69 x_70;
> case x_71 : u8 of
177,178c201,212
< let x_68 : u8 := isShared x_1;
< case x_68 : u8 of
---
> dec x_45;
> dec x_1;
> let x_72 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_55 x_67;
> set x_53[1] := x_68;
> set x_53[0] := x_72;
> ret x_53
> Bool.true →
> let x_73 : usize := ptrAddrUnsafe ◾ x_45;
> dec x_45;
> let x_74 : usize := ptrAddrUnsafe ◾ x_55;
> let x_75 : u8 := USize.decEq x_73 x_74;
> case x_75 : u8 of
180,188d213
< let x_69 : obj := proj[1] x_1;
< dec x_69;
< let x_70 : obj := proj[0] x_1;
< dec x_70;
< set x_1[1] := x_57;
< set x_1[0] := x_53;
< set x_55[0] := x_1;
< ret x_55
< Bool.true →
190,202c215,226
< let x_71 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_57;
< set x_55[0] := x_71;
< ret x_55
< Bool.true →
< dec x_57;
< dec x_53;
< set x_55[0] := x_1;
< ret x_55
< Bool.true →
< let x_72 : obj := proj[0] x_55;
< let x_73 : obj := proj[1] x_55;
< inc x_73;
< inc x_72;
---
> let x_76 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_55 x_67;
> set x_53[1] := x_68;
> set x_53[0] := x_76;
> ret x_53
> Bool.true →
> dec x_67;
> del x_53;
> dec x_55;
> let x_77 : obj := ctor_0[EStateM.Result.ok] x_1 x_68;
> ret x_77
> EStateM.Result.error →
> del x_53;
204c228
< let x_74 : usize := ptrAddrUnsafe ◾ x_45;
---
> dec x_46;
206,208c230,262
< let x_75 : usize := ptrAddrUnsafe ◾ x_72;
< let x_76 : u8 := USize.decEq x_74 x_75;
< case x_76 : u8 of
---
> dec x_1;
> let x_78 : u8 := isShared x_57;
> case x_78 : u8 of
> Bool.false →
> ret x_57
> Bool.true →
> let x_79 : obj := proj[0] x_57;
> let x_80 : obj := proj[1] x_57;
> inc x_80;
> inc x_79;
> dec x_57;
> let x_81 : obj := ctor_1[EStateM.Result.error] x_79 x_80;
> ret x_81
> Bool.true →
> let x_82 : obj := proj[0] x_53;
> let x_83 : obj := proj[1] x_53;
> inc x_83;
> inc x_82;
> dec x_53;
> inc x_46;
> let x_84 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_46 x_2 x_3 x_4 x_5 x_6 x_83;
> case x_84 : obj of
> EStateM.Result.ok →
> let x_85 : obj := proj[0] x_84;
> inc x_85;
> let x_86 : obj := proj[1] x_84;
> inc x_86;
> let x_87 : obj := reset[2] x_84;
> let x_88 : usize := ptrAddrUnsafe ◾ x_46;
> dec x_46;
> let x_89 : usize := ptrAddrUnsafe ◾ x_85;
> let x_90 : u8 := USize.decEq x_88 x_89;
> case x_90 : u8 of
210,214c264,268
< dec x_44;
< let x_77 : obj := reset[2] x_1;
< let x_78 : obj := reuse x_77 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_72;
< let x_79 : obj := ctor_0[EStateM.Result.ok] x_78 x_73;
< ret x_79
---
> dec x_45;
> dec x_1;
> let x_91 : obj := reuse! x_87 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_82 x_85;
> let x_92 : obj := ctor_0[EStateM.Result.ok] x_91 x_86;
> ret x_92
216,220c270,274
< let x_80 : usize := ptrAddrUnsafe ◾ x_44;
< dec x_44;
< let x_81 : usize := ptrAddrUnsafe ◾ x_53;
< let x_82 : u8 := USize.decEq x_80 x_81;
< case x_82 : u8 of
---
> let x_93 : usize := ptrAddrUnsafe ◾ x_45;
> dec x_45;
> let x_94 : usize := ptrAddrUnsafe ◾ x_82;
> let x_95 : u8 := USize.decEq x_93 x_94;
> case x_95 : u8 of
222,225c276,279
< let x_83 : obj := reset[2] x_1;
< let x_84 : obj := reuse x_83 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_72;
< let x_85 : obj := ctor_0[EStateM.Result.ok] x_84 x_73;
< ret x_85
---
> dec x_1;
> let x_96 : obj := reuse! x_87 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_82 x_85;
> let x_97 : obj := ctor_0[EStateM.Result.ok] x_96 x_86;
> ret x_97
227,247c281,296
< dec x_72;
< dec x_53;
< let x_86 : obj := ctor_0[EStateM.Result.ok] x_1 x_73;
< ret x_86
< EStateM.Result.error →
< dec x_53;
< dec x_45;
< dec x_44;
< dec x_1;
< let x_87 : u8 := isShared x_55;
< case x_87 : u8 of
< Bool.false →
< ret x_55
< Bool.true →
< let x_88 : obj := proj[0] x_55;
< let x_89 : obj := proj[1] x_55;
< inc x_89;
< inc x_88;
< dec x_55;
< let x_90 : obj := ctor_1[EStateM.Result.error] x_88 x_89;
< ret x_90
---
> dec x_85;
> dec x_82;
> let x_98 : obj := reuse x_87 in ctor_0[EStateM.Result.ok] x_1 x_86;
> ret x_98
> EStateM.Result.error →
> dec x_82;
> dec x_46;
> dec x_45;
> dec x_1;
> let x_99 : obj := proj[0] x_84;
> inc x_99;
> let x_100 : obj := proj[1] x_84;
> inc x_100;
> let x_101 : obj := reset[2] x_84;
> let x_102 : obj := reuse x_101 in ctor_1[EStateM.Result.error] x_99 x_100;
> ret x_102
248a298
> dec x_46;
250d299
< dec x_44;
257,258c306,307
< let x_91 : u8 := isShared x_47;
< case x_91 : u8 of
---
> let x_103 : u8 := isShared x_48;
> case x_103 : u8 of
260c309
< ret x_47
---
> ret x_48
262,268c311,317
< let x_92 : obj := proj[0] x_47;
< let x_93 : obj := proj[1] x_47;
< inc x_93;
< inc x_92;
< dec x_47;
< let x_94 : obj := ctor_1[EStateM.Result.error] x_92 x_93;
< ret x_94
---
> let x_104 : obj := proj[0] x_48;
> let x_105 : obj := proj[1] x_48;
> inc x_105;
> inc x_104;
> dec x_48;
> let x_106 : obj := ctor_1[EStateM.Result.error] x_104 x_105;
> ret x_106
270,278c319,327
< let x_95 : obj := proj[0] x_1;
< inc x_95;
< let x_96 : obj := proj[1] x_1;
< inc x_96;
< let x_97 : obj := proj[0] x_95;
< inc x_97;
< let x_98 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_97;
< dec x_97;
< case x_98 : obj of
---
> let x_107 : obj := proj[0] x_1;
> inc x_107;
> let x_108 : obj := proj[1] x_1;
> inc x_108;
> let x_109 : obj := proj[0] x_107;
> inc x_109;
> let x_110 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_109;
> dec x_109;
> case x_110 : obj of
280,282c329,331
< inc x_96;
< let x_99 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_96 x_2 x_3 x_4 x_5 x_6 x_7;
< case x_99 : obj of
---
> inc x_108;
> let x_111 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_108 x_2 x_3 x_4 x_5 x_6 x_7;
> case x_111 : obj of
284,285c333,334
< let x_100 : u8 := isShared x_99;
< case x_100 : u8 of
---
> let x_112 : u8 := isShared x_111;
> case x_112 : u8 of
287,292c336,342
< let x_101 : obj := proj[0] x_99;
< let x_102 : usize := ptrAddrUnsafe ◾ x_96;
< dec x_96;
< let x_103 : usize := ptrAddrUnsafe ◾ x_101;
< let x_104 : u8 := USize.decEq x_102 x_103;
< case x_104 : u8 of
---
> let x_113 : obj := proj[0] x_111;
> let x_114 : obj := proj[1] x_111;
> let x_115 : usize := ptrAddrUnsafe ◾ x_108;
> dec x_108;
> let x_116 : usize := ptrAddrUnsafe ◾ x_113;
> let x_117 : u8 := USize.decEq x_115 x_116;
> case x_117 : u8 of
294,295c344,345
< let x_105 : u8 := isShared x_1;
< case x_105 : u8 of
---
> let x_118 : u8 := isShared x_1;
> case x_118 : u8 of
297,303c347,357
< let x_106 : obj := proj[1] x_1;
< dec x_106;
< let x_107 : obj := proj[0] x_1;
< dec x_107;
< set x_1[1] := x_101;
< set x_99[0] := x_1;
< ret x_99
---
> let x_119 : obj := proj[1] x_1;
> dec x_119;
> let x_120 : obj := proj[0] x_1;
> dec x_120;
> setTag x_111 := 2;
> set x_111[1] := x_113;
> set x_111[0] := x_107;
> setTag x_1 := 0;
> set x_1[1] := x_114;
> set x_1[0] := x_111;
> ret x_1
306,308c360,364
< let x_108 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_101;
< set x_99[0] := x_108;
< ret x_99
---
> setTag x_111 := 2;
> set x_111[1] := x_113;
> set x_111[0] := x_107;
> let x_121 : obj := ctor_0[EStateM.Result.ok] x_111 x_114;
> ret x_121
310,312c366,368
< let x_109 : usize := ptrAddrUnsafe ◾ x_95;
< let x_110 : u8 := USize.decEq x_109 x_109;
< case x_110 : u8 of
---
> let x_122 : usize := ptrAddrUnsafe ◾ x_107;
> let x_123 : u8 := USize.decEq x_122 x_122;
> case x_123 : u8 of
314,315c370,371
< let x_111 : u8 := isShared x_1;
< case x_111 : u8 of
---
> let x_124 : u8 := isShared x_1;
> case x_124 : u8 of
317,323c373,383
< let x_112 : obj := proj[1] x_1;
< dec x_112;
< let x_113 : obj := proj[0] x_1;
< dec x_113;
< set x_1[1] := x_101;
< set x_99[0] := x_1;
< ret x_99
---
> let x_125 : obj := proj[1] x_1;
> dec x_125;
> let x_126 : obj := proj[0] x_1;
> dec x_126;
> setTag x_111 := 2;
> set x_111[1] := x_113;
> set x_111[0] := x_107;
> setTag x_1 := 0;
> set x_1[1] := x_114;
> set x_1[0] := x_111;
> ret x_1
326,328c386,390
< let x_114 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_101;
< set x_99[0] := x_114;
< ret x_99
---
> setTag x_111 := 2;
> set x_111[1] := x_113;
> set x_111[0] := x_107;
> let x_127 : obj := ctor_0[EStateM.Result.ok] x_111 x_114;
> ret x_127
330,333c392,395
< dec x_101;
< dec x_95;
< set x_99[0] := x_1;
< ret x_99
---
> dec x_113;
> dec x_107;
> set x_111[0] := x_1;
> ret x_111
335,344c397,406
< let x_115 : obj := proj[0] x_99;
< let x_116 : obj := proj[1] x_99;
< inc x_116;
< inc x_115;
< dec x_99;
< let x_117 : usize := ptrAddrUnsafe ◾ x_96;
< dec x_96;
< let x_118 : usize := ptrAddrUnsafe ◾ x_115;
< let x_119 : u8 := USize.decEq x_117 x_118;
< case x_119 : u8 of
---
> let x_128 : obj := proj[0] x_111;
> let x_129 : obj := proj[1] x_111;
> inc x_129;
> inc x_128;
> dec x_111;
> let x_130 : usize := ptrAddrUnsafe ◾ x_108;
> dec x_108;
> let x_131 : usize := ptrAddrUnsafe ◾ x_128;
> let x_132 : u8 := USize.decEq x_130 x_131;
> case x_132 : u8 of
346,349c408,411
< let x_120 : obj := reset[2] x_1;
< let x_121 : obj := reuse x_120 in ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_115;
< let x_122 : obj := ctor_0[EStateM.Result.ok] x_121 x_116;
< ret x_122
---
> let x_133 : obj := reset[2] x_1;
> let x_134 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_107 x_128;
> let x_135 : obj := reuse! x_133 in ctor_0[EStateM.Result.ok] x_134 x_129;
> ret x_135
351,353c413,415
< let x_123 : usize := ptrAddrUnsafe ◾ x_95;
< let x_124 : u8 := USize.decEq x_123 x_123;
< case x_124 : u8 of
---
> let x_136 : usize := ptrAddrUnsafe ◾ x_107;
> let x_137 : u8 := USize.decEq x_136 x_136;
> case x_137 : u8 of
355,358c417,420
< let x_125 : obj := reset[2] x_1;
< let x_126 : obj := reuse x_125 in ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_115;
< let x_127 : obj := ctor_0[EStateM.Result.ok] x_126 x_116;
< ret x_127
---
> let x_138 : obj := reset[2] x_1;
> let x_139 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_107 x_128;
> let x_140 : obj := reuse! x_138 in ctor_0[EStateM.Result.ok] x_139 x_129;
> ret x_140
360,363c422,425
< dec x_115;
< dec x_95;
< let x_128 : obj := ctor_0[EStateM.Result.ok] x_1 x_116;
< ret x_128
---
> dec x_128;
> dec x_107;
> let x_141 : obj := ctor_0[EStateM.Result.ok] x_1 x_129;
> ret x_141
365,366c427,428
< dec x_96;
< dec x_95;
---
> dec x_108;
> dec x_107;
368,369c430,431
< let x_129 : u8 := isShared x_99;
< case x_129 : u8 of
---
> let x_142 : u8 := isShared x_111;
> case x_142 : u8 of
371c433
< ret x_99
---
> ret x_111
373,379c435,441
< let x_130 : obj := proj[0] x_99;
< let x_131 : obj := proj[1] x_99;
< inc x_131;
< inc x_130;
< dec x_99;
< let x_132 : obj := ctor_1[EStateM.Result.error] x_130 x_131;
< ret x_132
---
> let x_143 : obj := proj[0] x_111;
> let x_144 : obj := proj[1] x_111;
> inc x_144;
> inc x_143;
> dec x_111;
> let x_145 : obj := ctor_1[EStateM.Result.error] x_143 x_144;
> ret x_145
381,389c443,451
< let x_133 : obj := proj[0] x_98;
< inc x_133;
< dec x_98;
< let x_134 : obj := proj[2] x_95;
< inc x_134;
< let x_135 : obj := Array.size ◾ x_134;
< let x_136 : obj := 0;
< let x_137 : u8 := Nat.decLt x_136 x_135;
< case x_137 : u8 of
---
> let x_146 : obj := proj[0] x_110;
> inc x_146;
> dec x_110;
> let x_147 : obj := proj[2] x_107;
> inc x_147;
> let x_148 : obj := Array.size ◾ x_147;
> let x_149 : obj := 0;
> let x_150 : u8 := Nat.decLt x_149 x_148;
> case x_150 : u8 of
391,393c453,455
< dec x_134;
< let x_138 : obj := proj[4] x_95;
< inc x_138;
---
> dec x_147;
> let x_151 : obj := proj[4] x_107;
> inc x_151;
399,400c461,462
< let x_139 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_138 x_2 x_3 x_4 x_5 x_6 x_7;
< case x_139 : obj of
---
> let x_152 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_151 x_2 x_3 x_4 x_5 x_6 x_7;
> case x_152 : obj of
402,407c464,469
< let x_140 : obj := proj[0] x_139;
< inc x_140;
< let x_141 : obj := proj[1] x_139;
< inc x_141;
< dec x_139;
< let x_142 : u8 := 0;
---
> let x_153 : obj := proj[0] x_152;
> inc x_153;
> let x_154 : obj := proj[1] x_152;
> inc x_154;
> dec x_152;
> let x_155 : u8 := 0;
412,413c474,475
< let x_143 : obj := Lean.Compiler.LCNF.normCodeImp x_142 x_140 x_133 x_3 x_4 x_5 x_6 x_141;
< case x_143 : obj of
---
> let x_156 : obj := Lean.Compiler.LCNF.normCodeImp x_155 x_153 x_146 x_3 x_4 x_5 x_6 x_154;
> case x_156 : obj of
415,424c477,486
< let x_144 : obj := proj[0] x_143;
< inc x_144;
< let x_145 : obj := proj[1] x_143;
< inc x_145;
< dec x_143;
< let x_146 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
< let x_147 : u8 := Nat.beq x_146 x_135;
< dec x_135;
< dec x_146;
< case x_147 : u8 of
---
> let x_157 : obj := proj[0] x_156;
> inc x_157;
> let x_158 : obj := proj[1] x_156;
> inc x_158;
> dec x_156;
> let x_159 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
> let x_160 : u8 := Nat.beq x_159 x_148;
> dec x_148;
> dec x_159;
> case x_160 : u8 of
430,432c492,494
< inc x_144;
< let x_148 : obj := Lean.Compiler.LCNF.Code.inferType x_144 x_3 x_4 x_5 x_6 x_145;
< case x_148 : obj of
---
> inc x_157;
> let x_161 : obj := Lean.Compiler.LCNF.Code.inferType x_157 x_3 x_4 x_5 x_6 x_158;
> case x_161 : obj of
434,439c496,501
< let x_149 : obj := proj[0] x_148;
< inc x_149;
< let x_150 : obj := proj[1] x_148;
< inc x_150;
< dec x_148;
< let x_151 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
---
> let x_162 : obj := proj[0] x_161;
> inc x_162;
> let x_163 : obj := proj[1] x_161;
> inc x_163;
> dec x_161;
> let x_164 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
444,446c506,508
< inc x_151;
< let x_152 : obj := Lean.Compiler.LCNF.mkForallParams x_151 x_149 x_3 x_4 x_5 x_6 x_150;
< case x_152 : obj of
---
> inc x_164;
> let x_165 : obj := Lean.Compiler.LCNF.mkForallParams x_164 x_162 x_3 x_4 x_5 x_6 x_163;
> case x_165 : obj of
448,454c510,516
< let x_153 : obj := proj[0] x_152;
< inc x_153;
< let x_154 : obj := proj[1] x_152;
< inc x_154;
< dec x_152;
< let x_155 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_151 x_144 x_1 x_153 x_2 x_3 x_4 x_5 x_6 x_154;
< ret x_155
---
> let x_166 : obj := proj[0] x_165;
> inc x_166;
> let x_167 : obj := proj[1] x_165;
> inc x_167;
> dec x_165;
> let x_168 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_164 x_157 x_1 x_166 x_2 x_3 x_4 x_5 x_6 x_167;
> ret x_168
456,459c518,521
< dec x_151;
< dec x_144;
< dec x_96;
< dec x_95;
---
> dec x_164;
> dec x_157;
> dec x_108;
> dec x_107;
466,467c528,529
< let x_156 : u8 := isShared x_152;
< case x_156 : u8 of
---
> let x_169 : u8 := isShared x_165;
> case x_169 : u8 of
469c531
< ret x_152
---
> ret x_165
471,477c533,539
< let x_157 : obj := proj[0] x_152;
< let x_158 : obj := proj[1] x_152;
< inc x_158;
< inc x_157;
< dec x_152;
< let x_159 : obj := ctor_1[EStateM.Result.error] x_157 x_158;
< ret x_159
---
> let x_170 : obj := proj[0] x_165;
> let x_171 : obj := proj[1] x_165;
> inc x_171;
> inc x_170;
> dec x_165;
> let x_172 : obj := ctor_1[EStateM.Result.error] x_170 x_171;
> ret x_172
479,481c541,543
< dec x_144;
< dec x_96;
< dec x_95;
---
> dec x_157;
> dec x_108;
> dec x_107;
488,489c550,551
< let x_160 : u8 := isShared x_148;
< case x_160 : u8 of
---
> let x_173 : u8 := isShared x_161;
> case x_173 : u8 of
491c553
< ret x_148
---
> ret x_161
493,499c555,561
< let x_161 : obj := proj[0] x_148;
< let x_162 : obj := proj[1] x_148;
< inc x_162;
< inc x_161;
< dec x_148;
< let x_163 : obj := ctor_1[EStateM.Result.error] x_161 x_162;
< ret x_163
---
> let x_174 : obj := proj[0] x_161;
> let x_175 : obj := proj[1] x_161;
> inc x_175;
> inc x_174;
> dec x_161;
> let x_176 : obj := ctor_1[EStateM.Result.error] x_174 x_175;
> ret x_176
501,505c563,567
< let x_164 : obj := proj[3] x_95;
< inc x_164;
< let x_165 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
< let x_166 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_165 x_144 x_1 x_164 x_2 x_3 x_4 x_5 x_6 x_145;
< ret x_166
---
> let x_177 : obj := proj[3] x_107;
> inc x_177;
> let x_178 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
> let x_179 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_178 x_157 x_1 x_177 x_2 x_3 x_4 x_5 x_6 x_158;
> ret x_179
507,509c569,571
< dec x_135;
< dec x_96;
< dec x_95;
---
> dec x_148;
> dec x_108;
> dec x_107;
516,517c578,579
< let x_167 : u8 := isShared x_143;
< case x_167 : u8 of
---
> let x_180 : u8 := isShared x_156;
> case x_180 : u8 of
519c581
< ret x_143
---
> ret x_156
521,527c583,589
< let x_168 : obj := proj[0] x_143;
< let x_169 : obj := proj[1] x_143;
< inc x_169;
< inc x_168;
< dec x_143;
< let x_170 : obj := ctor_1[EStateM.Result.error] x_168 x_169;
< ret x_170
---
> let x_181 : obj := proj[0] x_156;
> let x_182 : obj := proj[1] x_156;
> inc x_182;
> inc x_181;
> dec x_156;
> let x_183 : obj := ctor_1[EStateM.Result.error] x_181 x_182;
> ret x_183
529,532c591,594
< dec x_135;
< dec x_133;
< dec x_96;
< dec x_95;
---
> dec x_148;
> dec x_146;
> dec x_108;
> dec x_107;
539,540c601,602
< let x_171 : u8 := isShared x_139;
< case x_171 : u8 of
---
> let x_184 : u8 := isShared x_152;
> case x_184 : u8 of
542c604
< ret x_139
---
> ret x_152
544,550c606,612
< let x_172 : obj := proj[0] x_139;
< let x_173 : obj := proj[1] x_139;
< inc x_173;
< inc x_172;
< dec x_139;
< let x_174 : obj := ctor_1[EStateM.Result.error] x_172 x_173;
< ret x_174
---
> let x_185 : obj := proj[0] x_152;
> let x_186 : obj := proj[1] x_152;
> inc x_186;
> inc x_185;
> dec x_152;
> let x_187 : obj := ctor_1[EStateM.Result.error] x_185 x_186;
> ret x_187
552,553c614,615
< let x_175 : u8 := Nat.decLe x_135 x_135;
< case x_175 : u8 of
---
> let x_188 : u8 := Nat.decLe x_148 x_148;
> case x_188 : u8 of
555,557c617,619
< dec x_134;
< let x_176 : obj := proj[4] x_95;
< inc x_176;
---
> dec x_147;
> let x_189 : obj := proj[4] x_107;
> inc x_189;
563,564c625,626
< let x_177 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_176 x_2 x_3 x_4 x_5 x_6 x_7;
< case x_177 : obj of
---
> let x_190 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_189 x_2 x_3 x_4 x_5 x_6 x_7;
> case x_190 : obj of
566,571c628,633
< let x_178 : obj := proj[0] x_177;
< inc x_178;
< let x_179 : obj := proj[1] x_177;
< inc x_179;
< dec x_177;
< let x_180 : u8 := 0;
---
> let x_191 : obj := proj[0] x_190;
> inc x_191;
> let x_192 : obj := proj[1] x_190;
> inc x_192;
> dec x_190;
> let x_193 : u8 := 0;
576,577c638,639
< let x_181 : obj := Lean.Compiler.LCNF.normCodeImp x_180 x_178 x_133 x_3 x_4 x_5 x_6 x_179;
< case x_181 : obj of
---
> let x_194 : obj := Lean.Compiler.LCNF.normCodeImp x_193 x_191 x_146 x_3 x_4 x_5 x_6 x_192;
> case x_194 : obj of
579,588c641,650
< let x_182 : obj := proj[0] x_181;
< inc x_182;
< let x_183 : obj := proj[1] x_181;
< inc x_183;
< dec x_181;
< let x_184 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
< let x_185 : u8 := Nat.beq x_184 x_135;
< dec x_135;
< dec x_184;
< case x_185 : u8 of
---
> let x_195 : obj := proj[0] x_194;
> inc x_195;
> let x_196 : obj := proj[1] x_194;
> inc x_196;
> dec x_194;
> let x_197 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
> let x_198 : u8 := Nat.beq x_197 x_148;
> dec x_148;
> dec x_197;
> case x_198 : u8 of
594,596c656,658
< inc x_182;
< let x_186 : obj := Lean.Compiler.LCNF.Code.inferType x_182 x_3 x_4 x_5 x_6 x_183;
< case x_186 : obj of
---
> inc x_195;
> let x_199 : obj := Lean.Compiler.LCNF.Code.inferType x_195 x_3 x_4 x_5 x_6 x_196;
> case x_199 : obj of
598,603c660,665
< let x_187 : obj := proj[0] x_186;
< inc x_187;
< let x_188 : obj := proj[1] x_186;
< inc x_188;
< dec x_186;
< let x_189 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
---
> let x_200 : obj := proj[0] x_199;
> inc x_200;
> let x_201 : obj := proj[1] x_199;
> inc x_201;
> dec x_199;
> let x_202 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
608,610c670,672
< inc x_189;
< let x_190 : obj := Lean.Compiler.LCNF.mkForallParams x_189 x_187 x_3 x_4 x_5 x_6 x_188;
< case x_190 : obj of
---
> inc x_202;
> let x_203 : obj := Lean.Compiler.LCNF.mkForallParams x_202 x_200 x_3 x_4 x_5 x_6 x_201;
> case x_203 : obj of
612,618c674,680
< let x_191 : obj := proj[0] x_190;
< inc x_191;
< let x_192 : obj := proj[1] x_190;
< inc x_192;
< dec x_190;
< let x_193 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_189 x_182 x_1 x_191 x_2 x_3 x_4 x_5 x_6 x_192;
< ret x_193
---
> let x_204 : obj := proj[0] x_203;
> inc x_204;
> let x_205 : obj := proj[1] x_203;
> inc x_205;
> dec x_203;
> let x_206 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_202 x_195 x_1 x_204 x_2 x_3 x_4 x_5 x_6 x_205;
> ret x_206
620,623c682,685
< dec x_189;
< dec x_182;
< dec x_96;
< dec x_95;
---
> dec x_202;
> dec x_195;
> dec x_108;
> dec x_107;
630,631c692,693
< let x_194 : u8 := isShared x_190;
< case x_194 : u8 of
---
> let x_207 : u8 := isShared x_203;
> case x_207 : u8 of
633c695
< ret x_190
---
> ret x_203
635,641c697,703
< let x_195 : obj := proj[0] x_190;
< let x_196 : obj := proj[1] x_190;
< inc x_196;
< inc x_195;
< dec x_190;
< let x_197 : obj := ctor_1[EStateM.Result.error] x_195 x_196;
< ret x_197
---
> let x_208 : obj := proj[0] x_203;
> let x_209 : obj := proj[1] x_203;
> inc x_209;
> inc x_208;
> dec x_203;
> let x_210 : obj := ctor_1[EStateM.Result.error] x_208 x_209;
> ret x_210
643,645c705,707
< dec x_182;
< dec x_96;
< dec x_95;
---
> dec x_195;
> dec x_108;
> dec x_107;
652,653c714,715
< let x_198 : u8 := isShared x_186;
< case x_198 : u8 of
---
> let x_211 : u8 := isShared x_199;
> case x_211 : u8 of
655c717
< ret x_186
---
> ret x_199
657,663c719,725
< let x_199 : obj := proj[0] x_186;
< let x_200 : obj := proj[1] x_186;
< inc x_200;
< inc x_199;
< dec x_186;
< let x_201 : obj := ctor_1[EStateM.Result.error] x_199 x_200;
< ret x_201
---
> let x_212 : obj := proj[0] x_199;
> let x_213 : obj := proj[1] x_199;
> inc x_213;
> inc x_212;
> dec x_199;
> let x_214 : obj := ctor_1[EStateM.Result.error] x_212 x_213;
> ret x_214
665,669c727,731
< let x_202 : obj := proj[3] x_95;
< inc x_202;
< let x_203 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
< let x_204 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_203 x_182 x_1 x_202 x_2 x_3 x_4 x_5 x_6 x_183;
< ret x_204
---
> let x_215 : obj := proj[3] x_107;
> inc x_215;
> let x_216 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
> let x_217 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_216 x_195 x_1 x_215 x_2 x_3 x_4 x_5 x_6 x_196;
> ret x_217
671,673c733,735
< dec x_135;
< dec x_96;
< dec x_95;
---
> dec x_148;
> dec x_108;
> dec x_107;
680,681c742,743
< let x_205 : u8 := isShared x_181;
< case x_205 : u8 of
---
> let x_218 : u8 := isShared x_194;
> case x_218 : u8 of
683c745
< ret x_181
---
> ret x_194
685,691c747,753
< let x_206 : obj := proj[0] x_181;
< let x_207 : obj := proj[1] x_181;
< inc x_207;
< inc x_206;
< dec x_181;
< let x_208 : obj := ctor_1[EStateM.Result.error] x_206 x_207;
< ret x_208
---
> let x_219 : obj := proj[0] x_194;
> let x_220 : obj := proj[1] x_194;
> inc x_220;
> inc x_219;
> dec x_194;
> let x_221 : obj := ctor_1[EStateM.Result.error] x_219 x_220;
> ret x_221
693,696c755,758
< dec x_135;
< dec x_133;
< dec x_96;
< dec x_95;
---
> dec x_148;
> dec x_146;
> dec x_108;
> dec x_107;
703,704c765,766
< let x_209 : u8 := isShared x_177;
< case x_209 : u8 of
---
> let x_222 : u8 := isShared x_190;
> case x_222 : u8 of
706c768
< ret x_177
---
> ret x_190
708,714c770,776
< let x_210 : obj := proj[0] x_177;
< let x_211 : obj := proj[1] x_177;
< inc x_211;
< inc x_210;
< dec x_177;
< let x_212 : obj := ctor_1[EStateM.Result.error] x_210 x_211;
< ret x_212
---
> let x_223 : obj := proj[0] x_190;
> let x_224 : obj := proj[1] x_190;
> inc x_224;
> inc x_223;
> dec x_190;
> let x_225 : obj := ctor_1[EStateM.Result.error] x_223 x_224;
> ret x_225
716,727c778,789
< let x_213 : usize := 0;
< let x_214 : usize := USize.ofNat x_135;
< let x_215 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
< let x_216 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 x_133 x_134 x_213 x_214 x_215 x_2 x_3 x_4 x_5 x_6 x_7;
< dec x_134;
< let x_217 : obj := proj[0] x_216;
< inc x_217;
< let x_218 : obj := proj[1] x_216;
< inc x_218;
< dec x_216;
< let x_219 : obj := proj[4] x_95;
< inc x_219;
---
> let x_226 : usize := 0;
> let x_227 : usize := USize.ofNat x_148;
> let x_228 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
> let x_229 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 x_146 x_147 x_226 x_227 x_228 x_2 x_3 x_4 x_5 x_6 x_7;
> dec x_147;
> let x_230 : obj := proj[0] x_229;
> inc x_230;
> let x_231 : obj := proj[1] x_229;
> inc x_231;
> dec x_229;
> let x_232 : obj := proj[4] x_107;
> inc x_232;
733,734c795,796
< let x_220 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_219 x_2 x_3 x_4 x_5 x_6 x_218;
< case x_220 : obj of
---
> let x_233 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_232 x_2 x_3 x_4 x_5 x_6 x_231;
> case x_233 : obj of
736,741c798,803
< let x_221 : obj := proj[0] x_220;
< inc x_221;
< let x_222 : obj := proj[1] x_220;
< inc x_222;
< dec x_220;
< let x_223 : u8 := 0;
---
> let x_234 : obj := proj[0] x_233;
> inc x_234;
> let x_235 : obj := proj[1] x_233;
> inc x_235;
> dec x_233;
> let x_236 : u8 := 0;
746,747c808,809
< let x_224 : obj := Lean.Compiler.LCNF.normCodeImp x_223 x_221 x_133 x_3 x_4 x_5 x_6 x_222;
< case x_224 : obj of
---
> let x_237 : obj := Lean.Compiler.LCNF.normCodeImp x_236 x_234 x_146 x_3 x_4 x_5 x_6 x_235;
> case x_237 : obj of
749,758c811,820
< let x_225 : obj := proj[0] x_224;
< inc x_225;
< let x_226 : obj := proj[1] x_224;
< inc x_226;
< dec x_224;
< let x_227 : obj := Array.size ◾ x_217;
< let x_228 : u8 := Nat.beq x_227 x_135;
< dec x_135;
< dec x_227;
< case x_228 : u8 of
---
> let x_238 : obj := proj[0] x_237;
> inc x_238;
> let x_239 : obj := proj[1] x_237;
> inc x_239;
> dec x_237;
> let x_240 : obj := Array.size ◾ x_230;
> let x_241 : u8 := Nat.beq x_240 x_148;
> dec x_148;
> dec x_240;
> case x_241 : u8 of
764,766c826,828
< inc x_225;
< let x_229 : obj := Lean.Compiler.LCNF.Code.inferType x_225 x_3 x_4 x_5 x_6 x_226;
< case x_229 : obj of
---
> inc x_238;
> let x_242 : obj := Lean.Compiler.LCNF.Code.inferType x_238 x_3 x_4 x_5 x_6 x_239;
> case x_242 : obj of
768,772c830,834
< let x_230 : obj := proj[0] x_229;
< inc x_230;
< let x_231 : obj := proj[1] x_229;
< inc x_231;
< dec x_229;
---
> let x_243 : obj := proj[0] x_242;
> inc x_243;
> let x_244 : obj := proj[1] x_242;
> inc x_244;
> dec x_242;
777,779c839,841
< inc x_217;
< let x_232 : obj := Lean.Compiler.LCNF.mkForallParams x_217 x_230 x_3 x_4 x_5 x_6 x_231;
< case x_232 : obj of
---
> inc x_230;
> let x_245 : obj := Lean.Compiler.LCNF.mkForallParams x_230 x_243 x_3 x_4 x_5 x_6 x_244;
> case x_245 : obj of
781,787c843,849
< let x_233 : obj := proj[0] x_232;
< inc x_233;
< let x_234 : obj := proj[1] x_232;
< inc x_234;
< dec x_232;
< let x_235 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_217 x_225 x_1 x_233 x_2 x_3 x_4 x_5 x_6 x_234;
< ret x_235
---
> let x_246 : obj := proj[0] x_245;
> inc x_246;
> let x_247 : obj := proj[1] x_245;
> inc x_247;
> dec x_245;
> let x_248 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_230 x_238 x_1 x_246 x_2 x_3 x_4 x_5 x_6 x_247;
> ret x_248
789,792c851,854
< dec x_225;
< dec x_217;
< dec x_96;
< dec x_95;
---
> dec x_238;
> dec x_230;
> dec x_108;
> dec x_107;
799,800c861,862
< let x_236 : u8 := isShared x_232;
< case x_236 : u8 of
---
> let x_249 : u8 := isShared x_245;
> case x_249 : u8 of
802c864
< ret x_232
---
> ret x_245
804,810c866,872
< let x_237 : obj := proj[0] x_232;
< let x_238 : obj := proj[1] x_232;
< inc x_238;
< inc x_237;
< dec x_232;
< let x_239 : obj := ctor_1[EStateM.Result.error] x_237 x_238;
< ret x_239
---
> let x_250 : obj := proj[0] x_245;
> let x_251 : obj := proj[1] x_245;
> inc x_251;
> inc x_250;
> dec x_245;
> let x_252 : obj := ctor_1[EStateM.Result.error] x_250 x_251;
> ret x_252
812,815c874,877
< dec x_225;
< dec x_217;
< dec x_96;
< dec x_95;
---
> dec x_238;
> dec x_230;
> dec x_108;
> dec x_107;
822,823c884,885
< let x_240 : u8 := isShared x_229;
< case x_240 : u8 of
---
> let x_253 : u8 := isShared x_242;
> case x_253 : u8 of
825c887
< ret x_229
---
> ret x_242
827,833c889,895
< let x_241 : obj := proj[0] x_229;
< let x_242 : obj := proj[1] x_229;
< inc x_242;
< inc x_241;
< dec x_229;
< let x_243 : obj := ctor_1[EStateM.Result.error] x_241 x_242;
< ret x_243
---
> let x_254 : obj := proj[0] x_242;
> let x_255 : obj := proj[1] x_242;
> inc x_255;
> inc x_254;
> dec x_242;
> let x_256 : obj := ctor_1[EStateM.Result.error] x_254 x_255;
> ret x_256
835,838c897,900
< let x_244 : obj := proj[3] x_95;
< inc x_244;
< let x_245 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_217 x_225 x_1 x_244 x_2 x_3 x_4 x_5 x_6 x_226;
< ret x_245
---
> let x_257 : obj := proj[3] x_107;
> inc x_257;
> let x_258 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_230 x_238 x_1 x_257 x_2 x_3 x_4 x_5 x_6 x_239;
> ret x_258
840,843c902,905
< dec x_217;
< dec x_135;
< dec x_96;
< dec x_95;
---
> dec x_230;
> dec x_148;
> dec x_108;
> dec x_107;
850,851c912,913
< let x_246 : u8 := isShared x_224;
< case x_246 : u8 of
---
> let x_259 : u8 := isShared x_237;
> case x_259 : u8 of
853c915
< ret x_224
---
> ret x_237
855,861c917,923
< let x_247 : obj := proj[0] x_224;
< let x_248 : obj := proj[1] x_224;
< inc x_248;
< inc x_247;
< dec x_224;
< let x_249 : obj := ctor_1[EStateM.Result.error] x_247 x_248;
< ret x_249
---
> let x_260 : obj := proj[0] x_237;
> let x_261 : obj := proj[1] x_237;
> inc x_261;
> inc x_260;
> dec x_237;
> let x_262 : obj := ctor_1[EStateM.Result.error] x_260 x_261;
> ret x_262
863,867c925,929
< dec x_217;
< dec x_135;
< dec x_133;
< dec x_96;
< dec x_95;
---
> dec x_230;
> dec x_148;
> dec x_146;
> dec x_108;
> dec x_107;
874,875c936,937
< let x_250 : u8 := isShared x_220;
< case x_250 : u8 of
---
> let x_263 : u8 := isShared x_233;
> case x_263 : u8 of
877c939
< ret x_220
---
> ret x_233
879,885c941,947
< let x_251 : obj := proj[0] x_220;
< let x_252 : obj := proj[1] x_220;
< inc x_252;
< inc x_251;
< dec x_220;
< let x_253 : obj := ctor_1[EStateM.Result.error] x_251 x_252;
< ret x_253
---
> let x_264 : obj := proj[0] x_233;
> let x_265 : obj := proj[1] x_233;
> inc x_265;
> inc x_264;
> dec x_233;
> let x_266 : obj := ctor_1[EStateM.Result.error] x_264 x_265;
> ret x_266
887,892c949,954
< let x_254 : obj := proj[0] x_1;
< inc x_254;
< let x_255 : obj := proj[1] x_1;
< inc x_255;
< block_299 (x_256 : obj) (x_257 : obj) (x_258 : obj) :=
< block_286 (x_259 : obj) :=
---
> let x_267 : obj := proj[0] x_1;
> inc x_267;
> let x_268 : obj := proj[1] x_1;
> inc x_268;
> block_333 (x_269 : obj) (x_270 : obj) (x_271 : obj) :=
> block_320 (x_272 : obj) :=
893a956,976
> Lean.Compiler.LCNF.Code.let →
> dec x_272;
> dec x_267;
> let x_273 : u8 := isShared x_1;
> case x_273 : u8 of
> Bool.false →
> let x_274 : obj := proj[1] x_1;
> dec x_274;
> let x_275 : obj := proj[0] x_1;
> dec x_275;
> let x_276 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
> let x_277 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_276;
> set x_1[1] := x_271;
> set x_1[0] := x_277;
> ret x_1
> Bool.true →
> dec x_1;
> let x_278 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
> let x_279 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_278;
> let x_280 : obj := ctor_0[EStateM.Result.ok] x_279 x_271;
> ret x_280
895,906c978,989
< let x_260 : obj := proj[0] x_1;
< inc x_260;
< let x_261 : obj := proj[1] x_1;
< inc x_261;
< let x_262 : obj := Array.size ◾ x_259;
< let x_263 : usize := USize.ofNat x_262;
< dec x_262;
< let x_264 : usize := 0;
< let x_265 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_3 x_263 x_264 x_259;
< let x_266 : u8 := Lean.Name.beq x_260 x_254;
< dec x_260;
< case x_266 : u8 of
---
> let x_281 : obj := proj[0] x_1;
> inc x_281;
> let x_282 : obj := proj[1] x_1;
> inc x_282;
> let x_283 : obj := Array.size ◾ x_272;
> let x_284 : usize := USize.ofNat x_283;
> dec x_283;
> let x_285 : usize := 0;
> let x_286 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_3 x_284 x_285 x_272;
> let x_287 : u8 := Lean.Name.beq x_281 x_267;
> dec x_281;
> case x_287 : u8 of
908,910c991,993
< dec x_261;
< let x_267 : u8 := isShared x_1;
< case x_267 : u8 of
---
> dec x_282;
> let x_288 : u8 := isShared x_1;
> case x_288 : u8 of
912,918c995,1015
< let x_268 : obj := proj[1] x_1;
< dec x_268;
< let x_269 : obj := proj[0] x_1;
< dec x_269;
< set x_1[1] := x_265;
< let x_270 : obj := ctor_0[EStateM.Result.ok] x_1 x_258;
< ret x_270
---
> let x_289 : obj := proj[1] x_1;
> dec x_289;
> let x_290 : obj := proj[0] x_1;
> dec x_290;
> let x_291 : u8 := isShared x_1;
> case x_291 : u8 of
> Bool.false →
> let x_292 : obj := proj[1] x_1;
> dec x_292;
> let x_293 : obj := proj[0] x_1;
> dec x_293;
> set x_1[1] := x_286;
> setTag x_1 := 0;
> set x_1[1] := x_271;
> set x_1[0] := x_1;
> ret x_1
> Bool.true →
> dec x_1;
> set x_1[1] := x_286;
> let x_294 : obj := ctor_0[EStateM.Result.ok] x_1 x_271;
> ret x_294
921,923c1018,1021
< let x_271 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_254 x_265;
< let x_272 : obj := ctor_0[EStateM.Result.ok] x_271 x_258;
< ret x_272
---
> let x_295 : obj := reset[2] x_1;
> let x_296 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_267 x_286;
> let x_297 : obj := reuse! x_295 in ctor_0[EStateM.Result.ok] x_296 x_271;
> ret x_297
925,929c1023,1027
< let x_273 : usize := ptrAddrUnsafe ◾ x_261;
< dec x_261;
< let x_274 : usize := ptrAddrUnsafe ◾ x_265;
< let x_275 : u8 := USize.decEq x_273 x_274;
< case x_275 : u8 of
---
> let x_298 : usize := ptrAddrUnsafe ◾ x_282;
> dec x_282;
> let x_299 : usize := ptrAddrUnsafe ◾ x_286;
> let x_300 : u8 := USize.decEq x_298 x_299;
> case x_300 : u8 of
931,932c1029,1030
< let x_276 : u8 := isShared x_1;
< case x_276 : u8 of
---
> let x_301 : u8 := isShared x_1;
> case x_301 : u8 of
934,940c1032,1052
< let x_277 : obj := proj[1] x_1;
< dec x_277;
< let x_278 : obj := proj[0] x_1;
< dec x_278;
< set x_1[1] := x_265;
< let x_279 : obj := ctor_0[EStateM.Result.ok] x_1 x_258;
< ret x_279
---
> let x_302 : obj := proj[1] x_1;
> dec x_302;
> let x_303 : obj := proj[0] x_1;
> dec x_303;
> let x_304 : u8 := isShared x_1;
> case x_304 : u8 of
> Bool.false →
> let x_305 : obj := proj[1] x_1;
> dec x_305;
> let x_306 : obj := proj[0] x_1;
> dec x_306;
> set x_1[1] := x_286;
> setTag x_1 := 0;
> set x_1[1] := x_271;
> set x_1[0] := x_1;
> ret x_1
> Bool.true →
> dec x_1;
> set x_1[1] := x_286;
> let x_307 : obj := ctor_0[EStateM.Result.ok] x_1 x_271;
> ret x_307
943,945c1055,1058
< let x_280 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_254 x_265;
< let x_281 : obj := ctor_0[EStateM.Result.ok] x_280 x_258;
< ret x_281
---
> let x_308 : obj := reset[2] x_1;
> let x_309 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_267 x_286;
> let x_310 : obj := reuse! x_308 in ctor_0[EStateM.Result.ok] x_309 x_271;
> ret x_310
947,950c1060,1063
< dec x_265;
< dec x_254;
< let x_282 : obj := ctor_0[EStateM.Result.ok] x_1 x_258;
< ret x_282
---
> dec x_286;
> dec x_267;
> let x_311 : obj := ctor_0[EStateM.Result.ok] x_1 x_271;
> ret x_311
952,968c1065,1095
< dec x_259;
< dec x_254;
< dec x_1;
< let x_283 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
< let x_284 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_283;
< let x_285 : obj := ctor_0[EStateM.Result.ok] x_284 x_258;
< ret x_285;
< let x_287 : obj := proj[2] x_257;
< inc x_287;
< dec x_257;
< let x_288 : obj := Array.zip._rarg x_287 x_255;
< dec x_255;
< dec x_287;
< let x_289 : obj := Array.size ◾ x_288;
< let x_290 : obj := 0;
< let x_291 : u8 := Nat.decLt x_290 x_289;
< case x_291 : u8 of
---
> dec x_272;
> dec x_267;
> let x_312 : u8 := isShared x_1;
> case x_312 : u8 of
> Bool.false →
> let x_313 : obj := proj[1] x_1;
> dec x_313;
> let x_314 : obj := proj[0] x_1;
> dec x_314;
> let x_315 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
> let x_316 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_315;
> setTag x_1 := 0;
> set x_1[1] := x_271;
> set x_1[0] := x_316;
> ret x_1
> Bool.true →
> dec x_1;
> let x_317 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
> let x_318 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_317;
> let x_319 : obj := ctor_0[EStateM.Result.ok] x_318 x_271;
> ret x_319;
> let x_321 : obj := proj[2] x_270;
> inc x_321;
> dec x_270;
> let x_322 : obj := Array.zip._rarg x_321 x_268;
> dec x_268;
> dec x_321;
> let x_323 : obj := Array.size ◾ x_322;
> let x_324 : obj := 0;
> let x_325 : u8 := Nat.decLt x_324 x_323;
> case x_325 : u8 of
970,974c1097,1101
< dec x_289;
< dec x_288;
< dec x_256;
< let x_292 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
< jmp block_286 x_292
---
> dec x_323;
> dec x_322;
> dec x_269;
> let x_326 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
> jmp block_320 x_326
976,977c1103,1104
< let x_293 : u8 := Nat.decLe x_289 x_289;
< case x_293 : u8 of
---
> let x_327 : u8 := Nat.decLe x_323 x_323;
> case x_327 : u8 of
979,983c1106,1110
< dec x_289;
< dec x_288;
< dec x_256;
< let x_294 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
< jmp block_286 x_294
---
> dec x_323;
> dec x_322;
> dec x_269;
> let x_328 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
> jmp block_320 x_328
985,994c1112,1121
< let x_295 : usize := 0;
< let x_296 : usize := USize.ofNat x_289;
< dec x_289;
< let x_297 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
< let x_298 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_4 x_256 x_288 x_295 x_296 x_297;
< dec x_288;
< dec x_256;
< jmp block_286 x_298;
< inc x_254;
< let x_300 : obj := Lean.Compiler.LCNF.getFunDecl x_254 x_3 x_4 x_5 x_6 x_7;
---
> let x_329 : usize := 0;
> let x_330 : usize := USize.ofNat x_323;
> dec x_323;
> let x_331 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
> let x_332 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_4 x_269 x_322 x_329 x_330 x_331;
> dec x_322;
> dec x_269;
> jmp block_320 x_332;
> inc x_267;
> let x_334 : obj := Lean.Compiler.LCNF.getFunDecl x_267 x_3 x_4 x_5 x_6 x_7;
999c1126
< let x_301 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_254;
---
> let x_335 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_267;
1001c1128
< case x_301 : obj of
---
> case x_335 : obj of
1003c1130
< case x_300 : obj of
---
> case x_334 : obj of
1005,1012c1132,1139
< let x_302 : obj := proj[0] x_300;
< inc x_302;
< let x_303 : obj := proj[1] x_300;
< inc x_303;
< dec x_300;
< let x_304 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.isInJpScope._closed_3;
< let x_305 : obj := panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_5 x_304;
< jmp block_299 x_305 x_302 x_303
---
> let x_336 : obj := proj[0] x_334;
> inc x_336;
> let x_337 : obj := proj[1] x_334;
> inc x_337;
> dec x_334;
> let x_338 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.isInJpScope._closed_3;
> let x_339 : obj := panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_5 x_338;
> jmp block_333 x_339 x_336 x_337
1014,1015c1141,1142
< dec x_255;
< dec x_254;
---
> dec x_268;
> dec x_267;
1017,1018c1144,1145
< let x_306 : u8 := isShared x_300;
< case x_306 : u8 of
---
> let x_340 : u8 := isShared x_334;
> case x_340 : u8 of
1020c1147
< ret x_300
---
> ret x_334
1022,1028c1149,1155
< let x_307 : obj := proj[0] x_300;
< let x_308 : obj := proj[1] x_300;
< inc x_308;
< inc x_307;
< dec x_300;
< let x_309 : obj := ctor_1[EStateM.Result.error] x_307 x_308;
< ret x_309
---
> let x_341 : obj := proj[0] x_334;
> let x_342 : obj := proj[1] x_334;
> inc x_342;
> inc x_341;
> dec x_334;
> let x_343 : obj := ctor_1[EStateM.Result.error] x_341 x_342;
> ret x_343
1030c1157
< case x_300 : obj of
---
> case x_334 : obj of
1032,1040c1159,1167
< let x_310 : obj := proj[0] x_301;
< inc x_310;
< dec x_301;
< let x_311 : obj := proj[0] x_300;
< inc x_311;
< let x_312 : obj := proj[1] x_300;
< inc x_312;
< dec x_300;
< jmp block_299 x_310 x_311 x_312
---
> let x_344 : obj := proj[0] x_335;
> inc x_344;
> dec x_335;
> let x_345 : obj := proj[0] x_334;
> inc x_345;
> let x_346 : obj := proj[1] x_334;
> inc x_346;
> dec x_334;
> jmp block_333 x_344 x_345 x_346
1042,1044c1169,1171
< dec x_301;
< dec x_255;
< dec x_254;
---
> dec x_335;
> dec x_268;
> dec x_267;
1046,1047c1173,1174
< let x_313 : u8 := isShared x_300;
< case x_313 : u8 of
---
> let x_347 : u8 := isShared x_334;
> case x_347 : u8 of
1049c1176
< ret x_300
---
> ret x_334
1051,1057c1178,1184
< let x_314 : obj := proj[0] x_300;
< let x_315 : obj := proj[1] x_300;
< inc x_315;
< inc x_314;
< dec x_300;
< let x_316 : obj := ctor_1[EStateM.Result.error] x_314 x_315;
< ret x_316
---
> let x_348 : obj := proj[0] x_334;
> let x_349 : obj := proj[1] x_334;
> inc x_349;
> inc x_348;
> dec x_334;
> let x_350 : obj := ctor_1[EStateM.Result.error] x_348 x_349;
> ret x_350
1059,1062c1186,1189
< let x_317 : obj := proj[0] x_1;
< inc x_317;
< let x_318 : u8 := isShared x_317;
< case x_318 : u8 of
---
> let x_351 : obj := proj[0] x_1;
> inc x_351;
> let x_352 : u8 := isShared x_351;
> case x_352 : u8 of
1064,1074c1191,1201
< let x_319 : obj := proj[0] x_317;
< let x_320 : obj := proj[1] x_317;
< let x_321 : obj := proj[2] x_317;
< let x_322 : obj := proj[3] x_317;
< let x_323 : obj := Array.size ◾ x_322;
< let x_324 : usize := USize.ofNat x_323;
< dec x_323;
< let x_325 : usize := 0;
< inc x_322;
< let x_326 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_324 x_325 x_322 x_2 x_3 x_4 x_5 x_6 x_7;
< case x_326 : obj of
---
> let x_353 : obj := proj[0] x_351;
> let x_354 : obj := proj[1] x_351;
> let x_355 : obj := proj[2] x_351;
> let x_356 : obj := proj[3] x_351;
> let x_357 : obj := Array.size ◾ x_356;
> let x_358 : usize := USize.ofNat x_357;
> dec x_357;
> let x_359 : usize := 0;
> inc x_356;
> let x_360 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_358 x_359 x_356 x_2 x_3 x_4 x_5 x_6 x_7;
> case x_360 : obj of
1076,1077c1203,1204
< let x_327 : u8 := isShared x_326;
< case x_327 : u8 of
---
> let x_361 : u8 := isShared x_360;
> case x_361 : u8 of
1079,1084c1206,1211
< let x_328 : obj := proj[0] x_326;
< let x_329 : usize := ptrAddrUnsafe ◾ x_322;
< dec x_322;
< let x_330 : usize := ptrAddrUnsafe ◾ x_328;
< let x_331 : u8 := USize.decEq x_329 x_330;
< case x_331 : u8 of
---
> let x_362 : obj := proj[0] x_360;
> let x_363 : usize := ptrAddrUnsafe ◾ x_356;
> dec x_356;
> let x_364 : usize := ptrAddrUnsafe ◾ x_362;
> let x_365 : u8 := USize.decEq x_363 x_364;
> case x_365 : u8 of
1086,1087c1213,1214
< let x_332 : u8 := isShared x_1;
< case x_332 : u8 of
---
> let x_366 : u8 := isShared x_1;
> case x_366 : u8 of
1089,1093c1216,1220
< let x_333 : obj := proj[0] x_1;
< dec x_333;
< set x_317[3] := x_328;
< set x_326[0] := x_1;
< ret x_326
---
> let x_367 : obj := proj[0] x_1;
> dec x_367;
> set x_351[3] := x_362;
> set x_360[0] := x_1;
> ret x_360
1096,1099c1223,1226
< set x_317[3] := x_328;
< let x_334 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
< set x_326[0] := x_334;
< ret x_326
---
> set x_351[3] := x_362;
> let x_368 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
> set x_360[0] := x_368;
> ret x_360
1101,1103c1228,1230
< let x_335 : usize := ptrAddrUnsafe ◾ x_320;
< let x_336 : u8 := USize.decEq x_335 x_335;
< case x_336 : u8 of
---
> let x_369 : usize := ptrAddrUnsafe ◾ x_354;
> let x_370 : u8 := USize.decEq x_369 x_369;
> case x_370 : u8 of
1105,1106c1232,1233
< let x_337 : u8 := isShared x_1;
< case x_337 : u8 of
---
> let x_371 : u8 := isShared x_1;
> case x_371 : u8 of
1108,1112c1235,1239
< let x_338 : obj := proj[0] x_1;
< dec x_338;
< set x_317[3] := x_328;
< set x_326[0] := x_1;
< ret x_326
---
> let x_372 : obj := proj[0] x_1;
> dec x_372;
> set x_351[3] := x_362;
> set x_360[0] := x_1;
> ret x_360
1115,1118c1242,1245
< set x_317[3] := x_328;
< let x_339 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
< set x_326[0] := x_339;
< ret x_326
---
> set x_351[3] := x_362;
> let x_373 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
> set x_360[0] := x_373;
> ret x_360
1120,1121c1247,1248
< let x_340 : u8 := Lean.Name.beq x_321 x_321;
< case x_340 : u8 of
---
> let x_374 : u8 := Lean.Name.beq x_355 x_355;
> case x_374 : u8 of
1123,1124c1250,1251
< let x_341 : u8 := isShared x_1;
< case x_341 : u8 of
---
> let x_375 : u8 := isShared x_1;
> case x_375 : u8 of
1126,1130c1253,1257
< let x_342 : obj := proj[0] x_1;
< dec x_342;
< set x_317[3] := x_328;
< set x_326[0] := x_1;
< ret x_326
---
> let x_376 : obj := proj[0] x_1;
> dec x_376;
> set x_351[3] := x_362;
> set x_360[0] := x_1;
> ret x_360
1133,1136c1260,1263
< set x_317[3] := x_328;
< let x_343 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
< set x_326[0] := x_343;
< ret x_326
---
> set x_351[3] := x_362;
> let x_377 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
> set x_360[0] := x_377;
> ret x_360
1138,1144c1265,1271
< dec x_328;
< del x_317;
< dec x_321;
< dec x_320;
< dec x_319;
< set x_326[0] := x_1;
< ret x_326
---
> dec x_362;
> del x_351;
> dec x_355;
> dec x_354;
> dec x_353;
> set x_360[0] := x_1;
> ret x_360
1146,1155c1273,1282
< let x_344 : obj := proj[0] x_326;
< let x_345 : obj := proj[1] x_326;
< inc x_345;
< inc x_344;
< dec x_326;
< let x_346 : usize := ptrAddrUnsafe ◾ x_322;
< dec x_322;
< let x_347 : usize := ptrAddrUnsafe ◾ x_344;
< let x_348 : u8 := USize.decEq x_346 x_347;
< case x_348 : u8 of
---
> let x_378 : obj := proj[0] x_360;
> let x_379 : obj := proj[1] x_360;
> inc x_379;
> inc x_378;
> dec x_360;
> let x_380 : usize := ptrAddrUnsafe ◾ x_356;
> dec x_356;
> let x_381 : usize := ptrAddrUnsafe ◾ x_378;
> let x_382 : u8 := USize.decEq x_380 x_381;
> case x_382 : u8 of
1157,1161c1284,1288
< let x_349 : obj := reset[1] x_1;
< set x_317[3] := x_344;
< let x_350 : obj := reuse x_349 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
< let x_351 : obj := ctor_0[EStateM.Result.ok] x_350 x_345;
< ret x_351
---
> let x_383 : obj := reset[1] x_1;
> set x_351[3] := x_378;
> let x_384 : obj := reuse x_383 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
> let x_385 : obj := ctor_0[EStateM.Result.ok] x_384 x_379;
> ret x_385
1163,1165c1290,1292
< let x_352 : usize := ptrAddrUnsafe ◾ x_320;
< let x_353 : u8 := USize.decEq x_352 x_352;
< case x_353 : u8 of
---
> let x_386 : usize := ptrAddrUnsafe ◾ x_354;
> let x_387 : u8 := USize.decEq x_386 x_386;
> case x_387 : u8 of
1167,1171c1294,1298
< let x_354 : obj := reset[1] x_1;
< set x_317[3] := x_344;
< let x_355 : obj := reuse x_354 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
< let x_356 : obj := ctor_0[EStateM.Result.ok] x_355 x_345;
< ret x_356
---
> let x_388 : obj := reset[1] x_1;
> set x_351[3] := x_378;
> let x_389 : obj := reuse x_388 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
> let x_390 : obj := ctor_0[EStateM.Result.ok] x_389 x_379;
> ret x_390
1173,1174c1300,1301
< let x_357 : u8 := Lean.Name.beq x_321 x_321;
< case x_357 : u8 of
---
> let x_391 : u8 := Lean.Name.beq x_355 x_355;
> case x_391 : u8 of
1176,1180c1303,1307
< let x_358 : obj := reset[1] x_1;
< set x_317[3] := x_344;
< let x_359 : obj := reuse x_358 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
< let x_360 : obj := ctor_0[EStateM.Result.ok] x_359 x_345;
< ret x_360
---
> let x_392 : obj := reset[1] x_1;
> set x_351[3] := x_378;
> let x_393 : obj := reuse x_392 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
> let x_394 : obj := ctor_0[EStateM.Result.ok] x_393 x_379;
> ret x_394
1182,1188c1309,1315
< dec x_344;
< del x_317;
< dec x_321;
< dec x_320;
< dec x_319;
< let x_361 : obj := ctor_0[EStateM.Result.ok] x_1 x_345;
< ret x_361
---
> dec x_378;
> del x_351;
> dec x_355;
> dec x_354;
> dec x_353;
> let x_395 : obj := ctor_0[EStateM.Result.ok] x_1 x_379;
> ret x_395
1190,1194c1317,1321
< del x_317;
< dec x_322;
< dec x_321;
< dec x_320;
< dec x_319;
---
> del x_351;
> dec x_356;
> dec x_355;
> dec x_354;
> dec x_353;
1196,1197c1323,1324
< let x_362 : u8 := isShared x_326;
< case x_362 : u8 of
---
> let x_396 : u8 := isShared x_360;
> case x_396 : u8 of
1199c1326
< ret x_326
---
> ret x_360
1201,1207c1328,1334
< let x_363 : obj := proj[0] x_326;
< let x_364 : obj := proj[1] x_326;
< inc x_364;
< inc x_363;
< dec x_326;
< let x_365 : obj := ctor_1[EStateM.Result.error] x_363 x_364;
< ret x_365
---
> let x_397 : obj := proj[0] x_360;
> let x_398 : obj := proj[1] x_360;
> inc x_398;
> inc x_397;
> dec x_360;
> let x_399 : obj := ctor_1[EStateM.Result.error] x_397 x_398;
> ret x_399
1209,1224c1336,1351
< let x_366 : obj := proj[0] x_317;
< let x_367 : obj := proj[1] x_317;
< let x_368 : obj := proj[2] x_317;
< let x_369 : obj := proj[3] x_317;
< inc x_369;
< inc x_368;
< inc x_367;
< inc x_366;
< dec x_317;
< let x_370 : obj := Array.size ◾ x_369;
< let x_371 : usize := USize.ofNat x_370;
< dec x_370;
< let x_372 : usize := 0;
< inc x_369;
< let x_373 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_371 x_372 x_369 x_2 x_3 x_4 x_5 x_6 x_7;
< case x_373 : obj of
---
> let x_400 : obj := proj[0] x_351;
> let x_401 : obj := proj[1] x_351;
> let x_402 : obj := proj[2] x_351;
> let x_403 : obj := proj[3] x_351;
> inc x_403;
> inc x_402;
> inc x_401;
> inc x_400;
> dec x_351;
> let x_404 : obj := Array.size ◾ x_403;
> let x_405 : usize := USize.ofNat x_404;
> dec x_404;
> let x_406 : usize := 0;
> inc x_403;
> let x_407 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_405 x_406 x_403 x_2 x_3 x_4 x_5 x_6 x_7;
> case x_407 : obj of
1226,1235c1353,1362
< let x_374 : obj := proj[0] x_373;
< inc x_374;
< let x_375 : obj := proj[1] x_373;
< inc x_375;
< let x_376 : obj := reset[2] x_373;
< let x_377 : usize := ptrAddrUnsafe ◾ x_369;
< dec x_369;
< let x_378 : usize := ptrAddrUnsafe ◾ x_374;
< let x_379 : u8 := USize.decEq x_377 x_378;
< case x_379 : u8 of
---
> let x_408 : obj := proj[0] x_407;
> inc x_408;
> let x_409 : obj := proj[1] x_407;
> inc x_409;
> let x_410 : obj := reset[2] x_407;
> let x_411 : usize := ptrAddrUnsafe ◾ x_403;
> dec x_403;
> let x_412 : usize := ptrAddrUnsafe ◾ x_408;
> let x_413 : u8 := USize.decEq x_411 x_412;
> case x_413 : u8 of
1237,1241c1364,1368
< let x_380 : obj := reset[1] x_1;
< let x_381 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_366 x_367 x_368 x_374;
< let x_382 : obj := reuse x_380 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_381;
< let x_383 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_382 x_375;
< ret x_383
---
> let x_414 : obj := reset[1] x_1;
> let x_415 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_400 x_401 x_402 x_408;
> let x_416 : obj := reuse x_414 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_415;
> let x_417 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_416 x_409;
> ret x_417
1243,1245c1370,1372
< let x_384 : usize := ptrAddrUnsafe ◾ x_367;
< let x_385 : u8 := USize.decEq x_384 x_384;
< case x_385 : u8 of
---
> let x_418 : usize := ptrAddrUnsafe ◾ x_401;
> let x_419 : u8 := USize.decEq x_418 x_418;
> case x_419 : u8 of
1247,1251c1374,1378
< let x_386 : obj := reset[1] x_1;
< let x_387 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_366 x_367 x_368 x_374;
< let x_388 : obj := reuse x_386 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_387;
< let x_389 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_388 x_375;
< ret x_389
---
> let x_420 : obj := reset[1] x_1;
> let x_421 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_400 x_401 x_402 x_408;
> let x_422 : obj := reuse x_420 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_421;
> let x_423 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_422 x_409;
> ret x_423
1253,1254c1380,1381
< let x_390 : u8 := Lean.Name.beq x_368 x_368;
< case x_390 : u8 of
---
> let x_424 : u8 := Lean.Name.beq x_402 x_402;
> case x_424 : u8 of
1256,1260c1383,1387
< let x_391 : obj := reset[1] x_1;
< let x_392 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_366 x_367 x_368 x_374;
< let x_393 : obj := reuse x_391 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_392;
< let x_394 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_393 x_375;
< ret x_394
---
> let x_425 : obj := reset[1] x_1;
> let x_426 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_400 x_401 x_402 x_408;
> let x_427 : obj := reuse x_425 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_426;
> let x_428 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_427 x_409;
> ret x_428
1262,1267c1389,1394
< dec x_374;
< dec x_368;
< dec x_367;
< dec x_366;
< let x_395 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_1 x_375;
< ret x_395
---
> dec x_408;
> dec x_402;
> dec x_401;
> dec x_400;
> let x_429 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_1 x_409;
> ret x_429
1269,1272c1396,1399
< dec x_369;
< dec x_368;
< dec x_367;
< dec x_366;
---
> dec x_403;
> dec x_402;
> dec x_401;
> dec x_400;
1274,1280c1401,1407
< let x_396 : obj := proj[0] x_373;
< inc x_396;
< let x_397 : obj := proj[1] x_373;
< inc x_397;
< let x_398 : obj := reset[2] x_373;
< let x_399 : obj := reuse x_398 in ctor_1[EStateM.Result.error] x_396 x_397;
< ret x_399
---
> let x_430 : obj := proj[0] x_407;
> inc x_430;
> let x_431 : obj := proj[1] x_407;
> inc x_431;
> let x_432 : obj := reset[2] x_407;
> let x_433 : obj := reuse x_432 in ctor_1[EStateM.Result.error] x_430 x_431;
> ret x_433
1287,1288c1414,1415
< let x_400 : obj := ctor_0[EStateM.Result.ok] x_1 x_7;
< ret x_400
---
> let x_434 : obj := ctor_0[EStateM.Result.ok] x_1 x_7;
> ret x_434
/-
Copyright (c) 2022 Henrik Böving. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Henrik Böving
-/
prelude
import Lean.Compiler.LCNF.CompilerM
import Lean.Compiler.LCNF.PassManager
import Lean.Compiler.LCNF.PullFunDecls
import Lean.Compiler.LCNF.FVarUtil
import Lean.Compiler.LCNF.ScopeM
import Lean.Compiler.LCNF.InferType
namespace Lean.Compiler.LCNF
namespace JoinPointFinder
open ScopeM
/--
Info about a join point candidate (a `fun` declaration) during the find phase.
-/
structure CandidateInfo where
/--
The arity of the candidate
-/
arity : Nat
/--
The set of candidates that rely on this candidate to be a join point.
For a more detailed explanation see the documentation of `find`
-/
associated : HashSet FVarId
deriving Inhabited
/--
The state for the join point candidate finder.
-/
structure FindState where
/--
All current join point candidates accessible by their `FVarId`.
-/
candidates : HashMap FVarId CandidateInfo := .empty
/--
The `FVarId`s of all `fun` declarations that were declared within the
current `fun`.
-/
scope : HashSet FVarId := .empty
abbrev ReplaceCtx := HashMap FVarId Name
abbrev FindM := ReaderT (Option FVarId) StateRefT FindState ScopeM
abbrev ReplaceM := ReaderT ReplaceCtx CompilerM
/--
Attempt to find a join point candidate by its `FVarId`.
-/
private def findCandidate? (fvarId : FVarId) : FindM (Option CandidateInfo) := do
return (← get).candidates.find? fvarId
/--
Erase a join point candidate as well as all the ones that depend on it
by its `FVarId`, no error is thrown is the candidate does not exist.
-/
private partial def eraseCandidate (fvarId : FVarId) : FindM Unit := do
if let some info ← findCandidate? fvarId then
modify (fun state => { state with candidates := state.candidates.erase fvarId })
info.associated.forM eraseCandidate
/--
Combinator for modifying the candidates in `FindM`.
-/
private def modifyCandidates (f : HashMap FVarId CandidateInfo → HashMap FVarId CandidateInfo) : FindM Unit :=
modify (fun state => {state with candidates := f state.candidates })
/--
Remove all join point candidates contained in `a`.
-/
private partial def removeCandidatesInArg (a : Arg) : FindM Unit := do
forFVarM eraseCandidate a
/--
Remove all join point candidates contained in `a`.
-/
private partial def removeCandidatesInLetValue (e : LetValue) : FindM Unit := do
forFVarM eraseCandidate e
/--
Add a new join point candidate to the state.
-/
private def addCandidate (fvarId : FVarId) (arity : Nat) : FindM Unit := do
let cinfo := { arity, associated := .empty }
modifyCandidates (fun cs => cs.insert fvarId cinfo )
/--
Add a new join point dependency from `src` to `dst`.
-/
private def addDependency (src : FVarId) (target : FVarId) : FindM Unit := do
if let some targetInfo ← findCandidate? target then
modifyCandidates (fun cs => cs.insert target { targetInfo with associated := targetInfo.associated.insert src })
else
eraseCandidate src
/--
Find all `fun` declarations that qualify as a join point, that is:
- are always fully applied
- are always called in tail position
Where a `fun` `f` is in tail position iff it is called as follows:
```
let res := f arg
res
```
The majority (if not all) tail calls will be brought into this form
by the simplifier pass.
Furthermore a `fun` disqualifies as a join point if turning it into a join
point would turn a call to it into an out of scope join point.
This can happen if we have something like:
```
def test (b : Bool) (x y : Nat) : Nat :=
fun myjp x => Nat.add x (Nat.add x x)
fun f y =>
let x := Nat.add y y
myjp x
fun f y =>
let x := Nat.mul y y
myjp x
cases b (f x) (g y)
```
`f` and `g` can be detected as a join point right away, however
`myjp` can only ever be detected as a join point after we have established
this. This is because otherwise the calls to `myjp` in `f` and `g` would
produce out of scope join point jumps.
-/
partial def find (decl : Decl) : CompilerM FindState := do
let (_, candidates) ← go decl.value |>.run none |>.run {} |>.run' {}
return candidates
where
go : Code → FindM Unit
| .let decl k => do
match k, decl.value with
| .return valId, .fvar fvarId args =>
args.forM removeCandidatesInArg
if let some candidateInfo ← findCandidate? fvarId then
-- Erase candidate that are not fully applied or applied outside of tail position
if valId != decl.fvarId || args.size != candidateInfo.arity then
eraseCandidate fvarId
-- Out of scope join point candidate handling
else if let some upperCandidate ← read then
if !(← isInScope fvarId) then
addDependency fvarId upperCandidate
else
eraseCandidate fvarId
| _, _ =>
removeCandidatesInLetValue decl.value
go k
| .fun decl k => do
withReader (fun _ => some decl.fvarId) do
withNewScope do
go decl.value
addCandidate decl.fvarId decl.getArity
addToScope decl.fvarId
go k
| .jp decl k => do
go decl.value
go k
| .jmp _ args => args.forM removeCandidatesInArg
| .return val => eraseCandidate val
| .cases c => do
eraseCandidate c.discr
c.alts.forM (·.forCodeM go)
| .unreach .. => return ()
/--
Replace all join point candidate `fun` declarations with `jp` ones
and all calls to them with `jmp`s.
-/
partial def replace (decl : Decl) (state : FindState) : CompilerM Decl := do
let mapper := fun acc cname _ => do return acc.insert cname (← mkFreshJpName)
let replaceCtx : ReplaceCtx ← state.candidates.foldM (init := .empty) mapper
let newValue ← go decl.value |>.run replaceCtx
return { decl with value := newValue }
where
go (code : Code) : ReplaceM Code := do
match code with
| .let decl k =>
match k, decl.value with
| .return valId, .fvar fvarId args =>
if valId == decl.fvarId then
if (← read).contains fvarId then
eraseLetDecl decl
return .jmp fvarId args
else
return code
else
return code
| _, _ => return Code.updateLet! code decl (← go k)
| .fun decl k =>
if let some replacement := (← read).find? decl.fvarId then
let newDecl := { decl with
binderName := replacement,
value := (← go decl.value)
}
modifyLCtx fun lctx => lctx.addFunDecl newDecl
return .jp newDecl (← go k)
else
let newDecl ← decl.updateValue (← go decl.value)
return Code.updateFun! code newDecl (← go k)
| .jp decl k =>
let newDecl ← decl.updateValue (← go decl.value)
return Code.updateFun! code newDecl (← go k)
| .cases cs =>
return Code.updateCases! code cs.resultType cs.discr (← cs.alts.mapM (·.mapCodeM go))
| .jmp .. | .return .. | .unreach .. =>
return code
end JoinPointFinder
namespace JoinPointContextExtender
open ScopeM
/--
The context managed by `ExtendM`.
-/
structure ExtendContext where
/--
The `FVarId` of the current join point if we are currently inside one.
-/
currentJp? : Option FVarId := none
/--
The list of valid candidates for extending the context. This will be
all `let` and `fun` declarations as well as all `jp` parameters up
until the last `fun` declaration in the tree.
-/
candidates : FVarIdSet := {}
/--
The state managed by `ExtendM`.
-/
structure ExtendState where
/--
A map from join point `FVarId`s to a respective map from free variables
to `Param`s. The free variables in this map are the once that the context
of said join point will be extended by by passing in the respective parameter.
-/
fvarMap : HashMap FVarId (HashMap FVarId Param) := {}
/--
The monad for the `extendJoinPointContext` pass.
-/
abbrev ExtendM := ReaderT ExtendContext StateRefT ExtendState ScopeM
/--
Replace a free variable if necessary, that is:
- It is in the list of candidates
- We are currently within a join point (if we are within a function there
cannot be a need to replace them since we dont extend their context)
- Said join point actually has a replacement parameter registered.
otherwise just return `fvar`.
-/
def replaceFVar (fvar : FVarId) : ExtendM FVarId := do
if (← read).candidates.contains fvar then
if let some currentJp := (← read).currentJp? then
if let some replacement := (← get).fvarMap.find! currentJp |>.find? fvar then
return replacement.fvarId
return fvar
/--
Add a new candidate to the current scope + to the list of candidates
if we are currently within a join point. Then execute `x`.
-/
def withNewCandidate (fvar : FVarId) (x : ExtendM α) : ExtendM α := do
addToScope fvar
if (← read).currentJp?.isSome then
withReader (fun ctx => { ctx with candidates := ctx.candidates.insert fvar }) do
x
else
x
/--
Same as `withNewCandidate` but with multiple `FVarId`s.
-/
def withNewCandidates (fvars : Array FVarId) (x : ExtendM α) : ExtendM α := do
if (← read).currentJp?.isSome then
let candidates := (← read).candidates
let folder (acc : FVarIdSet) (val : FVarId) := do
addToScope val
return acc.insert val
let newCandidates ← fvars.foldlM (init := candidates) folder
withReader (fun ctx => { ctx with candidates := newCandidates }) do
x
else
x
/--
Extend the context of the current join point (if we are within one)
by `fvar` if necessary.
This is necessary if:
- `fvar` is not in scope (that is, was declared outside of the current jp)
- we have not already extended the context by `fvar`
- the list of candidates contains `fvar`. This is because if we have something
like:
```
let x := ..
fun f a =>
jp j b =>
let y := x
y
```
There is no point in extending the context of `j` by `x` because we
cannot lift a join point outside of a local function declaration.
-/
def extendByIfNecessary (fvar : FVarId) : ExtendM Unit := do
if let some currentJp := (← read).currentJp? then
let mut translator := (← get).fvarMap.find! currentJp
let candidates := (← read).candidates
if !(← isInScope fvar) && !translator.contains fvar && candidates.contains fvar then
let typ ← getType fvar
let newParam ← mkAuxParam typ
translator := translator.insert fvar newParam
modify fun s => { s with fvarMap := s.fvarMap.insert currentJp translator }
/--
Merge the extended context of two join points if necessary. That is
if we have a structure such as:
```
jp j.1 ... =>
jp j.2 .. =>
...
...
```
And we are just done visiting `j.2` we want to extend the context of
`j.1` by all free variables that the context of `j.2` was extended by
as well because we need to drag these variables through at the call sites
of `j.2` in `j.1`.
-/
def mergeJpContextIfNecessary (jp : FVarId) : ExtendM Unit := do
if (← read).currentJp?.isSome then
let additionalArgs := (← get).fvarMap.find! jp |>.toArray
for (fvar, _) in additionalArgs do
extendByIfNecessary fvar
/--
We call this whenever we enter a new local function. It clears both the
current join point and the list of candidates since we can't lift join
points outside of functions as explained in `mergeJpContextIfNecessary`.
-/
def withNewFunScope (x : ExtendM α): ExtendM α := do
withReader (fun ctx => { ctx with currentJp? := none, candidates := {} }) do
withNewScope do
x
/--
We call this whenever we enter a new join point. It will set the current
join point and extend the list of candidates by all of the parameters of
the join point. This is so in the case of nested join points that refer
to parameters of the current one we extend the context of the nested
join points by said parameters.
-/
def withNewJpScope (decl : FunDecl) (x : ExtendM α): ExtendM α := do
withReader (fun ctx => { ctx with currentJp? := some decl.fvarId }) do
modify fun s => { s with fvarMap := s.fvarMap.insert decl.fvarId {} }
withNewScope do
withNewCandidates (decl.params.map (·.fvarId)) do
x
/--
We call this whenever we visit a new arm of a cases statement.
It will back up the current scope (since we are doing a case split
and want to continue with other arms afterwards) and add all of the
parameters of the match arm to the list of candidates.
-/
def withNewAltScope (alt : Alt) (x : ExtendM α) : ExtendM α := do
withBackTrackingScope do
withNewCandidates (alt.getParams.map (·.fvarId)) do
x
/--
Use all of the above functions to find free variables declared outside
of join points that said join points can be reasonaly extended by. Reasonable
meaning that in case the current join point is nested within a function
declaration we will not extend it by free variables declared before the
function declaration because we cannot lift join points outside of function
declarations.
All of this is done to eliminate dependencies of join points onto their
position within the code so we can pull them out as far as possible, hopefully
enabling new inlining possibilities in the next simplifier run.
-/
partial def extend (decl : Decl) : CompilerM Decl := do
let newValue ← go decl.value |>.run {} |>.run' {} |>.run' {}
let decl := { decl with value := newValue }
decl.pullFunDecls
where
goFVar (fvar : FVarId) : ExtendM FVarId := do
extendByIfNecessary fvar
replaceFVar fvar
go (code : Code) : ExtendM Code := do
match code with
| .let decl k =>
let decl ← decl.updateValue (← mapFVarM goFVar decl.value)
withNewCandidate decl.fvarId do
return Code.updateLet! code decl (← go k)
| .jp decl k =>
let decl ← withNewJpScope decl do
let value ← go decl.value
let additionalParams := (← get).fvarMap.find! decl.fvarId |>.toArray |>.map Prod.snd
let newType := additionalParams.foldr (init := decl.type) (fun val acc => .forallE val.binderName val.type acc .default)
decl.update newType (additionalParams ++ decl.params) value
mergeJpContextIfNecessary decl.fvarId
withNewCandidate decl.fvarId do
return Code.updateFun! code decl (← go k)
| .fun decl k =>
let decl ← withNewFunScope do
decl.updateValue (← go decl.value)
withNewCandidate decl.fvarId do
return Code.updateFun! code decl (← go k)
| .cases cs =>
extendByIfNecessary cs.discr
let discr ← replaceFVar cs.discr
let visitor := fun alt => do
withNewAltScope alt do
alt.mapCodeM go
let alts ← cs.alts.mapM visitor
return Code.updateCases! code cs.resultType discr alts
| .jmp fn args =>
let mut newArgs ← args.mapM (mapFVarM goFVar)
let additionalArgs := (← get).fvarMap.find! fn |>.toArray |>.map Prod.fst
if let some _currentJp := (← read).currentJp? then
let f := fun arg => do
return .fvar (← goFVar arg)
newArgs := (←additionalArgs.mapM f) ++ newArgs
else
newArgs := (additionalArgs.map .fvar) ++ newArgs
return Code.updateJmp! code fn newArgs
| .return var =>
extendByIfNecessary var
return Code.updateReturn! code (← replaceFVar var)
| .unreach .. => return code
end JoinPointContextExtender
namespace JoinPointCommonArgs
/--
Context for `ReduceAnalysisM`.
-/
structure AnalysisCtx where
/--
The variables that are in scope at the time of the definition of
the join point.
-/
jpScopes : FVarIdMap FVarIdSet := {}
/--
State for `ReduceAnalysisM`.
-/
structure AnalysisState where
/--
A map, that for each join point id contains a map from all (so far)
duplicated argument ids to the respective duplicate value
-/
jpJmpArgs : FVarIdMap FVarSubst := {}
abbrev ReduceAnalysisM := ReaderT AnalysisCtx StateRefT AnalysisState ScopeM
abbrev ReduceActionM := ReaderT AnalysisState CompilerM
def isInJpScope (jp : FVarId) (var : FVarId) : ReduceAnalysisM Bool := do
return (← read).jpScopes.find! jp |>.contains var
open ScopeM
set_option trace.compiler.ir.result true in
partial def reduce (decl : Decl) : CompilerM Decl := do
let (_, analysis) ← goAnalyze decl.value |>.run {} |>.run {} |>.run' {}
let newValue ← goReduce decl.value |>.run analysis
return { decl with value := newValue }
where
goAnalyzeFunDecl (fn : FunDecl) : ReduceAnalysisM Unit := do
withNewScope do
fn.params.forM (addToScope ·.fvarId)
goAnalyze fn.value
goAnalyze (code : Code) : ReduceAnalysisM Unit := do
match code with
| .let decl k =>
addToScope decl.fvarId
goAnalyze k
| .jp decl k =>
goAnalyzeFunDecl decl
let scope ← getScope
withReader (fun ctx => { ctx with jpScopes := ctx.jpScopes.insert decl.fvarId scope }) do
addToScope decl.fvarId
goAnalyze k
| .fun decl k =>
goAnalyzeFunDecl decl
addToScope decl.fvarId
goAnalyze k
| .cases cs =>
let visitor alt := do
withNewScope do
alt.getParams.forM (addToScope ·.fvarId)
goAnalyze alt.getCode
cs.alts.forM visitor
| .jmp fn args =>
let decl ← getFunDecl fn
if let some knownArgs := (← get).jpJmpArgs.find? fn then
let mut newArgs := knownArgs
for (param, arg) in decl.params.zip args do
if let some knownVal := newArgs.find? param.fvarId then
if arg.toExpr != knownVal then
newArgs := newArgs.erase param.fvarId
modify fun s => { s with jpJmpArgs := s.jpJmpArgs.insert fn newArgs }
else
let folder := fun acc (param, arg) => do
if (← allFVarM (isInJpScope fn) arg) then
return acc.insert param.fvarId arg.toExpr
else
return acc
let interestingArgs ← decl.params.zip args |>.foldlM (init := {}) folder
modify fun s => { s with jpJmpArgs := s.jpJmpArgs.insert fn interestingArgs }
| .return .. | .unreach .. => return ()
goReduce (code : Code) : ReduceActionM Code := do
match code with
| .jp decl k =>
if let some reducibleArgs := (← read).jpJmpArgs.find? decl.fvarId then
let filter param := do
let erasable := reducibleArgs.contains param.fvarId
if erasable then
eraseParam param
return !erasable
let newParams ← decl.params.filterM filter
let mut newValue ← goReduce decl.value
newValue ← replaceFVars newValue reducibleArgs false
let newType ←
if newParams.size != decl.params.size then
mkForallParams newParams (← newValue.inferType)
else
pure decl.type
let k ← goReduce k
let decl ← decl.update newType newParams newValue
return Code.updateFun! code decl k
else
return Code.updateFun! code decl (← goReduce k)
| .jmp fn args =>
let reducibleArgs := (← read).jpJmpArgs.find! fn
let decl ← getFunDecl fn
let newParams := decl.params.zip args
|>.filter (!reducibleArgs.contains ·.fst.fvarId)
|>.map Prod.snd
return Code.updateJmp! code fn newParams
| .let decl k =>
return Code.updateLet! code decl (← goReduce k)
| .fun decl k =>
let decl ← decl.updateValue (← goReduce decl.value)
return Code.updateFun! code decl (← goReduce k)
| .cases cs =>
let alts ← cs.alts.mapM (·.mapCodeM goReduce)
return Code.updateCases! code cs.resultType cs.discr alts
| .return .. | .unreach .. => return code
end JoinPointCommonArgs
end Lean.Compiler.LCNF
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) : obj :=
case x_1 : obj of
Lean.Compiler.LCNF.Code.let →
let x_8 : obj := proj[0] x_1;
inc x_8;
let x_9 : obj := proj[1] x_1;
inc x_9;
inc x_9;
let x_10 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_9 x_2 x_3 x_4 x_5 x_6 x_7;
case x_10 : obj of
EStateM.Result.ok →
let x_11 : u8 := isShared x_10;
case x_11 : u8 of
Bool.false →
let x_12 : obj := proj[0] x_10;
let x_13 : obj := proj[1] x_10;
let x_14 : usize := ptrAddrUnsafe ◾ x_9;
dec x_9;
let x_15 : usize := ptrAddrUnsafe ◾ x_12;
let x_16 : u8 := USize.decEq x_14 x_15;
case x_16 : u8 of
Bool.false →
let x_17 : u8 := isShared x_1;
case x_17 : u8 of
Bool.false →
let x_18 : obj := proj[1] x_1;
dec x_18;
let x_19 : obj := proj[0] x_1;
dec x_19;
set x_10[1] := x_12;
set x_10[0] := x_8;
set x_1[1] := x_13;
set x_1[0] := x_10;
ret x_1
Bool.true →
dec x_1;
set x_10[1] := x_12;
set x_10[0] := x_8;
let x_20 : obj := ctor_0[EStateM.Result.ok] x_10 x_13;
ret x_20
Bool.true →
let x_21 : usize := ptrAddrUnsafe ◾ x_8;
let x_22 : u8 := USize.decEq x_21 x_21;
case x_22 : u8 of
Bool.false →
let x_23 : u8 := isShared x_1;
case x_23 : u8 of
Bool.false →
let x_24 : obj := proj[1] x_1;
dec x_24;
let x_25 : obj := proj[0] x_1;
dec x_25;
set x_10[1] := x_12;
set x_10[0] := x_8;
set x_1[1] := x_13;
set x_1[0] := x_10;
ret x_1 -- out0
Bool.true →
dec x_1;
set x_10[1] := x_12;
set x_10[0] := x_8;
let x_26 : obj := ctor_0[EStateM.Result.ok] x_10 x_13;
ret x_26
Bool.true →
dec x_12;
dec x_8;
set x_10[0] := x_1;
ret x_10
Bool.true →
let x_27 : obj := proj[0] x_10;
let x_28 : obj := proj[1] x_10;
inc x_28;
inc x_27;
dec x_10;
let x_29 : usize := ptrAddrUnsafe ◾ x_9;
dec x_9;
let x_30 : usize := ptrAddrUnsafe ◾ x_27;
let x_31 : u8 := USize.decEq x_29 x_30;
case x_31 : u8 of
Bool.false →
let x_32 : obj := reset[2] x_1;
let x_33 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_27;
let x_34 : obj := reuse x_32 in ctor_0[EStateM.Result.ok] x_33 x_28;
ret x_34
Bool.true →
let x_35 : usize := ptrAddrUnsafe ◾ x_8;
let x_36 : u8 := USize.decEq x_35 x_35;
case x_36 : u8 of
Bool.false →
let x_37 : obj := reset[2] x_1;
let x_38 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_27;
let x_39 : obj := reuse x_37 in ctor_0[EStateM.Result.ok] x_38 x_28;
ret x_39
Bool.true →
dec x_27;
dec x_8;
let x_40 : obj := ctor_0[EStateM.Result.ok] x_1 x_28;
ret x_40
EStateM.Result.error →
dec x_9;
dec x_8;
dec x_1;
let x_41 : u8 := isShared x_10;
case x_41 : u8 of
Bool.false →
ret x_10
Bool.true →
let x_42 : obj := proj[0] x_10;
let x_43 : obj := proj[1] x_10;
inc x_43;
inc x_42;
dec x_10;
let x_44 : obj := ctor_1[EStateM.Result.error] x_42 x_43;
ret x_44
Lean.Compiler.LCNF.Code.fun →
let x_45 : obj := proj[0] x_1;
inc x_45;
let x_46 : obj := proj[1] x_1;
inc x_46;
let x_47 : obj := proj[4] x_45;
inc x_47;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_48 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_47 x_2 x_3 x_4 x_5 x_6 x_7;
case x_48 : obj of
EStateM.Result.ok →
let x_49 : obj := proj[0] x_48;
inc x_49;
let x_50 : obj := proj[1] x_48;
inc x_50;
dec x_48;
let x_51 : obj := proj[3] x_45;
inc x_51;
let x_52 : obj := proj[2] x_45;
inc x_52;
inc x_45;
let x_53 : obj := _private.Lean.Compiler.LCNF.CompilerM.0.Lean.Compiler.LCNF.updateFunDeclImp x_45 x_51 x_52 x_49 x_3 x_4 x_5 x_6 x_50;
let x_54 : u8 := isShared x_53;
case x_54 : u8 of
Bool.false →
let x_55 : obj := proj[0] x_53;
let x_56 : obj := proj[1] x_53;
inc x_46;
let x_57 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_46 x_2 x_3 x_4 x_5 x_6 x_56;
case x_57 : obj of
EStateM.Result.ok →
let x_58 : u8 := isShared x_57;
case x_58 : u8 of
Bool.false →
let x_59 : obj := proj[0] x_57;
let x_60 : obj := proj[1] x_57;
let x_61 : usize := ptrAddrUnsafe ◾ x_46;
dec x_46;
let x_62 : usize := ptrAddrUnsafe ◾ x_59;
let x_63 : u8 := USize.decEq x_61 x_62;
case x_63 : u8 of
Bool.false →
dec x_45;
dec x_1;
setTag x_57 := 1;
set x_57[1] := x_59;
set x_57[0] := x_55;
set x_53[1] := x_60;
set x_53[0] := x_57;
ret x_53
Bool.true →
let x_64 : usize := ptrAddrUnsafe ◾ x_45;
dec x_45;
let x_65 : usize := ptrAddrUnsafe ◾ x_55;
let x_66 : u8 := USize.decEq x_64 x_65;
case x_66 : u8 of
Bool.false →
dec x_1;
setTag x_57 := 1;
set x_57[1] := x_59;
set x_57[0] := x_55;
set x_53[1] := x_60;
set x_53[0] := x_57;
ret x_53
Bool.true →
dec x_59;
del x_53;
dec x_55;
set x_57[0] := x_1;
ret x_57
Bool.true →
let x_67 : obj := proj[0] x_57;
let x_68 : obj := proj[1] x_57;
inc x_68;
inc x_67;
dec x_57;
let x_69 : usize := ptrAddrUnsafe ◾ x_46;
dec x_46;
let x_70 : usize := ptrAddrUnsafe ◾ x_67;
let x_71 : u8 := USize.decEq x_69 x_70;
case x_71 : u8 of
Bool.false →
dec x_45;
dec x_1;
let x_72 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_55 x_67;
set x_53[1] := x_68;
set x_53[0] := x_72;
ret x_53
Bool.true →
let x_73 : usize := ptrAddrUnsafe ◾ x_45;
dec x_45;
let x_74 : usize := ptrAddrUnsafe ◾ x_55;
let x_75 : u8 := USize.decEq x_73 x_74;
case x_75 : u8 of
Bool.false →
dec x_1;
let x_76 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_55 x_67;
set x_53[1] := x_68;
set x_53[0] := x_76;
ret x_53
Bool.true →
dec x_67;
del x_53;
dec x_55;
let x_77 : obj := ctor_0[EStateM.Result.ok] x_1 x_68;
ret x_77
EStateM.Result.error →
del x_53;
dec x_55;
dec x_46;
dec x_45;
dec x_1;
let x_78 : u8 := isShared x_57;
case x_78 : u8 of
Bool.false →
ret x_57
Bool.true →
let x_79 : obj := proj[0] x_57;
let x_80 : obj := proj[1] x_57;
inc x_80;
inc x_79;
dec x_57;
let x_81 : obj := ctor_1[EStateM.Result.error] x_79 x_80;
ret x_81
Bool.true →
let x_82 : obj := proj[0] x_53;
let x_83 : obj := proj[1] x_53;
inc x_83;
inc x_82;
dec x_53;
inc x_46;
let x_84 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_46 x_2 x_3 x_4 x_5 x_6 x_83;
case x_84 : obj of
EStateM.Result.ok →
let x_85 : obj := proj[0] x_84;
inc x_85;
let x_86 : obj := proj[1] x_84;
inc x_86;
let x_87 : obj := reset[2] x_84;
let x_88 : usize := ptrAddrUnsafe ◾ x_46;
dec x_46;
let x_89 : usize := ptrAddrUnsafe ◾ x_85;
let x_90 : u8 := USize.decEq x_88 x_89;
case x_90 : u8 of
Bool.false →
dec x_45;
dec x_1;
let x_91 : obj := reuse! x_87 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_82 x_85;
let x_92 : obj := ctor_0[EStateM.Result.ok] x_91 x_86;
ret x_92
Bool.true →
let x_93 : usize := ptrAddrUnsafe ◾ x_45;
dec x_45;
let x_94 : usize := ptrAddrUnsafe ◾ x_82;
let x_95 : u8 := USize.decEq x_93 x_94;
case x_95 : u8 of
Bool.false →
dec x_1;
let x_96 : obj := reuse! x_87 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_82 x_85;
let x_97 : obj := ctor_0[EStateM.Result.ok] x_96 x_86;
ret x_97
Bool.true →
dec x_85;
dec x_82;
let x_98 : obj := reuse x_87 in ctor_0[EStateM.Result.ok] x_1 x_86;
ret x_98
EStateM.Result.error →
dec x_82;
dec x_46;
dec x_45;
dec x_1;
let x_99 : obj := proj[0] x_84;
inc x_99;
let x_100 : obj := proj[1] x_84;
inc x_100;
let x_101 : obj := reset[2] x_84;
let x_102 : obj := reuse x_101 in ctor_1[EStateM.Result.error] x_99 x_100;
ret x_102
EStateM.Result.error →
dec x_46;
dec x_45;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_103 : u8 := isShared x_48;
case x_103 : u8 of
Bool.false →
ret x_48
Bool.true →
let x_104 : obj := proj[0] x_48;
let x_105 : obj := proj[1] x_48;
inc x_105;
inc x_104;
dec x_48;
let x_106 : obj := ctor_1[EStateM.Result.error] x_104 x_105;
ret x_106
Lean.Compiler.LCNF.Code.jp →
let x_107 : obj := proj[0] x_1;
inc x_107;
let x_108 : obj := proj[1] x_1;
inc x_108;
let x_109 : obj := proj[0] x_107;
inc x_109;
let x_110 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_109;
dec x_109;
case x_110 : obj of
Option.none →
inc x_108;
let x_111 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_108 x_2 x_3 x_4 x_5 x_6 x_7;
case x_111 : obj of
EStateM.Result.ok →
let x_112 : u8 := isShared x_111;
case x_112 : u8 of
Bool.false →
let x_113 : obj := proj[0] x_111;
let x_114 : obj := proj[1] x_111;
let x_115 : usize := ptrAddrUnsafe ◾ x_108;
dec x_108;
let x_116 : usize := ptrAddrUnsafe ◾ x_113;
let x_117 : u8 := USize.decEq x_115 x_116;
case x_117 : u8 of
Bool.false →
let x_118 : u8 := isShared x_1;
case x_118 : u8 of
Bool.false →
let x_119 : obj := proj[1] x_1;
dec x_119;
let x_120 : obj := proj[0] x_1;
dec x_120;
setTag x_111 := 2;
set x_111[1] := x_113;
set x_111[0] := x_107;
setTag x_1 := 0;
set x_1[1] := x_114;
set x_1[0] := x_111;
ret x_1
Bool.true →
dec x_1;
setTag x_111 := 2;
set x_111[1] := x_113;
set x_111[0] := x_107;
let x_121 : obj := ctor_0[EStateM.Result.ok] x_111 x_114;
ret x_121
Bool.true →
let x_122 : usize := ptrAddrUnsafe ◾ x_107;
let x_123 : u8 := USize.decEq x_122 x_122;
case x_123 : u8 of
Bool.false →
let x_124 : u8 := isShared x_1;
case x_124 : u8 of
Bool.false →
let x_125 : obj := proj[1] x_1;
dec x_125;
let x_126 : obj := proj[0] x_1;
dec x_126;
setTag x_111 := 2;
set x_111[1] := x_113;
set x_111[0] := x_107;
setTag x_1 := 0;
set x_1[1] := x_114;
set x_1[0] := x_111;
ret x_1
Bool.true →
dec x_1;
setTag x_111 := 2;
set x_111[1] := x_113;
set x_111[0] := x_107;
let x_127 : obj := ctor_0[EStateM.Result.ok] x_111 x_114;
ret x_127
Bool.true →
dec x_113;
dec x_107;
set x_111[0] := x_1;
ret x_111
Bool.true →
let x_128 : obj := proj[0] x_111;
let x_129 : obj := proj[1] x_111;
inc x_129;
inc x_128;
dec x_111;
let x_130 : usize := ptrAddrUnsafe ◾ x_108;
dec x_108;
let x_131 : usize := ptrAddrUnsafe ◾ x_128;
let x_132 : u8 := USize.decEq x_130 x_131;
case x_132 : u8 of
Bool.false →
let x_133 : obj := reset[2] x_1;
let x_134 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_107 x_128;
let x_135 : obj := reuse! x_133 in ctor_0[EStateM.Result.ok] x_134 x_129;
ret x_135
Bool.true →
let x_136 : usize := ptrAddrUnsafe ◾ x_107;
let x_137 : u8 := USize.decEq x_136 x_136;
case x_137 : u8 of
Bool.false →
let x_138 : obj := reset[2] x_1;
let x_139 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_107 x_128;
let x_140 : obj := reuse! x_138 in ctor_0[EStateM.Result.ok] x_139 x_129;
ret x_140
Bool.true →
dec x_128;
dec x_107;
let x_141 : obj := ctor_0[EStateM.Result.ok] x_1 x_129;
ret x_141
EStateM.Result.error →
dec x_108;
dec x_107;
dec x_1;
let x_142 : u8 := isShared x_111;
case x_142 : u8 of
Bool.false →
ret x_111
Bool.true →
let x_143 : obj := proj[0] x_111;
let x_144 : obj := proj[1] x_111;
inc x_144;
inc x_143;
dec x_111;
let x_145 : obj := ctor_1[EStateM.Result.error] x_143 x_144;
ret x_145
Option.some →
let x_146 : obj := proj[0] x_110;
inc x_146;
dec x_110;
let x_147 : obj := proj[2] x_107;
inc x_147;
let x_148 : obj := Array.size ◾ x_147;
let x_149 : obj := 0;
let x_150 : u8 := Nat.decLt x_149 x_148;
case x_150 : u8 of
Bool.false →
dec x_147;
let x_151 : obj := proj[4] x_107;
inc x_151;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_152 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_151 x_2 x_3 x_4 x_5 x_6 x_7;
case x_152 : obj of
EStateM.Result.ok →
let x_153 : obj := proj[0] x_152;
inc x_153;
let x_154 : obj := proj[1] x_152;
inc x_154;
dec x_152;
let x_155 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_156 : obj := Lean.Compiler.LCNF.normCodeImp x_155 x_153 x_146 x_3 x_4 x_5 x_6 x_154;
case x_156 : obj of
EStateM.Result.ok →
let x_157 : obj := proj[0] x_156;
inc x_157;
let x_158 : obj := proj[1] x_156;
inc x_158;
dec x_156;
let x_159 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
let x_160 : u8 := Nat.beq x_159 x_148;
dec x_148;
dec x_159;
case x_160 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_157;
let x_161 : obj := Lean.Compiler.LCNF.Code.inferType x_157 x_3 x_4 x_5 x_6 x_158;
case x_161 : obj of
EStateM.Result.ok →
let x_162 : obj := proj[0] x_161;
inc x_162;
let x_163 : obj := proj[1] x_161;
inc x_163;
dec x_161;
let x_164 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_164;
let x_165 : obj := Lean.Compiler.LCNF.mkForallParams x_164 x_162 x_3 x_4 x_5 x_6 x_163;
case x_165 : obj of
EStateM.Result.ok →
let x_166 : obj := proj[0] x_165;
inc x_166;
let x_167 : obj := proj[1] x_165;
inc x_167;
dec x_165;
let x_168 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_164 x_157 x_1 x_166 x_2 x_3 x_4 x_5 x_6 x_167;
ret x_168
EStateM.Result.error →
dec x_164;
dec x_157;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_169 : u8 := isShared x_165;
case x_169 : u8 of
Bool.false →
ret x_165
Bool.true →
let x_170 : obj := proj[0] x_165;
let x_171 : obj := proj[1] x_165;
inc x_171;
inc x_170;
dec x_165;
let x_172 : obj := ctor_1[EStateM.Result.error] x_170 x_171;
ret x_172
EStateM.Result.error →
dec x_157;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_173 : u8 := isShared x_161;
case x_173 : u8 of
Bool.false →
ret x_161
Bool.true →
let x_174 : obj := proj[0] x_161;
let x_175 : obj := proj[1] x_161;
inc x_175;
inc x_174;
dec x_161;
let x_176 : obj := ctor_1[EStateM.Result.error] x_174 x_175;
ret x_176
Bool.true →
let x_177 : obj := proj[3] x_107;
inc x_177;
let x_178 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_179 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_178 x_157 x_1 x_177 x_2 x_3 x_4 x_5 x_6 x_158;
ret x_179
EStateM.Result.error →
dec x_148;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_180 : u8 := isShared x_156;
case x_180 : u8 of
Bool.false →
ret x_156
Bool.true →
let x_181 : obj := proj[0] x_156;
let x_182 : obj := proj[1] x_156;
inc x_182;
inc x_181;
dec x_156;
let x_183 : obj := ctor_1[EStateM.Result.error] x_181 x_182;
ret x_183
EStateM.Result.error →
dec x_148;
dec x_146;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_184 : u8 := isShared x_152;
case x_184 : u8 of
Bool.false →
ret x_152
Bool.true →
let x_185 : obj := proj[0] x_152;
let x_186 : obj := proj[1] x_152;
inc x_186;
inc x_185;
dec x_152;
let x_187 : obj := ctor_1[EStateM.Result.error] x_185 x_186;
ret x_187
Bool.true →
let x_188 : u8 := Nat.decLe x_148 x_148;
case x_188 : u8 of
Bool.false →
dec x_147;
let x_189 : obj := proj[4] x_107;
inc x_189;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_190 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_189 x_2 x_3 x_4 x_5 x_6 x_7;
case x_190 : obj of
EStateM.Result.ok →
let x_191 : obj := proj[0] x_190;
inc x_191;
let x_192 : obj := proj[1] x_190;
inc x_192;
dec x_190;
let x_193 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_194 : obj := Lean.Compiler.LCNF.normCodeImp x_193 x_191 x_146 x_3 x_4 x_5 x_6 x_192;
case x_194 : obj of
EStateM.Result.ok →
let x_195 : obj := proj[0] x_194;
inc x_195;
let x_196 : obj := proj[1] x_194;
inc x_196;
dec x_194;
let x_197 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
let x_198 : u8 := Nat.beq x_197 x_148;
dec x_148;
dec x_197;
case x_198 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_195;
let x_199 : obj := Lean.Compiler.LCNF.Code.inferType x_195 x_3 x_4 x_5 x_6 x_196;
case x_199 : obj of
EStateM.Result.ok →
let x_200 : obj := proj[0] x_199;
inc x_200;
let x_201 : obj := proj[1] x_199;
inc x_201;
dec x_199;
let x_202 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_202;
let x_203 : obj := Lean.Compiler.LCNF.mkForallParams x_202 x_200 x_3 x_4 x_5 x_6 x_201;
case x_203 : obj of
EStateM.Result.ok →
let x_204 : obj := proj[0] x_203;
inc x_204;
let x_205 : obj := proj[1] x_203;
inc x_205;
dec x_203;
let x_206 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_202 x_195 x_1 x_204 x_2 x_3 x_4 x_5 x_6 x_205;
ret x_206
EStateM.Result.error →
dec x_202;
dec x_195;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_207 : u8 := isShared x_203;
case x_207 : u8 of
Bool.false →
ret x_203
Bool.true →
let x_208 : obj := proj[0] x_203;
let x_209 : obj := proj[1] x_203;
inc x_209;
inc x_208;
dec x_203;
let x_210 : obj := ctor_1[EStateM.Result.error] x_208 x_209;
ret x_210
EStateM.Result.error →
dec x_195;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_211 : u8 := isShared x_199;
case x_211 : u8 of
Bool.false →
ret x_199
Bool.true →
let x_212 : obj := proj[0] x_199;
let x_213 : obj := proj[1] x_199;
inc x_213;
inc x_212;
dec x_199;
let x_214 : obj := ctor_1[EStateM.Result.error] x_212 x_213;
ret x_214
Bool.true →
let x_215 : obj := proj[3] x_107;
inc x_215;
let x_216 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_217 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_216 x_195 x_1 x_215 x_2 x_3 x_4 x_5 x_6 x_196;
ret x_217
EStateM.Result.error →
dec x_148;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_218 : u8 := isShared x_194;
case x_218 : u8 of
Bool.false →
ret x_194
Bool.true →
let x_219 : obj := proj[0] x_194;
let x_220 : obj := proj[1] x_194;
inc x_220;
inc x_219;
dec x_194;
let x_221 : obj := ctor_1[EStateM.Result.error] x_219 x_220;
ret x_221
EStateM.Result.error →
dec x_148;
dec x_146;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_222 : u8 := isShared x_190;
case x_222 : u8 of
Bool.false →
ret x_190
Bool.true →
let x_223 : obj := proj[0] x_190;
let x_224 : obj := proj[1] x_190;
inc x_224;
inc x_223;
dec x_190;
let x_225 : obj := ctor_1[EStateM.Result.error] x_223 x_224;
ret x_225
Bool.true →
let x_226 : usize := 0;
let x_227 : usize := USize.ofNat x_148;
let x_228 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_229 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 x_146 x_147 x_226 x_227 x_228 x_2 x_3 x_4 x_5 x_6 x_7;
dec x_147;
let x_230 : obj := proj[0] x_229;
inc x_230;
let x_231 : obj := proj[1] x_229;
inc x_231;
dec x_229;
let x_232 : obj := proj[4] x_107;
inc x_232;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_233 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_232 x_2 x_3 x_4 x_5 x_6 x_231;
case x_233 : obj of
EStateM.Result.ok →
let x_234 : obj := proj[0] x_233;
inc x_234;
let x_235 : obj := proj[1] x_233;
inc x_235;
dec x_233;
let x_236 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_237 : obj := Lean.Compiler.LCNF.normCodeImp x_236 x_234 x_146 x_3 x_4 x_5 x_6 x_235;
case x_237 : obj of
EStateM.Result.ok →
let x_238 : obj := proj[0] x_237;
inc x_238;
let x_239 : obj := proj[1] x_237;
inc x_239;
dec x_237;
let x_240 : obj := Array.size ◾ x_230;
let x_241 : u8 := Nat.beq x_240 x_148;
dec x_148;
dec x_240;
case x_241 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_238;
let x_242 : obj := Lean.Compiler.LCNF.Code.inferType x_238 x_3 x_4 x_5 x_6 x_239;
case x_242 : obj of
EStateM.Result.ok →
let x_243 : obj := proj[0] x_242;
inc x_243;
let x_244 : obj := proj[1] x_242;
inc x_244;
dec x_242;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_230;
let x_245 : obj := Lean.Compiler.LCNF.mkForallParams x_230 x_243 x_3 x_4 x_5 x_6 x_244;
case x_245 : obj of
EStateM.Result.ok →
let x_246 : obj := proj[0] x_245;
inc x_246;
let x_247 : obj := proj[1] x_245;
inc x_247;
dec x_245;
let x_248 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_230 x_238 x_1 x_246 x_2 x_3 x_4 x_5 x_6 x_247;
ret x_248
EStateM.Result.error →
dec x_238;
dec x_230;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_249 : u8 := isShared x_245;
case x_249 : u8 of
Bool.false →
ret x_245
Bool.true →
let x_250 : obj := proj[0] x_245;
let x_251 : obj := proj[1] x_245;
inc x_251;
inc x_250;
dec x_245;
let x_252 : obj := ctor_1[EStateM.Result.error] x_250 x_251;
ret x_252
EStateM.Result.error →
dec x_238;
dec x_230;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_253 : u8 := isShared x_242;
case x_253 : u8 of
Bool.false →
ret x_242
Bool.true →
let x_254 : obj := proj[0] x_242;
let x_255 : obj := proj[1] x_242;
inc x_255;
inc x_254;
dec x_242;
let x_256 : obj := ctor_1[EStateM.Result.error] x_254 x_255;
ret x_256
Bool.true →
let x_257 : obj := proj[3] x_107;
inc x_257;
let x_258 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_230 x_238 x_1 x_257 x_2 x_3 x_4 x_5 x_6 x_239;
ret x_258
EStateM.Result.error →
dec x_230;
dec x_148;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_259 : u8 := isShared x_237;
case x_259 : u8 of
Bool.false →
ret x_237
Bool.true →
let x_260 : obj := proj[0] x_237;
let x_261 : obj := proj[1] x_237;
inc x_261;
inc x_260;
dec x_237;
let x_262 : obj := ctor_1[EStateM.Result.error] x_260 x_261;
ret x_262
EStateM.Result.error →
dec x_230;
dec x_148;
dec x_146;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_263 : u8 := isShared x_233;
case x_263 : u8 of
Bool.false →
ret x_233
Bool.true →
let x_264 : obj := proj[0] x_233;
let x_265 : obj := proj[1] x_233;
inc x_265;
inc x_264;
dec x_233;
let x_266 : obj := ctor_1[EStateM.Result.error] x_264 x_265;
ret x_266
Lean.Compiler.LCNF.Code.jmp →
let x_267 : obj := proj[0] x_1;
inc x_267;
let x_268 : obj := proj[1] x_1;
inc x_268;
block_333 (x_269 : obj) (x_270 : obj) (x_271 : obj) :=
block_320 (x_272 : obj) :=
case x_1 : obj of
Lean.Compiler.LCNF.Code.let →
dec x_272;
dec x_267;
let x_273 : u8 := isShared x_1;
case x_273 : u8 of
Bool.false →
let x_274 : obj := proj[1] x_1;
dec x_274;
let x_275 : obj := proj[0] x_1;
dec x_275;
let x_276 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
let x_277 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_276;
set x_1[1] := x_271;
set x_1[0] := x_277;
ret x_1
Bool.true →
dec x_1;
let x_278 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
let x_279 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_278;
let x_280 : obj := ctor_0[EStateM.Result.ok] x_279 x_271;
ret x_280
Lean.Compiler.LCNF.Code.jmp →
let x_281 : obj := proj[0] x_1;
inc x_281;
let x_282 : obj := proj[1] x_1;
inc x_282;
let x_283 : obj := Array.size ◾ x_272;
let x_284 : usize := USize.ofNat x_283;
dec x_283;
let x_285 : usize := 0;
let x_286 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_3 x_284 x_285 x_272;
let x_287 : u8 := Lean.Name.beq x_281 x_267;
dec x_281;
case x_287 : u8 of
Bool.false →
dec x_282;
let x_288 : u8 := isShared x_1;
case x_288 : u8 of
Bool.false →
let x_289 : obj := proj[1] x_1;
dec x_289;
let x_290 : obj := proj[0] x_1;
dec x_290;
let x_291 : u8 := isShared x_1;
case x_291 : u8 of
Bool.false →
let x_292 : obj := proj[1] x_1;
dec x_292;
let x_293 : obj := proj[0] x_1;
dec x_293;
set x_1[1] := x_286;
setTag x_1 := 0;
set x_1[1] := x_271;
set x_1[0] := x_1;
ret x_1
Bool.true →
dec x_1;
set x_1[1] := x_286;
let x_294 : obj := ctor_0[EStateM.Result.ok] x_1 x_271;
ret x_294
Bool.true →
dec x_1;
let x_295 : obj := reset[2] x_1;
let x_296 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_267 x_286;
let x_297 : obj := reuse! x_295 in ctor_0[EStateM.Result.ok] x_296 x_271;
ret x_297
Bool.true →
let x_298 : usize := ptrAddrUnsafe ◾ x_282;
dec x_282;
let x_299 : usize := ptrAddrUnsafe ◾ x_286;
let x_300 : u8 := USize.decEq x_298 x_299;
case x_300 : u8 of
Bool.false →
let x_301 : u8 := isShared x_1;
case x_301 : u8 of
Bool.false →
let x_302 : obj := proj[1] x_1;
dec x_302;
let x_303 : obj := proj[0] x_1;
dec x_303;
let x_304 : u8 := isShared x_1;
case x_304 : u8 of
Bool.false →
let x_305 : obj := proj[1] x_1;
dec x_305;
let x_306 : obj := proj[0] x_1;
dec x_306;
set x_1[1] := x_286;
setTag x_1 := 0;
set x_1[1] := x_271;
set x_1[0] := x_1;
ret x_1
Bool.true →
dec x_1;
set x_1[1] := x_286;
let x_307 : obj := ctor_0[EStateM.Result.ok] x_1 x_271;
ret x_307
Bool.true →
dec x_1;
let x_308 : obj := reset[2] x_1;
let x_309 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_267 x_286;
let x_310 : obj := reuse! x_308 in ctor_0[EStateM.Result.ok] x_309 x_271;
ret x_310
Bool.true →
dec x_286;
dec x_267;
let x_311 : obj := ctor_0[EStateM.Result.ok] x_1 x_271;
ret x_311
default →
dec x_272;
dec x_267;
let x_312 : u8 := isShared x_1;
case x_312 : u8 of
Bool.false →
let x_313 : obj := proj[1] x_1;
dec x_313;
let x_314 : obj := proj[0] x_1;
dec x_314;
let x_315 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
let x_316 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_315;
setTag x_1 := 0;
set x_1[1] := x_271;
set x_1[0] := x_316;
ret x_1
Bool.true →
dec x_1;
let x_317 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
let x_318 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_317;
let x_319 : obj := ctor_0[EStateM.Result.ok] x_318 x_271;
ret x_319;
let x_321 : obj := proj[2] x_270;
inc x_321;
dec x_270;
let x_322 : obj := Array.zip._rarg x_321 x_268;
dec x_268;
dec x_321;
let x_323 : obj := Array.size ◾ x_322;
let x_324 : obj := 0;
let x_325 : u8 := Nat.decLt x_324 x_323;
case x_325 : u8 of
Bool.false →
dec x_323;
dec x_322;
dec x_269;
let x_326 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
jmp block_320 x_326
Bool.true →
let x_327 : u8 := Nat.decLe x_323 x_323;
case x_327 : u8 of
Bool.false →
dec x_323;
dec x_322;
dec x_269;
let x_328 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
jmp block_320 x_328
Bool.true →
let x_329 : usize := 0;
let x_330 : usize := USize.ofNat x_323;
dec x_323;
let x_331 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_332 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_4 x_269 x_322 x_329 x_330 x_331;
dec x_322;
dec x_269;
jmp block_320 x_332;
inc x_267;
let x_334 : obj := Lean.Compiler.LCNF.getFunDecl x_267 x_3 x_4 x_5 x_6 x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
let x_335 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_267;
dec x_2;
case x_335 : obj of
Option.none →
case x_334 : obj of
EStateM.Result.ok →
let x_336 : obj := proj[0] x_334;
inc x_336;
let x_337 : obj := proj[1] x_334;
inc x_337;
dec x_334;
let x_338 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.isInJpScope._closed_3;
let x_339 : obj := panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_5 x_338;
jmp block_333 x_339 x_336 x_337
EStateM.Result.error →
dec x_268;
dec x_267;
dec x_1;
let x_340 : u8 := isShared x_334;
case x_340 : u8 of
Bool.false →
ret x_334
Bool.true →
let x_341 : obj := proj[0] x_334;
let x_342 : obj := proj[1] x_334;
inc x_342;
inc x_341;
dec x_334;
let x_343 : obj := ctor_1[EStateM.Result.error] x_341 x_342;
ret x_343
Option.some →
case x_334 : obj of
EStateM.Result.ok →
let x_344 : obj := proj[0] x_335;
inc x_344;
dec x_335;
let x_345 : obj := proj[0] x_334;
inc x_345;
let x_346 : obj := proj[1] x_334;
inc x_346;
dec x_334;
jmp block_333 x_344 x_345 x_346
EStateM.Result.error →
dec x_335;
dec x_268;
dec x_267;
dec x_1;
let x_347 : u8 := isShared x_334;
case x_347 : u8 of
Bool.false →
ret x_334
Bool.true →
let x_348 : obj := proj[0] x_334;
let x_349 : obj := proj[1] x_334;
inc x_349;
inc x_348;
dec x_334;
let x_350 : obj := ctor_1[EStateM.Result.error] x_348 x_349;
ret x_350
Lean.Compiler.LCNF.Code.cases →
let x_351 : obj := proj[0] x_1;
inc x_351;
let x_352 : u8 := isShared x_351;
case x_352 : u8 of
Bool.false →
let x_353 : obj := proj[0] x_351;
let x_354 : obj := proj[1] x_351;
let x_355 : obj := proj[2] x_351;
let x_356 : obj := proj[3] x_351;
let x_357 : obj := Array.size ◾ x_356;
let x_358 : usize := USize.ofNat x_357;
dec x_357;
let x_359 : usize := 0;
inc x_356;
let x_360 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_358 x_359 x_356 x_2 x_3 x_4 x_5 x_6 x_7;
case x_360 : obj of
EStateM.Result.ok →
let x_361 : u8 := isShared x_360;
case x_361 : u8 of
Bool.false →
let x_362 : obj := proj[0] x_360;
let x_363 : usize := ptrAddrUnsafe ◾ x_356;
dec x_356;
let x_364 : usize := ptrAddrUnsafe ◾ x_362;
let x_365 : u8 := USize.decEq x_363 x_364;
case x_365 : u8 of
Bool.false →
let x_366 : u8 := isShared x_1;
case x_366 : u8 of
Bool.false →
let x_367 : obj := proj[0] x_1;
dec x_367;
set x_351[3] := x_362;
set x_360[0] := x_1;
ret x_360
Bool.true →
dec x_1;
set x_351[3] := x_362;
let x_368 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
set x_360[0] := x_368;
ret x_360
Bool.true →
let x_369 : usize := ptrAddrUnsafe ◾ x_354;
let x_370 : u8 := USize.decEq x_369 x_369;
case x_370 : u8 of
Bool.false →
let x_371 : u8 := isShared x_1;
case x_371 : u8 of
Bool.false →
let x_372 : obj := proj[0] x_1;
dec x_372;
set x_351[3] := x_362;
set x_360[0] := x_1;
ret x_360
Bool.true →
dec x_1;
set x_351[3] := x_362;
let x_373 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
set x_360[0] := x_373;
ret x_360
Bool.true →
let x_374 : u8 := Lean.Name.beq x_355 x_355;
case x_374 : u8 of
Bool.false →
let x_375 : u8 := isShared x_1;
case x_375 : u8 of
Bool.false →
let x_376 : obj := proj[0] x_1;
dec x_376;
set x_351[3] := x_362;
set x_360[0] := x_1;
ret x_360
Bool.true →
dec x_1;
set x_351[3] := x_362;
let x_377 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
set x_360[0] := x_377;
ret x_360
Bool.true →
dec x_362;
del x_351;
dec x_355;
dec x_354;
dec x_353;
set x_360[0] := x_1;
ret x_360
Bool.true →
let x_378 : obj := proj[0] x_360;
let x_379 : obj := proj[1] x_360;
inc x_379;
inc x_378;
dec x_360;
let x_380 : usize := ptrAddrUnsafe ◾ x_356;
dec x_356;
let x_381 : usize := ptrAddrUnsafe ◾ x_378;
let x_382 : u8 := USize.decEq x_380 x_381;
case x_382 : u8 of
Bool.false →
let x_383 : obj := reset[1] x_1;
set x_351[3] := x_378;
let x_384 : obj := reuse x_383 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
let x_385 : obj := ctor_0[EStateM.Result.ok] x_384 x_379;
ret x_385
Bool.true →
let x_386 : usize := ptrAddrUnsafe ◾ x_354;
let x_387 : u8 := USize.decEq x_386 x_386;
case x_387 : u8 of
Bool.false →
let x_388 : obj := reset[1] x_1;
set x_351[3] := x_378;
let x_389 : obj := reuse x_388 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
let x_390 : obj := ctor_0[EStateM.Result.ok] x_389 x_379;
ret x_390
Bool.true →
let x_391 : u8 := Lean.Name.beq x_355 x_355;
case x_391 : u8 of
Bool.false →
let x_392 : obj := reset[1] x_1;
set x_351[3] := x_378;
let x_393 : obj := reuse x_392 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
let x_394 : obj := ctor_0[EStateM.Result.ok] x_393 x_379;
ret x_394
Bool.true →
dec x_378;
del x_351;
dec x_355;
dec x_354;
dec x_353;
let x_395 : obj := ctor_0[EStateM.Result.ok] x_1 x_379;
ret x_395
EStateM.Result.error →
del x_351;
dec x_356;
dec x_355;
dec x_354;
dec x_353;
dec x_1;
let x_396 : u8 := isShared x_360;
case x_396 : u8 of
Bool.false →
ret x_360
Bool.true →
let x_397 : obj := proj[0] x_360;
let x_398 : obj := proj[1] x_360;
inc x_398;
inc x_397;
dec x_360;
let x_399 : obj := ctor_1[EStateM.Result.error] x_397 x_398;
ret x_399
Bool.true →
let x_400 : obj := proj[0] x_351;
let x_401 : obj := proj[1] x_351;
let x_402 : obj := proj[2] x_351;
let x_403 : obj := proj[3] x_351;
inc x_403;
inc x_402;
inc x_401;
inc x_400;
dec x_351;
let x_404 : obj := Array.size ◾ x_403;
let x_405 : usize := USize.ofNat x_404;
dec x_404;
let x_406 : usize := 0;
inc x_403;
let x_407 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_405 x_406 x_403 x_2 x_3 x_4 x_5 x_6 x_7;
case x_407 : obj of
EStateM.Result.ok →
let x_408 : obj := proj[0] x_407;
inc x_408;
let x_409 : obj := proj[1] x_407;
inc x_409;
let x_410 : obj := reset[2] x_407;
let x_411 : usize := ptrAddrUnsafe ◾ x_403;
dec x_403;
let x_412 : usize := ptrAddrUnsafe ◾ x_408;
let x_413 : u8 := USize.decEq x_411 x_412;
case x_413 : u8 of
Bool.false →
let x_414 : obj := reset[1] x_1;
let x_415 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_400 x_401 x_402 x_408;
let x_416 : obj := reuse x_414 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_415;
let x_417 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_416 x_409;
ret x_417
Bool.true →
let x_418 : usize := ptrAddrUnsafe ◾ x_401;
let x_419 : u8 := USize.decEq x_418 x_418;
case x_419 : u8 of
Bool.false →
let x_420 : obj := reset[1] x_1;
let x_421 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_400 x_401 x_402 x_408;
let x_422 : obj := reuse x_420 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_421;
let x_423 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_422 x_409;
ret x_423
Bool.true →
let x_424 : u8 := Lean.Name.beq x_402 x_402;
case x_424 : u8 of
Bool.false →
let x_425 : obj := reset[1] x_1;
let x_426 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_400 x_401 x_402 x_408;
let x_427 : obj := reuse x_425 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_426;
let x_428 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_427 x_409;
ret x_428
Bool.true →
dec x_408;
dec x_402;
dec x_401;
dec x_400;
let x_429 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_1 x_409;
ret x_429
EStateM.Result.error →
dec x_403;
dec x_402;
dec x_401;
dec x_400;
dec x_1;
let x_430 : obj := proj[0] x_407;
inc x_430;
let x_431 : obj := proj[1] x_407;
inc x_431;
let x_432 : obj := reset[2] x_407;
let x_433 : obj := reuse x_432 in ctor_1[EStateM.Result.error] x_430 x_431;
ret x_433
default →
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_434 : obj := ctor_0[EStateM.Result.ok] x_1 x_7;
ret x_434
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) : obj :=
case x_1 : obj of
Lean.Compiler.LCNF.Code.let →
let x_8 : obj := proj[0] x_1;
inc x_8;
let x_9 : obj := proj[1] x_1;
inc x_9;
inc x_9;
let x_10 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_9 x_2 x_3 x_4 x_5 x_6 x_7;
case x_10 : obj of
EStateM.Result.ok →
let x_11 : u8 := isShared x_10;
case x_11 : u8 of
Bool.false →
let x_12 : obj := proj[0] x_10;
let x_13 : obj := proj[1] x_10;
let x_14 : usize := ptrAddrUnsafe ◾ x_9;
dec x_9;
let x_15 : usize := ptrAddrUnsafe ◾ x_12;
let x_16 : u8 := USize.decEq x_14 x_15;
case x_16 : u8 of
Bool.false →
let x_17 : u8 := isShared x_1;
case x_17 : u8 of
Bool.false →
let x_18 : obj := proj[1] x_1;
dec x_18;
let x_19 : obj := proj[0] x_1;
dec x_19;
set x_10[1] := x_12;
set x_10[0] := x_8;
set x_1[1] := x_13;
set x_1[0] := x_10;
ret x_1
Bool.true →
dec x_1;
set x_10[1] := x_12;
set x_10[0] := x_8;
let x_20 : obj := ctor_0[EStateM.Result.ok] x_10 x_13;
ret x_20
Bool.true →
let x_21 : usize := ptrAddrUnsafe ◾ x_8;
let x_22 : u8 := USize.decEq x_21 x_21;
case x_22 : u8 of
Bool.false →
let x_23 : u8 := isShared x_1;
case x_23 : u8 of
Bool.false →
let x_24 : obj := proj[1] x_1;
dec x_24;
let x_25 : obj := proj[0] x_1;
dec x_25;
set x_10[1] := x_12;
set x_10[0] := x_8;
set x_1[1] := x_13;
set x_1[0] := x_10;
ret x_1
Bool.true →
dec x_1;
set x_10[1] := x_12;
set x_10[0] := x_8;
let x_26 : obj := ctor_0[EStateM.Result.ok] x_10 x_13;
ret x_26
Bool.true →
dec x_12;
dec x_8;
set x_10[0] := x_1;
ret x_10
Bool.true →
let x_27 : obj := proj[0] x_10;
let x_28 : obj := proj[1] x_10;
inc x_28;
inc x_27;
dec x_10;
let x_29 : usize := ptrAddrUnsafe ◾ x_9;
dec x_9;
let x_30 : usize := ptrAddrUnsafe ◾ x_27;
let x_31 : u8 := USize.decEq x_29 x_30;
case x_31 : u8 of
Bool.false →
let x_32 : obj := reset[2] x_1;
let x_33 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_27;
let x_34 : obj := reuse x_32 in ctor_0[EStateM.Result.ok] x_33 x_28;
ret x_34
Bool.true →
let x_35 : usize := ptrAddrUnsafe ◾ x_8;
let x_36 : u8 := USize.decEq x_35 x_35;
case x_36 : u8 of
Bool.false →
let x_37 : obj := reset[2] x_1;
let x_38 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_27;
let x_39 : obj := reuse x_37 in ctor_0[EStateM.Result.ok] x_38 x_28;
ret x_39
Bool.true →
dec x_27;
dec x_8;
let x_40 : obj := ctor_0[EStateM.Result.ok] x_1 x_28;
ret x_40
EStateM.Result.error →
dec x_9;
dec x_8;
dec x_1;
let x_41 : u8 := isShared x_10;
case x_41 : u8 of
Bool.false →
ret x_10
Bool.true →
let x_42 : obj := proj[0] x_10;
let x_43 : obj := proj[1] x_10;
inc x_43;
inc x_42;
dec x_10;
let x_44 : obj := ctor_1[EStateM.Result.error] x_42 x_43;
ret x_44
Lean.Compiler.LCNF.Code.fun →
let x_45 : obj := proj[0] x_1;
inc x_45;
let x_46 : obj := proj[1] x_1;
inc x_46;
let x_47 : obj := proj[4] x_45;
inc x_47;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_48 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_47 x_2 x_3 x_4 x_5 x_6 x_7;
case x_48 : obj of
EStateM.Result.ok →
let x_49 : obj := proj[0] x_48;
inc x_49;
let x_50 : obj := proj[1] x_48;
inc x_50;
dec x_48;
let x_51 : obj := proj[3] x_45;
inc x_51;
let x_52 : obj := proj[2] x_45;
inc x_52;
inc x_45;
let x_53 : obj := _private.Lean.Compiler.LCNF.CompilerM.0.Lean.Compiler.LCNF.updateFunDeclImp x_45 x_51 x_52 x_49 x_3 x_4 x_5 x_6 x_50;
let x_54 : u8 := isShared x_53;
case x_54 : u8 of
Bool.false →
let x_55 : obj := proj[0] x_53;
let x_56 : obj := proj[1] x_53;
inc x_46;
let x_57 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_46 x_2 x_3 x_4 x_5 x_6 x_56;
case x_57 : obj of
EStateM.Result.ok →
let x_58 : u8 := isShared x_57;
case x_58 : u8 of
Bool.false →
let x_59 : obj := proj[0] x_57;
let x_60 : obj := proj[1] x_57;
let x_61 : usize := ptrAddrUnsafe ◾ x_46;
dec x_46;
let x_62 : usize := ptrAddrUnsafe ◾ x_59;
let x_63 : u8 := USize.decEq x_61 x_62;
case x_63 : u8 of
Bool.false →
dec x_45;
dec x_1;
setTag x_57 := 1;
set x_57[1] := x_59;
set x_57[0] := x_55;
set x_53[1] := x_60;
set x_53[0] := x_57;
ret x_53
Bool.true →
let x_64 : usize := ptrAddrUnsafe ◾ x_45;
dec x_45;
let x_65 : usize := ptrAddrUnsafe ◾ x_55;
let x_66 : u8 := USize.decEq x_64 x_65;
case x_66 : u8 of
Bool.false →
dec x_1;
setTag x_57 := 1;
set x_57[1] := x_59;
set x_57[0] := x_55;
set x_53[1] := x_60;
set x_53[0] := x_57;
ret x_53
Bool.true →
dec x_59;
del x_53;
dec x_55;
set x_57[0] := x_1;
ret x_57
Bool.true →
let x_67 : obj := proj[0] x_57;
let x_68 : obj := proj[1] x_57;
inc x_68;
inc x_67;
dec x_57;
let x_69 : usize := ptrAddrUnsafe ◾ x_46;
dec x_46;
let x_70 : usize := ptrAddrUnsafe ◾ x_67;
let x_71 : u8 := USize.decEq x_69 x_70;
case x_71 : u8 of
Bool.false →
dec x_45;
dec x_1;
let x_72 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_55 x_67;
set x_53[1] := x_68;
set x_53[0] := x_72;
ret x_53
Bool.true →
let x_73 : usize := ptrAddrUnsafe ◾ x_45;
dec x_45;
let x_74 : usize := ptrAddrUnsafe ◾ x_55;
let x_75 : u8 := USize.decEq x_73 x_74;
case x_75 : u8 of
Bool.false →
dec x_1;
let x_76 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_55 x_67;
set x_53[1] := x_68;
set x_53[0] := x_76;
ret x_53
Bool.true →
dec x_67;
del x_53;
dec x_55;
let x_77 : obj := ctor_0[EStateM.Result.ok] x_1 x_68;
ret x_77
EStateM.Result.error →
del x_53;
dec x_55;
dec x_46;
dec x_45;
dec x_1;
let x_78 : u8 := isShared x_57;
case x_78 : u8 of
Bool.false →
ret x_57
Bool.true →
let x_79 : obj := proj[0] x_57;
let x_80 : obj := proj[1] x_57;
inc x_80;
inc x_79;
dec x_57;
let x_81 : obj := ctor_1[EStateM.Result.error] x_79 x_80;
ret x_81
Bool.true →
let x_82 : obj := proj[0] x_53;
let x_83 : obj := proj[1] x_53;
inc x_83;
inc x_82;
dec x_53;
inc x_46;
let x_84 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_46 x_2 x_3 x_4 x_5 x_6 x_83;
case x_84 : obj of
EStateM.Result.ok →
let x_85 : obj := proj[0] x_84;
inc x_85;
let x_86 : obj := proj[1] x_84;
inc x_86;
let x_87 : obj := reset[2] x_84;
let x_88 : usize := ptrAddrUnsafe ◾ x_46;
dec x_46;
let x_89 : usize := ptrAddrUnsafe ◾ x_85;
let x_90 : u8 := USize.decEq x_88 x_89;
case x_90 : u8 of
Bool.false →
dec x_45;
dec x_1;
let x_91 : obj := reuse! x_87 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_82 x_85;
let x_92 : obj := ctor_0[EStateM.Result.ok] x_91 x_86;
ret x_92
Bool.true →
let x_93 : usize := ptrAddrUnsafe ◾ x_45;
dec x_45;
let x_94 : usize := ptrAddrUnsafe ◾ x_82;
let x_95 : u8 := USize.decEq x_93 x_94;
case x_95 : u8 of
Bool.false →
dec x_1;
let x_96 : obj := reuse! x_87 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_82 x_85;
let x_97 : obj := ctor_0[EStateM.Result.ok] x_96 x_86;
ret x_97
Bool.true →
dec x_85;
dec x_82;
let x_98 : obj := reuse x_87 in ctor_0[EStateM.Result.ok] x_1 x_86;
ret x_98
EStateM.Result.error →
dec x_82;
dec x_46;
dec x_45;
dec x_1;
let x_99 : obj := proj[0] x_84;
inc x_99;
let x_100 : obj := proj[1] x_84;
inc x_100;
let x_101 : obj := reset[2] x_84;
let x_102 : obj := reuse x_101 in ctor_1[EStateM.Result.error] x_99 x_100;
ret x_102
EStateM.Result.error →
dec x_46;
dec x_45;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_103 : u8 := isShared x_48;
case x_103 : u8 of
Bool.false →
ret x_48
Bool.true →
let x_104 : obj := proj[0] x_48;
let x_105 : obj := proj[1] x_48;
inc x_105;
inc x_104;
dec x_48;
let x_106 : obj := ctor_1[EStateM.Result.error] x_104 x_105;
ret x_106
Lean.Compiler.LCNF.Code.jp →
let x_107 : obj := proj[0] x_1;
inc x_107;
let x_108 : obj := proj[1] x_1;
inc x_108;
let x_109 : obj := proj[0] x_107;
inc x_109;
let x_110 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_109;
dec x_109;
case x_110 : obj of
Option.none →
inc x_108;
let x_111 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_108 x_2 x_3 x_4 x_5 x_6 x_7;
case x_111 : obj of
EStateM.Result.ok →
let x_112 : u8 := isShared x_111;
case x_112 : u8 of
Bool.false →
let x_113 : obj := proj[0] x_111;
let x_114 : obj := proj[1] x_111;
let x_115 : usize := ptrAddrUnsafe ◾ x_108;
dec x_108;
let x_116 : usize := ptrAddrUnsafe ◾ x_113;
let x_117 : u8 := USize.decEq x_115 x_116;
case x_117 : u8 of
Bool.false →
let x_118 : u8 := isShared x_1;
case x_118 : u8 of
Bool.false →
let x_119 : obj := proj[1] x_1;
dec x_119;
let x_120 : obj := proj[0] x_1;
dec x_120;
setTag x_111 := 2;
set x_111[1] := x_113;
set x_111[0] := x_107;
setTag x_1 := 0;
set x_1[1] := x_114;
set x_1[0] := x_111;
ret x_1
Bool.true →
dec x_1;
setTag x_111 := 2;
set x_111[1] := x_113;
set x_111[0] := x_107;
let x_121 : obj := ctor_0[EStateM.Result.ok] x_111 x_114;
ret x_121
Bool.true →
let x_122 : usize := ptrAddrUnsafe ◾ x_107;
let x_123 : u8 := USize.decEq x_122 x_122;
case x_123 : u8 of
Bool.false →
let x_124 : u8 := isShared x_1;
case x_124 : u8 of
Bool.false →
let x_125 : obj := proj[1] x_1;
dec x_125;
let x_126 : obj := proj[0] x_1;
dec x_126;
setTag x_111 := 2;
set x_111[1] := x_113;
set x_111[0] := x_107;
setTag x_1 := 0;
set x_1[1] := x_114;
set x_1[0] := x_111;
ret x_1
Bool.true →
dec x_1;
setTag x_111 := 2;
set x_111[1] := x_113;
set x_111[0] := x_107;
let x_127 : obj := ctor_0[EStateM.Result.ok] x_111 x_114;
ret x_127
Bool.true →
dec x_113;
dec x_107;
set x_111[0] := x_1;
ret x_111
Bool.true →
let x_128 : obj := proj[0] x_111;
let x_129 : obj := proj[1] x_111;
inc x_129;
inc x_128;
dec x_111;
let x_130 : usize := ptrAddrUnsafe ◾ x_108;
dec x_108;
let x_131 : usize := ptrAddrUnsafe ◾ x_128;
let x_132 : u8 := USize.decEq x_130 x_131;
case x_132 : u8 of
Bool.false →
let x_133 : obj := reset[2] x_1;
let x_134 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_107 x_128;
let x_135 : obj := reuse! x_133 in ctor_0[EStateM.Result.ok] x_134 x_129;
ret x_135
Bool.true →
let x_136 : usize := ptrAddrUnsafe ◾ x_107;
let x_137 : u8 := USize.decEq x_136 x_136;
case x_137 : u8 of
Bool.false →
let x_138 : obj := reset[2] x_1;
let x_139 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_107 x_128;
let x_140 : obj := reuse! x_138 in ctor_0[EStateM.Result.ok] x_139 x_129;
ret x_140
Bool.true →
dec x_128;
dec x_107;
let x_141 : obj := ctor_0[EStateM.Result.ok] x_1 x_129;
ret x_141
EStateM.Result.error →
dec x_108;
dec x_107;
dec x_1;
let x_142 : u8 := isShared x_111;
case x_142 : u8 of
Bool.false →
ret x_111
Bool.true →
let x_143 : obj := proj[0] x_111;
let x_144 : obj := proj[1] x_111;
inc x_144;
inc x_143;
dec x_111;
let x_145 : obj := ctor_1[EStateM.Result.error] x_143 x_144;
ret x_145
Option.some →
let x_146 : obj := proj[0] x_110;
inc x_146;
dec x_110;
let x_147 : obj := proj[2] x_107;
inc x_147;
let x_148 : obj := Array.size ◾ x_147;
let x_149 : obj := 0;
let x_150 : u8 := Nat.decLt x_149 x_148;
case x_150 : u8 of
Bool.false →
dec x_147;
let x_151 : obj := proj[4] x_107;
inc x_151;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_152 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_151 x_2 x_3 x_4 x_5 x_6 x_7;
case x_152 : obj of
EStateM.Result.ok →
let x_153 : obj := proj[0] x_152;
inc x_153;
let x_154 : obj := proj[1] x_152;
inc x_154;
dec x_152;
let x_155 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_156 : obj := Lean.Compiler.LCNF.normCodeImp x_155 x_153 x_146 x_3 x_4 x_5 x_6 x_154;
case x_156 : obj of
EStateM.Result.ok →
let x_157 : obj := proj[0] x_156;
inc x_157;
let x_158 : obj := proj[1] x_156;
inc x_158;
dec x_156;
let x_159 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
let x_160 : u8 := Nat.beq x_159 x_148;
dec x_148;
dec x_159;
case x_160 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_157;
let x_161 : obj := Lean.Compiler.LCNF.Code.inferType x_157 x_3 x_4 x_5 x_6 x_158;
case x_161 : obj of
EStateM.Result.ok →
let x_162 : obj := proj[0] x_161;
inc x_162;
let x_163 : obj := proj[1] x_161;
inc x_163;
dec x_161;
let x_164 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_164;
let x_165 : obj := Lean.Compiler.LCNF.mkForallParams x_164 x_162 x_3 x_4 x_5 x_6 x_163;
case x_165 : obj of
EStateM.Result.ok →
let x_166 : obj := proj[0] x_165;
inc x_166;
let x_167 : obj := proj[1] x_165;
inc x_167;
dec x_165;
let x_168 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_164 x_157 x_1 x_166 x_2 x_3 x_4 x_5 x_6 x_167;
ret x_168
EStateM.Result.error →
dec x_164;
dec x_157;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_169 : u8 := isShared x_165;
case x_169 : u8 of
Bool.false →
ret x_165
Bool.true →
let x_170 : obj := proj[0] x_165;
let x_171 : obj := proj[1] x_165;
inc x_171;
inc x_170;
dec x_165;
let x_172 : obj := ctor_1[EStateM.Result.error] x_170 x_171;
ret x_172
EStateM.Result.error →
dec x_157;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_173 : u8 := isShared x_161;
case x_173 : u8 of
Bool.false →
ret x_161
Bool.true →
let x_174 : obj := proj[0] x_161;
let x_175 : obj := proj[1] x_161;
inc x_175;
inc x_174;
dec x_161;
let x_176 : obj := ctor_1[EStateM.Result.error] x_174 x_175;
ret x_176
Bool.true →
let x_177 : obj := proj[3] x_107;
inc x_177;
let x_178 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_179 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_178 x_157 x_1 x_177 x_2 x_3 x_4 x_5 x_6 x_158;
ret x_179
EStateM.Result.error →
dec x_148;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_180 : u8 := isShared x_156;
case x_180 : u8 of
Bool.false →
ret x_156
Bool.true →
let x_181 : obj := proj[0] x_156;
let x_182 : obj := proj[1] x_156;
inc x_182;
inc x_181;
dec x_156;
let x_183 : obj := ctor_1[EStateM.Result.error] x_181 x_182;
ret x_183
EStateM.Result.error →
dec x_148;
dec x_146;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_184 : u8 := isShared x_152;
case x_184 : u8 of
Bool.false →
ret x_152
Bool.true →
let x_185 : obj := proj[0] x_152;
let x_186 : obj := proj[1] x_152;
inc x_186;
inc x_185;
dec x_152;
let x_187 : obj := ctor_1[EStateM.Result.error] x_185 x_186;
ret x_187
Bool.true →
let x_188 : u8 := Nat.decLe x_148 x_148;
case x_188 : u8 of
Bool.false →
dec x_147;
let x_189 : obj := proj[4] x_107;
inc x_189;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_190 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_189 x_2 x_3 x_4 x_5 x_6 x_7;
case x_190 : obj of
EStateM.Result.ok →
let x_191 : obj := proj[0] x_190;
inc x_191;
let x_192 : obj := proj[1] x_190;
inc x_192;
dec x_190;
let x_193 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_194 : obj := Lean.Compiler.LCNF.normCodeImp x_193 x_191 x_146 x_3 x_4 x_5 x_6 x_192;
case x_194 : obj of
EStateM.Result.ok →
let x_195 : obj := proj[0] x_194;
inc x_195;
let x_196 : obj := proj[1] x_194;
inc x_196;
dec x_194;
let x_197 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
let x_198 : u8 := Nat.beq x_197 x_148;
dec x_148;
dec x_197;
case x_198 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_195;
let x_199 : obj := Lean.Compiler.LCNF.Code.inferType x_195 x_3 x_4 x_5 x_6 x_196;
case x_199 : obj of
EStateM.Result.ok →
let x_200 : obj := proj[0] x_199;
inc x_200;
let x_201 : obj := proj[1] x_199;
inc x_201;
dec x_199;
let x_202 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_202;
let x_203 : obj := Lean.Compiler.LCNF.mkForallParams x_202 x_200 x_3 x_4 x_5 x_6 x_201;
case x_203 : obj of
EStateM.Result.ok →
let x_204 : obj := proj[0] x_203;
inc x_204;
let x_205 : obj := proj[1] x_203;
inc x_205;
dec x_203;
let x_206 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_202 x_195 x_1 x_204 x_2 x_3 x_4 x_5 x_6 x_205;
ret x_206
EStateM.Result.error →
dec x_202;
dec x_195;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_207 : u8 := isShared x_203;
case x_207 : u8 of
Bool.false →
ret x_203
Bool.true →
let x_208 : obj := proj[0] x_203;
let x_209 : obj := proj[1] x_203;
inc x_209;
inc x_208;
dec x_203;
let x_210 : obj := ctor_1[EStateM.Result.error] x_208 x_209;
ret x_210
EStateM.Result.error →
dec x_195;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_211 : u8 := isShared x_199;
case x_211 : u8 of
Bool.false →
ret x_199
Bool.true →
let x_212 : obj := proj[0] x_199;
let x_213 : obj := proj[1] x_199;
inc x_213;
inc x_212;
dec x_199;
let x_214 : obj := ctor_1[EStateM.Result.error] x_212 x_213;
ret x_214
Bool.true →
let x_215 : obj := proj[3] x_107;
inc x_215;
let x_216 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_217 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_216 x_195 x_1 x_215 x_2 x_3 x_4 x_5 x_6 x_196;
ret x_217
EStateM.Result.error →
dec x_148;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_218 : u8 := isShared x_194;
case x_218 : u8 of
Bool.false →
ret x_194
Bool.true →
let x_219 : obj := proj[0] x_194;
let x_220 : obj := proj[1] x_194;
inc x_220;
inc x_219;
dec x_194;
let x_221 : obj := ctor_1[EStateM.Result.error] x_219 x_220;
ret x_221
EStateM.Result.error →
dec x_148;
dec x_146;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_222 : u8 := isShared x_190;
case x_222 : u8 of
Bool.false →
ret x_190
Bool.true →
let x_223 : obj := proj[0] x_190;
let x_224 : obj := proj[1] x_190;
inc x_224;
inc x_223;
dec x_190;
let x_225 : obj := ctor_1[EStateM.Result.error] x_223 x_224;
ret x_225
Bool.true →
let x_226 : usize := 0;
let x_227 : usize := USize.ofNat x_148;
let x_228 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_229 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 x_146 x_147 x_226 x_227 x_228 x_2 x_3 x_4 x_5 x_6 x_7;
dec x_147;
let x_230 : obj := proj[0] x_229;
inc x_230;
let x_231 : obj := proj[1] x_229;
inc x_231;
dec x_229;
let x_232 : obj := proj[4] x_107;
inc x_232;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_233 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_232 x_2 x_3 x_4 x_5 x_6 x_231;
case x_233 : obj of
EStateM.Result.ok →
let x_234 : obj := proj[0] x_233;
inc x_234;
let x_235 : obj := proj[1] x_233;
inc x_235;
dec x_233;
let x_236 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_237 : obj := Lean.Compiler.LCNF.normCodeImp x_236 x_234 x_146 x_3 x_4 x_5 x_6 x_235;
case x_237 : obj of
EStateM.Result.ok →
let x_238 : obj := proj[0] x_237;
inc x_238;
let x_239 : obj := proj[1] x_237;
inc x_239;
dec x_237;
let x_240 : obj := Array.size ◾ x_230;
let x_241 : u8 := Nat.beq x_240 x_148;
dec x_148;
dec x_240;
case x_241 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_238;
let x_242 : obj := Lean.Compiler.LCNF.Code.inferType x_238 x_3 x_4 x_5 x_6 x_239;
case x_242 : obj of
EStateM.Result.ok →
let x_243 : obj := proj[0] x_242;
inc x_243;
let x_244 : obj := proj[1] x_242;
inc x_244;
dec x_242;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_230;
let x_245 : obj := Lean.Compiler.LCNF.mkForallParams x_230 x_243 x_3 x_4 x_5 x_6 x_244;
case x_245 : obj of
EStateM.Result.ok →
let x_246 : obj := proj[0] x_245;
inc x_246;
let x_247 : obj := proj[1] x_245;
inc x_247;
dec x_245;
let x_248 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_230 x_238 x_1 x_246 x_2 x_3 x_4 x_5 x_6 x_247;
ret x_248
EStateM.Result.error →
dec x_238;
dec x_230;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_249 : u8 := isShared x_245;
case x_249 : u8 of
Bool.false →
ret x_245
Bool.true →
let x_250 : obj := proj[0] x_245;
let x_251 : obj := proj[1] x_245;
inc x_251;
inc x_250;
dec x_245;
let x_252 : obj := ctor_1[EStateM.Result.error] x_250 x_251;
ret x_252
EStateM.Result.error →
dec x_238;
dec x_230;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_253 : u8 := isShared x_242;
case x_253 : u8 of
Bool.false →
ret x_242
Bool.true →
let x_254 : obj := proj[0] x_242;
let x_255 : obj := proj[1] x_242;
inc x_255;
inc x_254;
dec x_242;
let x_256 : obj := ctor_1[EStateM.Result.error] x_254 x_255;
ret x_256
Bool.true →
let x_257 : obj := proj[3] x_107;
inc x_257;
let x_258 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_108 x_107 x_230 x_238 x_1 x_257 x_2 x_3 x_4 x_5 x_6 x_239;
ret x_258
EStateM.Result.error →
dec x_230;
dec x_148;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_259 : u8 := isShared x_237;
case x_259 : u8 of
Bool.false →
ret x_237
Bool.true →
let x_260 : obj := proj[0] x_237;
let x_261 : obj := proj[1] x_237;
inc x_261;
inc x_260;
dec x_237;
let x_262 : obj := ctor_1[EStateM.Result.error] x_260 x_261;
ret x_262
EStateM.Result.error →
dec x_230;
dec x_148;
dec x_146;
dec x_108;
dec x_107;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_263 : u8 := isShared x_233;
case x_263 : u8 of
Bool.false →
ret x_233
Bool.true →
let x_264 : obj := proj[0] x_233;
let x_265 : obj := proj[1] x_233;
inc x_265;
inc x_264;
dec x_233;
let x_266 : obj := ctor_1[EStateM.Result.error] x_264 x_265;
ret x_266
Lean.Compiler.LCNF.Code.jmp →
let x_267 : obj := proj[0] x_1;
inc x_267;
let x_268 : obj := proj[1] x_1;
inc x_268;
block_333 (x_269 : obj) (x_270 : obj) (x_271 : obj) :=
block_320 (x_272 : obj) :=
case x_1 : obj of
Lean.Compiler.LCNF.Code.let →
dec x_272;
dec x_267;
let x_273 : u8 := isShared x_1;
case x_273 : u8 of
Bool.false →
let x_274 : obj := proj[1] x_1;
dec x_274;
let x_275 : obj := proj[0] x_1;
dec x_275;
let x_276 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
let x_277 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_276;
set x_1[1] := x_271;
set x_1[0] := x_277;
ret x_1
Bool.true →
dec x_1;
let x_278 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
let x_279 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_278;
let x_280 : obj := ctor_0[EStateM.Result.ok] x_279 x_271;
ret x_280
Lean.Compiler.LCNF.Code.jmp →
let x_281 : obj := proj[0] x_1;
inc x_281;
let x_282 : obj := proj[1] x_1;
inc x_282;
let x_283 : obj := Array.size ◾ x_272;
let x_284 : usize := USize.ofNat x_283;
dec x_283;
let x_285 : usize := 0;
let x_286 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_3 x_284 x_285 x_272;
let x_287 : u8 := Lean.Name.beq x_281 x_267;
dec x_281;
case x_287 : u8 of
Bool.false →
dec x_282;
let x_288 : u8 := isShared x_1;
case x_288 : u8 of
Bool.false →
let x_289 : obj := proj[1] x_1;
dec x_289;
let x_290 : obj := proj[0] x_1;
dec x_290;
let x_291 : u8 := isShared x_1;
case x_291 : u8 of
Bool.false →
let x_292 : obj := proj[1] x_1;
dec x_292;
let x_293 : obj := proj[0] x_1;
dec x_293;
set x_1[1] := x_286;
setTag x_1 := 0;
set x_1[1] := x_271;
set x_1[0] := x_1;
ret x_1
Bool.true →
dec x_1;
set x_1[1] := x_286;
let x_294 : obj := ctor_0[EStateM.Result.ok] x_1 x_271;
ret x_294
Bool.true →
dec x_1;
let x_295 : obj := reset[2] x_1;
let x_296 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_267 x_286;
let x_297 : obj := reuse! x_295 in ctor_0[EStateM.Result.ok] x_296 x_271;
ret x_297
Bool.true →
let x_298 : usize := ptrAddrUnsafe ◾ x_282;
dec x_282;
let x_299 : usize := ptrAddrUnsafe ◾ x_286;
let x_300 : u8 := USize.decEq x_298 x_299;
case x_300 : u8 of
Bool.false →
let x_301 : u8 := isShared x_1;
case x_301 : u8 of
Bool.false →
let x_302 : obj := proj[1] x_1;
dec x_302;
let x_303 : obj := proj[0] x_1;
dec x_303;
let x_304 : u8 := isShared x_1;
case x_304 : u8 of
Bool.false →
let x_305 : obj := proj[1] x_1;
dec x_305;
let x_306 : obj := proj[0] x_1;
dec x_306;
set x_1[1] := x_286;
setTag x_1 := 0;
set x_1[1] := x_271;
set x_1[0] := x_1;
ret x_1
Bool.true →
dec x_1;
set x_1[1] := x_286;
let x_307 : obj := ctor_0[EStateM.Result.ok] x_1 x_271;
ret x_307
Bool.true →
dec x_1;
let x_308 : obj := reset[2] x_1;
let x_309 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_267 x_286;
let x_310 : obj := reuse! x_308 in ctor_0[EStateM.Result.ok] x_309 x_271;
ret x_310
Bool.true →
dec x_286;
dec x_267;
let x_311 : obj := ctor_0[EStateM.Result.ok] x_1 x_271;
ret x_311
default →
dec x_272;
dec x_267;
let x_312 : u8 := isShared x_1;
case x_312 : u8 of
Bool.false →
let x_313 : obj := proj[1] x_1;
dec x_313;
let x_314 : obj := proj[0] x_1;
dec x_314;
let x_315 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
let x_316 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_315;
setTag x_1 := 0;
set x_1[1] := x_271;
set x_1[0] := x_316;
ret x_1
Bool.true →
dec x_1;
let x_317 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
let x_318 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_317;
let x_319 : obj := ctor_0[EStateM.Result.ok] x_318 x_271;
ret x_319;
let x_321 : obj := proj[2] x_270;
inc x_321;
dec x_270;
let x_322 : obj := Array.zip._rarg x_321 x_268;
dec x_268;
dec x_321;
let x_323 : obj := Array.size ◾ x_322;
let x_324 : obj := 0;
let x_325 : u8 := Nat.decLt x_324 x_323;
case x_325 : u8 of
Bool.false →
dec x_323;
dec x_322;
dec x_269;
let x_326 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
jmp block_320 x_326
Bool.true →
let x_327 : u8 := Nat.decLe x_323 x_323;
case x_327 : u8 of
Bool.false →
dec x_323;
dec x_322;
dec x_269;
let x_328 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
jmp block_320 x_328
Bool.true →
let x_329 : usize := 0;
let x_330 : usize := USize.ofNat x_323;
dec x_323;
let x_331 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_332 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_4 x_269 x_322 x_329 x_330 x_331;
dec x_322;
dec x_269;
jmp block_320 x_332;
inc x_267;
let x_334 : obj := Lean.Compiler.LCNF.getFunDecl x_267 x_3 x_4 x_5 x_6 x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
let x_335 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_267;
dec x_2;
case x_335 : obj of
Option.none →
case x_334 : obj of
EStateM.Result.ok →
let x_336 : obj := proj[0] x_334;
inc x_336;
let x_337 : obj := proj[1] x_334;
inc x_337;
dec x_334;
let x_338 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.isInJpScope._closed_3;
let x_339 : obj := panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_5 x_338;
jmp block_333 x_339 x_336 x_337
EStateM.Result.error →
dec x_268;
dec x_267;
dec x_1;
let x_340 : u8 := isShared x_334;
case x_340 : u8 of
Bool.false →
ret x_334
Bool.true →
let x_341 : obj := proj[0] x_334;
let x_342 : obj := proj[1] x_334;
inc x_342;
inc x_341;
dec x_334;
let x_343 : obj := ctor_1[EStateM.Result.error] x_341 x_342;
ret x_343
Option.some →
case x_334 : obj of
EStateM.Result.ok →
let x_344 : obj := proj[0] x_335;
inc x_344;
dec x_335;
let x_345 : obj := proj[0] x_334;
inc x_345;
let x_346 : obj := proj[1] x_334;
inc x_346;
dec x_334;
jmp block_333 x_344 x_345 x_346
EStateM.Result.error →
dec x_335;
dec x_268;
dec x_267;
dec x_1;
let x_347 : u8 := isShared x_334;
case x_347 : u8 of
Bool.false →
ret x_334
Bool.true →
let x_348 : obj := proj[0] x_334;
let x_349 : obj := proj[1] x_334;
inc x_349;
inc x_348;
dec x_334;
let x_350 : obj := ctor_1[EStateM.Result.error] x_348 x_349;
ret x_350
Lean.Compiler.LCNF.Code.cases →
let x_351 : obj := proj[0] x_1;
inc x_351;
let x_352 : u8 := isShared x_351;
case x_352 : u8 of
Bool.false →
let x_353 : obj := proj[0] x_351;
let x_354 : obj := proj[1] x_351;
let x_355 : obj := proj[2] x_351;
let x_356 : obj := proj[3] x_351;
let x_357 : obj := Array.size ◾ x_356;
let x_358 : usize := USize.ofNat x_357;
dec x_357;
let x_359 : usize := 0;
inc x_356;
let x_360 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_358 x_359 x_356 x_2 x_3 x_4 x_5 x_6 x_7;
case x_360 : obj of
EStateM.Result.ok →
let x_361 : u8 := isShared x_360;
case x_361 : u8 of
Bool.false →
let x_362 : obj := proj[0] x_360;
let x_363 : usize := ptrAddrUnsafe ◾ x_356;
dec x_356;
let x_364 : usize := ptrAddrUnsafe ◾ x_362;
let x_365 : u8 := USize.decEq x_363 x_364;
case x_365 : u8 of
Bool.false →
let x_366 : u8 := isShared x_1;
case x_366 : u8 of
Bool.false →
let x_367 : obj := proj[0] x_1;
dec x_367;
set x_351[3] := x_362;
set x_360[0] := x_1;
ret x_360
Bool.true →
dec x_1;
set x_351[3] := x_362;
let x_368 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
set x_360[0] := x_368;
ret x_360
Bool.true →
let x_369 : usize := ptrAddrUnsafe ◾ x_354;
let x_370 : u8 := USize.decEq x_369 x_369;
case x_370 : u8 of
Bool.false →
let x_371 : u8 := isShared x_1;
case x_371 : u8 of
Bool.false →
let x_372 : obj := proj[0] x_1;
dec x_372;
set x_351[3] := x_362;
set x_360[0] := x_1;
ret x_360
Bool.true →
dec x_1;
set x_351[3] := x_362;
let x_373 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
set x_360[0] := x_373;
ret x_360
Bool.true →
let x_374 : u8 := Lean.Name.beq x_355 x_355;
case x_374 : u8 of
Bool.false →
let x_375 : u8 := isShared x_1;
case x_375 : u8 of
Bool.false →
let x_376 : obj := proj[0] x_1;
dec x_376;
set x_351[3] := x_362;
set x_360[0] := x_1;
ret x_360
Bool.true →
dec x_1;
set x_351[3] := x_362;
let x_377 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
set x_360[0] := x_377;
ret x_360
Bool.true →
dec x_362;
del x_351;
dec x_355;
dec x_354;
dec x_353;
set x_360[0] := x_1;
ret x_360
Bool.true →
let x_378 : obj := proj[0] x_360;
let x_379 : obj := proj[1] x_360;
inc x_379;
inc x_378;
dec x_360;
let x_380 : usize := ptrAddrUnsafe ◾ x_356;
dec x_356;
let x_381 : usize := ptrAddrUnsafe ◾ x_378;
let x_382 : u8 := USize.decEq x_380 x_381;
case x_382 : u8 of
Bool.false →
let x_383 : obj := reset[1] x_1;
set x_351[3] := x_378;
let x_384 : obj := reuse x_383 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
let x_385 : obj := ctor_0[EStateM.Result.ok] x_384 x_379;
ret x_385
Bool.true →
let x_386 : usize := ptrAddrUnsafe ◾ x_354;
let x_387 : u8 := USize.decEq x_386 x_386;
case x_387 : u8 of
Bool.false →
let x_388 : obj := reset[1] x_1;
set x_351[3] := x_378;
let x_389 : obj := reuse x_388 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
let x_390 : obj := ctor_0[EStateM.Result.ok] x_389 x_379;
ret x_390
Bool.true →
let x_391 : u8 := Lean.Name.beq x_355 x_355;
case x_391 : u8 of
Bool.false →
let x_392 : obj := reset[1] x_1;
set x_351[3] := x_378;
let x_393 : obj := reuse x_392 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_351;
let x_394 : obj := ctor_0[EStateM.Result.ok] x_393 x_379;
ret x_394
Bool.true →
dec x_378;
del x_351;
dec x_355;
dec x_354;
dec x_353;
let x_395 : obj := ctor_0[EStateM.Result.ok] x_1 x_379;
ret x_395
EStateM.Result.error →
del x_351;
dec x_356;
dec x_355;
dec x_354;
dec x_353;
dec x_1;
let x_396 : u8 := isShared x_360;
case x_396 : u8 of
Bool.false →
ret x_360
Bool.true →
let x_397 : obj := proj[0] x_360;
let x_398 : obj := proj[1] x_360;
inc x_398;
inc x_397;
dec x_360;
let x_399 : obj := ctor_1[EStateM.Result.error] x_397 x_398;
ret x_399
Bool.true →
let x_400 : obj := proj[0] x_351;
let x_401 : obj := proj[1] x_351;
let x_402 : obj := proj[2] x_351;
let x_403 : obj := proj[3] x_351;
inc x_403;
inc x_402;
inc x_401;
inc x_400;
dec x_351;
let x_404 : obj := Array.size ◾ x_403;
let x_405 : usize := USize.ofNat x_404;
dec x_404;
let x_406 : usize := 0;
inc x_403;
let x_407 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_405 x_406 x_403 x_2 x_3 x_4 x_5 x_6 x_7;
case x_407 : obj of
EStateM.Result.ok →
let x_408 : obj := proj[0] x_407;
inc x_408;
let x_409 : obj := proj[1] x_407;
inc x_409;
let x_410 : obj := reset[2] x_407;
let x_411 : usize := ptrAddrUnsafe ◾ x_403;
dec x_403;
let x_412 : usize := ptrAddrUnsafe ◾ x_408;
let x_413 : u8 := USize.decEq x_411 x_412;
case x_413 : u8 of
Bool.false →
let x_414 : obj := reset[1] x_1;
let x_415 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_400 x_401 x_402 x_408;
let x_416 : obj := reuse x_414 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_415;
let x_417 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_416 x_409;
ret x_417
Bool.true →
let x_418 : usize := ptrAddrUnsafe ◾ x_401;
let x_419 : u8 := USize.decEq x_418 x_418;
case x_419 : u8 of
Bool.false →
let x_420 : obj := reset[1] x_1;
let x_421 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_400 x_401 x_402 x_408;
let x_422 : obj := reuse x_420 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_421;
let x_423 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_422 x_409;
ret x_423
Bool.true →
let x_424 : u8 := Lean.Name.beq x_402 x_402;
case x_424 : u8 of
Bool.false →
let x_425 : obj := reset[1] x_1;
let x_426 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_400 x_401 x_402 x_408;
let x_427 : obj := reuse x_425 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_426;
let x_428 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_427 x_409;
ret x_428
Bool.true →
dec x_408;
dec x_402;
dec x_401;
dec x_400;
let x_429 : obj := reuse x_410 in ctor_0[EStateM.Result.ok] x_1 x_409;
ret x_429
EStateM.Result.error →
dec x_403;
dec x_402;
dec x_401;
dec x_400;
dec x_1;
let x_430 : obj := proj[0] x_407;
inc x_430;
let x_431 : obj := proj[1] x_407;
inc x_431;
let x_432 : obj := reset[2] x_407;
let x_433 : obj := reuse x_432 in ctor_1[EStateM.Result.error] x_430 x_431;
ret x_433
default →
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_434 : obj := ctor_0[EStateM.Result.ok] x_1 x_7;
ret x_434
[result]
def ReaderT.pure._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_1._rarg (x_1 : obj) (x_2 : @& obj) (x_3 : @& obj) (x_4 : @& obj) (x_5 : @& obj) (x_6 : @& obj) (x_7 : @& obj) (x_8 : @& obj) (x_9 : obj) : obj :=
let x_10 : obj := ctor_0[EStateM.Result.ok] x_1 x_9;
ret x_10
def ReaderT.pure._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_1 (x_1 : ◾) : obj :=
let x_2 : obj := pap ReaderT.pure._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_1._rarg._boxed;
ret x_2
def ReaderT.bind._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_2._rarg (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) : obj :=
inc x_9;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_11 : obj := app x_1 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
case x_11 : obj of
EStateM.Result.ok →
let x_12 : obj := proj[0] x_11;
inc x_12;
let x_13 : obj := proj[1] x_11;
inc x_13;
dec x_11;
let x_14 : obj := app x_2 x_12 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_13;
ret x_14
EStateM.Result.error →
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_15 : u8 := isShared x_11;
case x_15 : u8 of
Bool.false →
ret x_11
Bool.true →
let x_16 : obj := proj[0] x_11;
let x_17 : obj := proj[1] x_11;
inc x_17;
inc x_16;
dec x_11;
let x_18 : obj := ctor_1[EStateM.Result.error] x_16 x_17;
ret x_18
def ReaderT.bind._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_2 (x_1 : ◾) (x_2 : ◾) : obj :=
let x_3 : obj := pap ReaderT.bind._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_2._rarg;
ret x_3
def Lean.Compiler.LCNF.ScopeM.withBackTrackingScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_4 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) : obj :=
let x_10 : obj := Lean.Compiler.LCNF.ScopeM.getScope x_4 x_5 x_6 x_7 x_8 x_9;
let x_11 : obj := proj[0] x_10;
inc x_11;
let x_12 : obj := proj[1] x_10;
inc x_12;
dec x_10;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
inc x_4;
let x_13 : obj := app x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_12;
case x_13 : obj of
EStateM.Result.ok →
let x_14 : obj := proj[0] x_13;
inc x_14;
let x_15 : obj := proj[1] x_13;
inc x_15;
dec x_13;
let x_16 : obj := Lean.Compiler.LCNF.ScopeM.setScope x_11 x_4 x_5 x_6 x_7 x_8 x_15;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
let x_17 : u8 := isShared x_16;
case x_17 : u8 of
Bool.false →
let x_18 : obj := proj[0] x_16;
dec x_18;
set x_16[0] := x_14;
ret x_16
Bool.true →
let x_19 : obj := proj[1] x_16;
inc x_19;
dec x_16;
let x_20 : obj := ctor_0[EStateM.Result.ok] x_14 x_19;
ret x_20
EStateM.Result.error →
let x_21 : obj := proj[0] x_13;
inc x_21;
let x_22 : obj := proj[1] x_13;
inc x_22;
dec x_13;
let x_23 : obj := Lean.Compiler.LCNF.ScopeM.setScope x_11 x_4 x_5 x_6 x_7 x_8 x_22;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
let x_24 : u8 := isShared x_23;
case x_24 : u8 of
Bool.false →
let x_25 : obj := proj[0] x_23;
dec x_25;
setTag x_23 := 1;
set x_23[0] := x_21;
ret x_23
Bool.true →
let x_26 : obj := proj[1] x_23;
inc x_26;
dec x_23;
let x_27 : obj := ctor_1[EStateM.Result.error] x_21 x_26;
ret x_27
def Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_3 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) : obj :=
let x_10 : obj := pap Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointFinder.find.go._spec_2._lambda_2._boxed x_1;
let x_11 : obj := Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointFinder.find.go._spec_2._closed_1;
let x_12 : obj := pap ReaderT.bind._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_2._rarg x_11 x_10;
let x_13 : obj := Lean.Compiler.LCNF.ScopeM.withBackTrackingScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_4 x_12 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9;
ret x_13
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_5 (x_1 : @& obj) (x_2 : usize) (x_3 : usize) (x_4 : obj) (x_5 : @& obj) (x_6 : @& obj) (x_7 : @& obj) (x_8 : @& obj) (x_9 : @& obj) (x_10 : @& obj) (x_11 : @& obj) (x_12 : obj) : obj :=
let x_13 : u8 := USize.decEq x_2 x_3;
case x_13 : u8 of
Bool.false →
dec x_4;
let x_14 : obj := Array.uget ◾ x_1 x_2 ◾;
let x_15 : obj := proj[0] x_14;
inc x_15;
dec x_14;
let x_16 : obj := Lean.Compiler.LCNF.ScopeM.addToScope x_15 x_7 x_8 x_9 x_10 x_11 x_12;
let x_17 : obj := proj[0] x_16;
inc x_17;
let x_18 : obj := proj[1] x_16;
inc x_18;
dec x_16;
let x_19 : usize := 1;
let x_20 : usize := USize.add x_2 x_19;
let x_21 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_5 x_1 x_20 x_3 x_17 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_18;
ret x_21
Bool.true →
let x_22 : obj := ctor_0[EStateM.Result.ok] x_4 x_12;
ret x_22
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._lambda_1 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) : obj :=
dec x_2;
let x_11 : obj := proj[4] x_1;
inc x_11;
dec x_1;
let x_12 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze x_11 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
ret x_12
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._boxed_const_1 : obj :=
let x_1 : usize := 0;
let x_2 : obj := box x_1;
ret x_2
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) : obj :=
let x_10 : obj := proj[2] x_1;
inc x_10;
let x_11 : obj := Array.size ◾ x_10;
let x_12 : obj := 0;
let x_13 : u8 := Nat.decLt x_12 x_11;
let x_14 : obj := pap Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._lambda_1 x_1;
case x_13 : u8 of
Bool.false →
dec x_11;
dec x_10;
let x_15 : obj := ctor_0[PUnit.unit];
let x_16 : obj := pap ReaderT.pure._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_1._rarg._boxed x_15;
let x_17 : obj := pap ReaderT.bind._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_2._rarg x_16 x_14;
let x_18 : obj := Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_3 x_17 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9;
ret x_18
Bool.true →
let x_19 : u8 := Nat.decLe x_11 x_11;
case x_19 : u8 of
Bool.false →
dec x_11;
dec x_10;
let x_20 : obj := ctor_0[PUnit.unit];
let x_21 : obj := pap ReaderT.pure._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_1._rarg._boxed x_20;
let x_22 : obj := pap ReaderT.bind._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_2._rarg x_21 x_14;
let x_23 : obj := Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_3 x_22 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9;
ret x_23
Bool.true →
let x_24 : usize := USize.ofNat x_11;
dec x_11;
let x_25 : obj := ctor_0[PUnit.unit];
let x_26 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._boxed_const_1;
let x_27 : obj := box x_24;
let x_28 : obj := pap Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_5._boxed x_10 x_26 x_27 x_25;
let x_29 : obj := pap ReaderT.bind._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_2._rarg x_28 x_14;
let x_30 : obj := Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_3 x_29 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9;
ret x_30
def Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 (x_1 : @& obj) (x_2 : @& obj) : obj :=
case x_1 : obj of
Lean.RBNode.leaf →
let x_3 : obj := ctor_0[Option.none];
ret x_3
Lean.RBNode.node →
let x_4 : obj := proj[0] x_1;
let x_5 : obj := proj[1] x_1;
let x_6 : obj := proj[2] x_1;
let x_7 : obj := proj[3] x_1;
let x_8 : u8 := Lean.Name.quickCmp x_2 x_5;
case x_8 : u8 of
Ordering.lt →
let x_9 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_4 x_2;
ret x_9
Ordering.eq →
inc x_6;
let x_10 : obj := ctor_1[Option.some] x_6;
ret x_10
Ordering.gt →
let x_11 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_7 x_2;
ret x_11
def Lean.Compiler.LCNF.allFVarM.go._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_3._closed_1 : obj :=
let x_1 : obj := ctor_0[PUnit.unit];
let x_2 : obj := ctor_1[Option.some] x_1;
ret x_2
def Lean.Compiler.LCNF.allFVarM.go._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_3 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) : obj :=
let x_11 : obj := app x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
case x_11 : obj of
EStateM.Result.ok →
let x_12 : obj := proj[0] x_11;
inc x_12;
let x_13 : u8 := unbox x_12;
dec x_12;
case x_13 : u8 of
Bool.false →
let x_14 : u8 := isShared x_11;
case x_14 : u8 of
Bool.false →
let x_15 : obj := proj[0] x_11;
dec x_15;
let x_16 : obj := ctor_0[Option.none];
set x_11[0] := x_16;
ret x_11
Bool.true →
let x_17 : obj := proj[1] x_11;
inc x_17;
dec x_11;
let x_18 : obj := ctor_0[Option.none];
let x_19 : obj := ctor_0[EStateM.Result.ok] x_18 x_17;
ret x_19
Bool.true →
let x_20 : u8 := isShared x_11;
case x_20 : u8 of
Bool.false →
let x_21 : obj := proj[0] x_11;
dec x_21;
let x_22 : obj := Lean.Compiler.LCNF.allFVarM.go._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_3._closed_1;
set x_11[0] := x_22;
ret x_11
Bool.true →
let x_23 : obj := proj[1] x_11;
inc x_23;
dec x_11;
let x_24 : obj := Lean.Compiler.LCNF.allFVarM.go._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_3._closed_1;
let x_25 : obj := ctor_0[EStateM.Result.ok] x_24 x_23;
ret x_25
EStateM.Result.error →
let x_26 : u8 := isShared x_11;
case x_26 : u8 of
Bool.false →
ret x_11
Bool.true →
let x_27 : obj := proj[0] x_11;
let x_28 : obj := proj[1] x_11;
inc x_28;
inc x_27;
dec x_11;
let x_29 : obj := ctor_1[EStateM.Result.error] x_27 x_28;
ret x_29
def panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_6._closed_1 : obj :=
let x_1 : obj := panic._at._private.miscompile.0.Lean.Compiler.LCNF.JoinPointFinder.removeCandidatesInArg._spec_3._closed_3;
let x_2 : obj := OptionT.instMonadOptionT._rarg x_1;
ret x_2
def panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_6._closed_2 : obj :=
let x_1 : obj := panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_6._closed_1;
let x_2 : obj := instInhabitedPUnit;
let x_3 : obj := instInhabited._rarg x_1 x_2;
ret x_3
def panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_6 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) : obj :=
let x_10 : obj := panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_6._closed_2;
let x_11 : obj := panicCore ◾ x_10 x_1;
let x_12 : obj := app x_11 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9;
ret x_12
def Lean.Compiler.LCNF.Expr.forFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_5 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) : obj :=
case x_2 : obj of
Lean.Expr.fvar._impl →
let x_11 : obj := proj[0] x_2;
inc x_11;
dec x_2;
let x_12 : obj := app x_1 x_11 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
ret x_12
Lean.Expr.mvar._impl →
dec x_2;
dec x_1;
let x_13 : obj := Lean.Compiler.LCNF.Expr.forFVarM._at._private.miscompile.0.Lean.Compiler.LCNF.JoinPointFinder.removeCandidatesInArg._spec_2._closed_4;
let x_14 : obj := panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_6 x_13 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
ret x_14
Lean.Expr.app._impl →
let x_15 : obj := proj[0] x_2;
inc x_15;
let x_16 : obj := proj[1] x_2;
inc x_16;
dec x_2;
inc x_9;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_1;
let x_17 : obj := Lean.Compiler.LCNF.Expr.forFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_5 x_1 x_15 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
case x_17 : obj of
EStateM.Result.ok →
let x_18 : obj := proj[0] x_17;
inc x_18;
case x_18 : obj of
Option.none →
dec x_16;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_1;
let x_19 : u8 := isShared x_17;
case x_19 : u8 of
Bool.false →
let x_20 : obj := proj[0] x_17;
dec x_20;
let x_21 : obj := ctor_0[Option.none];
set x_17[0] := x_21;
ret x_17
Bool.true →
let x_22 : obj := proj[1] x_17;
inc x_22;
dec x_17;
let x_23 : obj := ctor_0[Option.none];
let x_24 : obj := ctor_0[EStateM.Result.ok] x_23 x_22;
ret x_24
Option.some →
dec x_18;
let x_25 : obj := proj[1] x_17;
inc x_25;
dec x_17;
let x_26 : obj := Lean.Compiler.LCNF.Expr.forFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_5 x_1 x_16 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_25;
ret x_26
EStateM.Result.error →
dec x_16;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_1;
let x_27 : u8 := isShared x_17;
case x_27 : u8 of
Bool.false →
ret x_17
Bool.true →
let x_28 : obj := proj[0] x_17;
let x_29 : obj := proj[1] x_17;
inc x_29;
inc x_28;
dec x_17;
let x_30 : obj := ctor_1[EStateM.Result.error] x_28 x_29;
ret x_30
Lean.Expr.lam._impl →
let x_31 : obj := proj[1] x_2;
inc x_31;
let x_32 : obj := proj[2] x_2;
inc x_32;
dec x_2;
inc x_9;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_1;
let x_33 : obj := Lean.Compiler.LCNF.Expr.forFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_5 x_1 x_31 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
case x_33 : obj of
EStateM.Result.ok →
let x_34 : obj := proj[0] x_33;
inc x_34;
case x_34 : obj of
Option.none →
dec x_32;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_1;
let x_35 : u8 := isShared x_33;
case x_35 : u8 of
Bool.false →
let x_36 : obj := proj[0] x_33;
dec x_36;
let x_37 : obj := ctor_0[Option.none];
set x_33[0] := x_37;
ret x_33
Bool.true →
let x_38 : obj := proj[1] x_33;
inc x_38;
dec x_33;
let x_39 : obj := ctor_0[Option.none];
let x_40 : obj := ctor_0[EStateM.Result.ok] x_39 x_38;
ret x_40
Option.some →
dec x_34;
let x_41 : obj := proj[1] x_33;
inc x_41;
dec x_33;
let x_42 : obj := Lean.Compiler.LCNF.Expr.forFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_5 x_1 x_32 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_41;
ret x_42
EStateM.Result.error →
dec x_32;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_1;
let x_43 : u8 := isShared x_33;
case x_43 : u8 of
Bool.false →
ret x_33
Bool.true →
let x_44 : obj := proj[0] x_33;
let x_45 : obj := proj[1] x_33;
inc x_45;
inc x_44;
dec x_33;
let x_46 : obj := ctor_1[EStateM.Result.error] x_44 x_45;
ret x_46
Lean.Expr.forallE._impl →
let x_47 : obj := proj[1] x_2;
inc x_47;
let x_48 : obj := proj[2] x_2;
inc x_48;
dec x_2;
inc x_9;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_1;
let x_49 : obj := Lean.Compiler.LCNF.Expr.forFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_5 x_1 x_47 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
case x_49 : obj of
EStateM.Result.ok →
let x_50 : obj := proj[0] x_49;
inc x_50;
case x_50 : obj of
Option.none →
dec x_48;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_1;
let x_51 : u8 := isShared x_49;
case x_51 : u8 of
Bool.false →
let x_52 : obj := proj[0] x_49;
dec x_52;
let x_53 : obj := ctor_0[Option.none];
set x_49[0] := x_53;
ret x_49
Bool.true →
let x_54 : obj := proj[1] x_49;
inc x_54;
dec x_49;
let x_55 : obj := ctor_0[Option.none];
let x_56 : obj := ctor_0[EStateM.Result.ok] x_55 x_54;
ret x_56
Option.some →
dec x_50;
let x_57 : obj := proj[1] x_49;
inc x_57;
dec x_49;
let x_58 : obj := Lean.Compiler.LCNF.Expr.forFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_5 x_1 x_48 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_57;
ret x_58
EStateM.Result.error →
dec x_48;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_1;
let x_59 : u8 := isShared x_49;
case x_59 : u8 of
Bool.false →
ret x_49
Bool.true →
let x_60 : obj := proj[0] x_49;
let x_61 : obj := proj[1] x_49;
inc x_61;
inc x_60;
dec x_49;
let x_62 : obj := ctor_1[EStateM.Result.error] x_60 x_61;
ret x_62
Lean.Expr.letE._impl →
dec x_2;
dec x_1;
let x_63 : obj := Lean.Compiler.LCNF.Expr.forFVarM._at._private.miscompile.0.Lean.Compiler.LCNF.JoinPointFinder.removeCandidatesInArg._spec_2._closed_4;
let x_64 : obj := panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_6 x_63 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
ret x_64
Lean.Expr.proj._impl →
dec x_2;
dec x_1;
let x_65 : obj := Lean.Compiler.LCNF.Expr.forFVarM._at._private.miscompile.0.Lean.Compiler.LCNF.JoinPointFinder.removeCandidatesInArg._spec_2._closed_4;
let x_66 : obj := panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_6 x_65 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
ret x_66
default →
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_67 : obj := Lean.Compiler.LCNF.allFVarM.go._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_3._closed_1;
let x_68 : obj := ctor_0[EStateM.Result.ok] x_67 x_10;
ret x_68
def Lean.Compiler.LCNF.Arg.forFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_4 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) : obj :=
case x_2 : obj of
Lean.Compiler.LCNF.Arg.erased →
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_1;
let x_11 : obj := Lean.Compiler.LCNF.allFVarM.go._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_3._closed_1;
let x_12 : obj := ctor_0[EStateM.Result.ok] x_11 x_10;
ret x_12
Lean.Compiler.LCNF.Arg.fvar →
let x_13 : obj := proj[0] x_2;
inc x_13;
dec x_2;
let x_14 : obj := app x_1 x_13 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
ret x_14
Lean.Compiler.LCNF.Arg.type →
let x_15 : obj := proj[0] x_2;
inc x_15;
dec x_2;
let x_16 : obj := Lean.Compiler.LCNF.Expr.forFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_5 x_1 x_15 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
ret x_16
def Lean.Compiler.LCNF.allFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_2 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) : obj :=
let x_11 : obj := pap Lean.Compiler.LCNF.allFVarM.go._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_3 x_1;
let x_12 : obj := Lean.Compiler.LCNF.Arg.forFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_4 x_11 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
case x_12 : obj of
EStateM.Result.ok →
let x_13 : obj := proj[0] x_12;
inc x_13;
case x_13 : obj of
Option.none →
let x_14 : u8 := isShared x_12;
case x_14 : u8 of
Bool.false →
let x_15 : obj := proj[0] x_12;
dec x_15;
let x_16 : u8 := 0;
let x_17 : obj := box x_16;
set x_12[0] := x_17;
ret x_12
Bool.true →
let x_18 : obj := proj[1] x_12;
inc x_18;
dec x_12;
let x_19 : u8 := 0;
let x_20 : obj := box x_19;
let x_21 : obj := ctor_0[EStateM.Result.ok] x_20 x_18;
ret x_21
Option.some →
dec x_13;
let x_22 : u8 := isShared x_12;
case x_22 : u8 of
Bool.false →
let x_23 : obj := proj[0] x_12;
dec x_23;
let x_24 : u8 := 1;
let x_25 : obj := box x_24;
set x_12[0] := x_25;
ret x_12
Bool.true →
let x_26 : obj := proj[1] x_12;
inc x_26;
dec x_12;
let x_27 : u8 := 1;
let x_28 : obj := box x_27;
let x_29 : obj := ctor_0[EStateM.Result.ok] x_28 x_26;
ret x_29
EStateM.Result.error →
let x_30 : u8 := isShared x_12;
case x_30 : u8 of
Bool.false →
ret x_12
Bool.true →
let x_31 : obj := proj[0] x_12;
let x_32 : obj := proj[1] x_12;
inc x_32;
inc x_31;
dec x_12;
let x_33 : obj := ctor_1[EStateM.Result.error] x_31 x_32;
ret x_33
def Lean.mkHashMap._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_7 (x_1 : @& obj) : obj :=
let x_2 : obj := Lean.mkHashMapImp._rarg x_1;
ret x_2
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_8 (x_1 : obj) (x_2 : @& obj) (x_3 : usize) (x_4 : usize) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) (x_11 : obj) (x_12 : obj) (x_13 : obj) : obj :=
let x_14 : u8 := USize.decEq x_3 x_4;
case x_14 : u8 of
Bool.false →
let x_15 : obj := Array.uget ◾ x_2 x_3 ◾;
let x_16 : obj := proj[0] x_15;
inc x_16;
let x_17 : obj := proj[1] x_15;
inc x_17;
dec x_15;
inc x_1;
let x_18 : obj := pap Lean.Compiler.LCNF.JoinPointCommonArgs.isInJpScope._boxed x_1;
inc x_12;
inc x_11;
inc x_10;
inc x_9;
inc x_8;
inc x_7;
inc x_6;
inc x_17;
let x_19 : obj := Lean.Compiler.LCNF.allFVarM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_2 x_18 x_17 x_6 x_7 x_8 x_9 x_10 x_11 x_12 x_13;
case x_19 : obj of
EStateM.Result.ok →
let x_20 : obj := proj[0] x_19;
inc x_20;
let x_21 : u8 := unbox x_20;
dec x_20;
case x_21 : u8 of
Bool.false →
dec x_17;
dec x_16;
let x_22 : obj := proj[1] x_19;
inc x_22;
dec x_19;
let x_23 : usize := 1;
let x_24 : usize := USize.add x_3 x_23;
let x_25 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_8 x_1 x_2 x_24 x_4 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12 x_22;
ret x_25
Bool.true →
let x_26 : obj := proj[1] x_19;
inc x_26;
dec x_19;
let x_27 : obj := proj[0] x_16;
inc x_27;
dec x_16;
let x_28 : obj := Lean.Compiler.LCNF.Arg.toExpr x_17;
let x_29 : obj := Lean.HashMap.insert._at.Lean.Compiler.LCNF.addFVarSubst._spec_1 x_5 x_27 x_28;
let x_30 : usize := 1;
let x_31 : usize := USize.add x_3 x_30;
let x_32 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_8 x_1 x_2 x_31 x_4 x_29 x_6 x_7 x_8 x_9 x_10 x_11 x_12 x_26;
ret x_32
EStateM.Result.error →
dec x_17;
dec x_16;
dec x_12;
dec x_11;
dec x_10;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_1;
let x_33 : u8 := isShared x_19;
case x_33 : u8 of
Bool.false →
ret x_19
Bool.true →
let x_34 : obj := proj[0] x_19;
let x_35 : obj := proj[1] x_19;
inc x_35;
inc x_34;
dec x_19;
let x_36 : obj := ctor_1[EStateM.Result.error] x_34 x_35;
ret x_36
Bool.true →
dec x_12;
dec x_11;
dec x_10;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_1;
let x_37 : obj := ctor_0[EStateM.Result.ok] x_5 x_13;
ret x_37
def Lean.AssocList.erase._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_10 (x_1 : @& obj) (x_2 : obj) : obj :=
case x_2 : obj of
Lean.AssocList.nil →
let x_3 : obj := ctor_0[Lean.AssocList.nil];
ret x_3
Lean.AssocList.cons →
let x_4 : u8 := isShared x_2;
case x_4 : u8 of
Bool.false →
let x_5 : obj := proj[0] x_2;
let x_6 : obj := proj[1] x_2;
let x_7 : obj := proj[2] x_2;
let x_8 : u8 := Lean.Name.beq x_5 x_1;
case x_8 : u8 of
Bool.false →
let x_9 : obj := Lean.AssocList.erase._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_10 x_1 x_7;
set x_2[2] := x_9;
ret x_2
Bool.true →
del x_2;
dec x_6;
dec x_5;
ret x_7
Bool.true →
let x_10 : obj := proj[0] x_2;
let x_11 : obj := proj[1] x_2;
let x_12 : obj := proj[2] x_2;
inc x_12;
inc x_11;
inc x_10;
dec x_2;
let x_13 : u8 := Lean.Name.beq x_10 x_1;
case x_13 : u8 of
Bool.false →
let x_14 : obj := Lean.AssocList.erase._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_10 x_1 x_12;
let x_15 : obj := ctor_1[Lean.AssocList.cons] x_10 x_11 x_14;
ret x_15
Bool.true →
dec x_11;
dec x_10;
ret x_12
def Lean.HashMapImp.erase._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_9 (x_1 : obj) (x_2 : @& obj) : obj :=
let x_3 : obj := proj[0] x_1;
inc x_3;
let x_4 : obj := proj[1] x_1;
inc x_4;
let x_5 : obj := Array.size ◾ x_4;
let x_6 : u64 := _private.Lean.Expr.0.Lean.hashFVarId._@.Lean.Expr._hyg.1674 x_2;
let x_7 : usize := _private.Lean.Data.HashMap.0.Lean.HashMapImp.mkIdx x_5 x_6 ◾;
let x_8 : obj := Array.uget ◾ x_4 x_7 ◾;
let x_9 : u8 := Lean.AssocList.contains._at.Lean.Compiler.LCNF.addFVarSubst._spec_2 x_2 x_8;
case x_9 : u8 of
Bool.false →
dec x_8;
dec x_4;
dec x_3;
ret x_1
Bool.true →
let x_10 : u8 := isShared x_1;
case x_10 : u8 of
Bool.false →
let x_11 : obj := proj[1] x_1;
dec x_11;
let x_12 : obj := proj[0] x_1;
dec x_12;
let x_13 : obj := 1;
let x_14 : obj := Nat.sub x_3 x_13;
dec x_3;
let x_15 : obj := Lean.AssocList.erase._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_10 x_2 x_8;
let x_16 : obj := Array.uset ◾ x_4 x_7 x_15 ◾;
set x_1[1] := x_16;
set x_1[0] := x_14;
ret x_1
Bool.true →
dec x_1;
let x_17 : obj := 1;
let x_18 : obj := Nat.sub x_3 x_17;
dec x_3;
let x_19 : obj := Lean.AssocList.erase._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_10 x_2 x_8;
let x_20 : obj := Array.uset ◾ x_4 x_7 x_19 ◾;
let x_21 : obj := ctor_0[Lean.HashMapImp.mk] x_18 x_20;
ret x_21
def Array.forInUnsafe.loop._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_11 (x_1 : @& obj) (x_2 : usize) (x_3 : usize) (x_4 : obj) (x_5 : @& obj) (x_6 : @& obj) (x_7 : @& obj) (x_8 : @& obj) (x_9 : @& obj) (x_10 : @& obj) (x_11 : @& obj) (x_12 : obj) : obj :=
let x_13 : u8 := USize.decLt x_3 x_2;
case x_13 : u8 of
Bool.false →
let x_14 : obj := ctor_0[EStateM.Result.ok] x_4 x_12;
ret x_14
Bool.true →
let x_15 : obj := Array.uget ◾ x_1 x_3 ◾;
let x_16 : obj := proj[0] x_15;
inc x_16;
let x_17 : obj := proj[1] x_15;
inc x_17;
dec x_15;
let x_18 : obj := proj[0] x_16;
inc x_18;
dec x_16;
inc x_18;
inc x_4;
let x_19 : obj := Lean.HashMapImp.find?._at._private.Lean.Compiler.LCNF.CompilerM.0.Lean.Compiler.LCNF.normExprImp.go._spec_1 x_4 x_18;
case x_19 : obj of
Option.none →
dec x_18;
dec x_17;
let x_20 : usize := 1;
let x_21 : usize := USize.add x_3 x_20;
let x_22 : obj := Array.forInUnsafe.loop._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_11 x_1 x_2 x_21 x_4 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12;
ret x_22
Option.some →
let x_23 : obj := proj[0] x_19;
inc x_23;
dec x_19;
let x_24 : obj := Lean.Compiler.LCNF.Arg.toExpr x_17;
let x_25 : u8 := Lean.Expr.eqv x_24 x_23;
dec x_23;
dec x_24;
case x_25 : u8 of
Bool.false →
let x_26 : obj := Lean.HashMapImp.erase._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_9 x_4 x_18;
dec x_18;
let x_27 : usize := 1;
let x_28 : usize := USize.add x_3 x_27;
let x_29 : obj := Array.forInUnsafe.loop._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_11 x_1 x_2 x_28 x_26 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12;
ret x_29
Bool.true →
dec x_18;
let x_30 : usize := 1;
let x_31 : usize := USize.add x_3 x_30;
let x_32 : obj := Array.forInUnsafe.loop._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_11 x_1 x_2 x_31 x_4 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12;
ret x_32
def Lean.Compiler.LCNF.ScopeM.withBackTrackingScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_13 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) : obj :=
let x_10 : obj := Lean.Compiler.LCNF.ScopeM.getScope x_4 x_5 x_6 x_7 x_8 x_9;
let x_11 : obj := proj[0] x_10;
inc x_11;
let x_12 : obj := proj[1] x_10;
inc x_12;
dec x_10;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
inc x_4;
let x_13 : obj := app x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_12;
case x_13 : obj of
EStateM.Result.ok →
let x_14 : obj := proj[0] x_13;
inc x_14;
let x_15 : obj := proj[1] x_13;
inc x_15;
dec x_13;
let x_16 : obj := Lean.Compiler.LCNF.ScopeM.setScope x_11 x_4 x_5 x_6 x_7 x_8 x_15;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
let x_17 : u8 := isShared x_16;
case x_17 : u8 of
Bool.false →
let x_18 : obj := proj[0] x_16;
dec x_18;
set x_16[0] := x_14;
ret x_16
Bool.true →
let x_19 : obj := proj[1] x_16;
inc x_19;
dec x_16;
let x_20 : obj := ctor_0[EStateM.Result.ok] x_14 x_19;
ret x_20
EStateM.Result.error →
let x_21 : obj := proj[0] x_13;
inc x_21;
let x_22 : obj := proj[1] x_13;
inc x_22;
dec x_13;
let x_23 : obj := Lean.Compiler.LCNF.ScopeM.setScope x_11 x_4 x_5 x_6 x_7 x_8 x_22;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
let x_24 : u8 := isShared x_23;
case x_24 : u8 of
Bool.false →
let x_25 : obj := proj[0] x_23;
dec x_25;
setTag x_23 := 1;
set x_23[0] := x_21;
ret x_23
Bool.true →
let x_26 : obj := proj[1] x_23;
inc x_26;
dec x_23;
let x_27 : obj := ctor_1[EStateM.Result.error] x_21 x_26;
ret x_27
def Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_12 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) : obj :=
let x_10 : obj := pap Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointFinder.find.go._spec_2._lambda_2._boxed x_1;
let x_11 : obj := Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointFinder.find.go._spec_2._closed_1;
let x_12 : obj := pap ReaderT.bind._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_2._rarg x_11 x_10;
let x_13 : obj := Lean.Compiler.LCNF.ScopeM.withBackTrackingScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_13 x_12 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9;
ret x_13
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_14._lambda_1 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) : obj :=
dec x_2;
let x_11 : obj := Lean.Compiler.LCNF.AltCore.getCode x_1;
dec x_1;
let x_12 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze x_11 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10;
ret x_12
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_14._boxed_const_1 : obj :=
let x_1 : usize := 0;
let x_2 : obj := box x_1;
ret x_2
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_14 (x_1 : @& obj) (x_2 : usize) (x_3 : usize) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) (x_11 : obj) (x_12 : obj) : obj :=
let x_13 : u8 := USize.decEq x_2 x_3;
case x_13 : u8 of
Bool.false →
dec x_4;
let x_14 : obj := Array.uget ◾ x_1 x_2 ◾;
let x_15 : obj := Lean.Compiler.LCNF.AltCore.getParams x_14;
let x_16 : obj := Array.size ◾ x_15;
let x_17 : obj := 0;
let x_18 : u8 := Nat.decLt x_17 x_16;
let x_19 : obj := pap Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_14._lambda_1 x_14;
case x_18 : u8 of
Bool.false →
dec x_16;
dec x_15;
let x_20 : obj := ctor_0[PUnit.unit];
let x_21 : obj := pap ReaderT.pure._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_1._rarg._boxed x_20;
let x_22 : obj := pap ReaderT.bind._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_2._rarg x_21 x_19;
inc x_11;
inc x_10;
inc x_9;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
let x_23 : obj := Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_12 x_22 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12;
case x_23 : obj of
EStateM.Result.ok →
let x_24 : obj := proj[0] x_23;
inc x_24;
let x_25 : obj := proj[1] x_23;
inc x_25;
dec x_23;
let x_26 : usize := 1;
let x_27 : usize := USize.add x_2 x_26;
let x_28 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_14 x_1 x_27 x_3 x_24 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_25;
ret x_28
EStateM.Result.error →
dec x_11;
dec x_10;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
let x_29 : u8 := isShared x_23;
case x_29 : u8 of
Bool.false →
ret x_23
Bool.true →
let x_30 : obj := proj[0] x_23;
let x_31 : obj := proj[1] x_23;
inc x_31;
inc x_30;
dec x_23;
let x_32 : obj := ctor_1[EStateM.Result.error] x_30 x_31;
ret x_32
Bool.true →
let x_33 : u8 := Nat.decLe x_16 x_16;
case x_33 : u8 of
Bool.false →
dec x_16;
dec x_15;
let x_34 : obj := ctor_0[PUnit.unit];
let x_35 : obj := pap ReaderT.pure._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_1._rarg._boxed x_34;
let x_36 : obj := pap ReaderT.bind._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_2._rarg x_35 x_19;
inc x_11;
inc x_10;
inc x_9;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
let x_37 : obj := Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_12 x_36 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12;
case x_37 : obj of
EStateM.Result.ok →
let x_38 : obj := proj[0] x_37;
inc x_38;
let x_39 : obj := proj[1] x_37;
inc x_39;
dec x_37;
let x_40 : usize := 1;
let x_41 : usize := USize.add x_2 x_40;
let x_42 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_14 x_1 x_41 x_3 x_38 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_39;
ret x_42
EStateM.Result.error →
dec x_11;
dec x_10;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
let x_43 : u8 := isShared x_37;
case x_43 : u8 of
Bool.false →
ret x_37
Bool.true →
let x_44 : obj := proj[0] x_37;
let x_45 : obj := proj[1] x_37;
inc x_45;
inc x_44;
dec x_37;
let x_46 : obj := ctor_1[EStateM.Result.error] x_44 x_45;
ret x_46
Bool.true →
let x_47 : usize := USize.ofNat x_16;
dec x_16;
let x_48 : obj := ctor_0[PUnit.unit];
let x_49 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_14._boxed_const_1;
let x_50 : obj := box x_47;
let x_51 : obj := pap Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_5._boxed x_15 x_49 x_50 x_48;
let x_52 : obj := pap ReaderT.bind._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_2._rarg x_51 x_19;
inc x_11;
inc x_10;
inc x_9;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
let x_53 : obj := Lean.Compiler.LCNF.ScopeM.withNewScope._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_12 x_52 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12;
case x_53 : obj of
EStateM.Result.ok →
let x_54 : obj := proj[0] x_53;
inc x_54;
let x_55 : obj := proj[1] x_53;
inc x_55;
dec x_53;
let x_56 : usize := 1;
let x_57 : usize := USize.add x_2 x_56;
let x_58 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_14 x_1 x_57 x_3 x_54 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_55;
ret x_58
EStateM.Result.error →
dec x_11;
dec x_10;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
let x_59 : u8 := isShared x_53;
case x_59 : u8 of
Bool.false →
ret x_53
Bool.true →
let x_60 : obj := proj[0] x_53;
let x_61 : obj := proj[1] x_53;
inc x_61;
inc x_60;
dec x_53;
let x_62 : obj := ctor_1[EStateM.Result.error] x_60 x_61;
ret x_62
Bool.true →
dec x_11;
dec x_10;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
let x_63 : obj := ctor_0[EStateM.Result.ok] x_4 x_12;
ret x_63
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) : obj :=
case x_1 : obj of
Lean.Compiler.LCNF.Code.let →
let x_10 : obj := proj[0] x_1;
inc x_10;
let x_11 : obj := proj[1] x_1;
inc x_11;
dec x_1;
let x_12 : obj := proj[0] x_10;
inc x_12;
dec x_10;
let x_13 : obj := Lean.Compiler.LCNF.ScopeM.addToScope x_12 x_4 x_5 x_6 x_7 x_8 x_9;
let x_14 : obj := proj[1] x_13;
inc x_14;
dec x_13;
let x_15 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze x_11 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_14;
ret x_15
Lean.Compiler.LCNF.Code.fun →
let x_16 : obj := proj[0] x_1;
inc x_16;
let x_17 : obj := proj[1] x_1;
inc x_17;
dec x_1;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
inc x_16;
let x_18 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl x_16 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9;
case x_18 : obj of
EStateM.Result.ok →
let x_19 : obj := proj[1] x_18;
inc x_19;
dec x_18;
let x_20 : obj := proj[0] x_16;
inc x_20;
dec x_16;
let x_21 : obj := Lean.Compiler.LCNF.ScopeM.addToScope x_20 x_4 x_5 x_6 x_7 x_8 x_19;
let x_22 : obj := proj[1] x_21;
inc x_22;
dec x_21;
let x_23 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze x_17 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_22;
ret x_23
EStateM.Result.error →
dec x_17;
dec x_16;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_24 : u8 := isShared x_18;
case x_24 : u8 of
Bool.false →
ret x_18
Bool.true →
let x_25 : obj := proj[0] x_18;
let x_26 : obj := proj[1] x_18;
inc x_26;
inc x_25;
dec x_18;
let x_27 : obj := ctor_1[EStateM.Result.error] x_25 x_26;
ret x_27
Lean.Compiler.LCNF.Code.jp →
let x_28 : obj := proj[0] x_1;
inc x_28;
let x_29 : obj := proj[1] x_1;
inc x_29;
dec x_1;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
inc x_28;
let x_30 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl x_28 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9;
case x_30 : obj of
EStateM.Result.ok →
let x_31 : obj := proj[1] x_30;
inc x_31;
dec x_30;
let x_32 : obj := Lean.Compiler.LCNF.ScopeM.getScope x_4 x_5 x_6 x_7 x_8 x_31;
let x_33 : obj := proj[0] x_32;
inc x_33;
let x_34 : obj := proj[1] x_32;
inc x_34;
dec x_32;
let x_35 : obj := proj[0] x_28;
inc x_35;
dec x_28;
inc x_35;
let x_36 : obj := Lean.RBNode.insert._at.Lean.FVarIdMap.insert._spec_1._rarg x_2 x_35 x_33;
let x_37 : obj := Lean.Compiler.LCNF.ScopeM.addToScope x_35 x_4 x_5 x_6 x_7 x_8 x_34;
let x_38 : obj := proj[1] x_37;
inc x_38;
dec x_37;
let x_39 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze x_29 x_36 x_3 x_4 x_5 x_6 x_7 x_8 x_38;
ret x_39
EStateM.Result.error →
dec x_29;
dec x_28;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_40 : u8 := isShared x_30;
case x_40 : u8 of
Bool.false →
ret x_30
Bool.true →
let x_41 : obj := proj[0] x_30;
let x_42 : obj := proj[1] x_30;
inc x_42;
inc x_41;
dec x_30;
let x_43 : obj := ctor_1[EStateM.Result.error] x_41 x_42;
ret x_43
Lean.Compiler.LCNF.Code.jmp →
let x_44 : obj := proj[0] x_1;
inc x_44;
let x_45 : obj := proj[1] x_1;
inc x_45;
dec x_1;
inc x_44;
let x_46 : obj := Lean.Compiler.LCNF.getFunDecl x_44 x_5 x_6 x_7 x_8 x_9;
case x_46 : obj of
EStateM.Result.ok →
let x_47 : obj := proj[0] x_46;
inc x_47;
let x_48 : obj := proj[1] x_46;
inc x_48;
dec x_46;
let x_49 : obj := ST.Prim.Ref.get ◾ ◾ x_3 x_48;
let x_50 : obj := proj[0] x_49;
inc x_50;
let x_51 : obj := proj[1] x_49;
inc x_51;
dec x_49;
let x_52 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_50 x_44;
dec x_50;
case x_52 : obj of
Option.none →
let x_53 : obj := 8;
let x_54 : obj := Lean.mkHashMapImp._rarg x_53;
let x_55 : obj := proj[2] x_47;
inc x_55;
dec x_47;
let x_56 : obj := Array.zip._rarg x_55 x_45;
dec x_45;
dec x_55;
let x_57 : obj := Array.size ◾ x_56;
let x_58 : obj := 0;
let x_59 : u8 := Nat.decLt x_58 x_57;
case x_59 : u8 of
Bool.false →
dec x_57;
dec x_56;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_2;
let x_60 : obj := ST.Prim.Ref.take ◾ ◾ x_3 x_51;
let x_61 : obj := proj[0] x_60;
inc x_61;
let x_62 : obj := proj[1] x_60;
inc x_62;
dec x_60;
let x_63 : obj := Lean.RBNode.insert._at.Lean.FVarIdMap.insert._spec_1._rarg x_61 x_44 x_54;
let x_64 : obj := ST.Prim.Ref.set ◾ ◾ x_3 x_63 x_62;
dec x_3;
let x_65 : u8 := isShared x_64;
case x_65 : u8 of
Bool.false →
let x_66 : obj := proj[0] x_64;
dec x_66;
let x_67 : obj := ctor_0[PUnit.unit];
set x_64[0] := x_67;
ret x_64
Bool.true →
let x_68 : obj := proj[1] x_64;
inc x_68;
dec x_64;
let x_69 : obj := ctor_0[PUnit.unit];
let x_70 : obj := ctor_0[EStateM.Result.ok] x_69 x_68;
ret x_70
Bool.true →
let x_71 : u8 := Nat.decLe x_57 x_57;
case x_71 : u8 of
Bool.false →
dec x_57;
dec x_56;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_2;
let x_72 : obj := ST.Prim.Ref.take ◾ ◾ x_3 x_51;
let x_73 : obj := proj[0] x_72;
inc x_73;
let x_74 : obj := proj[1] x_72;
inc x_74;
dec x_72;
let x_75 : obj := Lean.RBNode.insert._at.Lean.FVarIdMap.insert._spec_1._rarg x_73 x_44 x_54;
let x_76 : obj := ST.Prim.Ref.set ◾ ◾ x_3 x_75 x_74;
dec x_3;
let x_77 : u8 := isShared x_76;
case x_77 : u8 of
Bool.false →
let x_78 : obj := proj[0] x_76;
dec x_78;
let x_79 : obj := ctor_0[PUnit.unit];
set x_76[0] := x_79;
ret x_76
Bool.true →
let x_80 : obj := proj[1] x_76;
inc x_80;
dec x_76;
let x_81 : obj := ctor_0[PUnit.unit];
let x_82 : obj := ctor_0[EStateM.Result.ok] x_81 x_80;
ret x_82
Bool.true →
let x_83 : usize := 0;
let x_84 : usize := USize.ofNat x_57;
dec x_57;
inc x_3;
inc x_44;
let x_85 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_8 x_44 x_56 x_83 x_84 x_54 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_51;
dec x_56;
case x_85 : obj of
EStateM.Result.ok →
let x_86 : obj := proj[0] x_85;
inc x_86;
let x_87 : obj := proj[1] x_85;
inc x_87;
dec x_85;
let x_88 : obj := ST.Prim.Ref.take ◾ ◾ x_3 x_87;
let x_89 : obj := proj[0] x_88;
inc x_89;
let x_90 : obj := proj[1] x_88;
inc x_90;
dec x_88;
let x_91 : obj := Lean.RBNode.insert._at.Lean.FVarIdMap.insert._spec_1._rarg x_89 x_44 x_86;
let x_92 : obj := ST.Prim.Ref.set ◾ ◾ x_3 x_91 x_90;
dec x_3;
let x_93 : u8 := isShared x_92;
case x_93 : u8 of
Bool.false →
let x_94 : obj := proj[0] x_92;
dec x_94;
let x_95 : obj := ctor_0[PUnit.unit];
set x_92[0] := x_95;
ret x_92
Bool.true →
let x_96 : obj := proj[1] x_92;
inc x_96;
dec x_92;
let x_97 : obj := ctor_0[PUnit.unit];
let x_98 : obj := ctor_0[EStateM.Result.ok] x_97 x_96;
ret x_98
EStateM.Result.error →
dec x_44;
dec x_3;
let x_99 : u8 := isShared x_85;
case x_99 : u8 of
Bool.false →
ret x_85
Bool.true →
let x_100 : obj := proj[0] x_85;
let x_101 : obj := proj[1] x_85;
inc x_101;
inc x_100;
dec x_85;
let x_102 : obj := ctor_1[EStateM.Result.error] x_100 x_101;
ret x_102
Option.some →
let x_103 : obj := proj[0] x_52;
inc x_103;
dec x_52;
let x_104 : obj := proj[2] x_47;
inc x_104;
dec x_47;
let x_105 : obj := Array.zip._rarg x_104 x_45;
dec x_45;
dec x_104;
let x_106 : obj := Array.size ◾ x_105;
let x_107 : usize := USize.ofNat x_106;
dec x_106;
let x_108 : usize := 0;
let x_109 : obj := Array.forInUnsafe.loop._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_11 x_105 x_107 x_108 x_103 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_51;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_2;
dec x_105;
let x_110 : obj := proj[0] x_109;
inc x_110;
let x_111 : obj := proj[1] x_109;
inc x_111;
dec x_109;
let x_112 : obj := ST.Prim.Ref.take ◾ ◾ x_3 x_111;
let x_113 : obj := proj[0] x_112;
inc x_113;
let x_114 : obj := proj[1] x_112;
inc x_114;
dec x_112;
let x_115 : obj := Lean.RBNode.insert._at.Lean.FVarIdMap.insert._spec_1._rarg x_113 x_44 x_110;
let x_116 : obj := ST.Prim.Ref.set ◾ ◾ x_3 x_115 x_114;
dec x_3;
let x_117 : u8 := isShared x_116;
case x_117 : u8 of
Bool.false →
let x_118 : obj := proj[0] x_116;
dec x_118;
let x_119 : obj := ctor_0[PUnit.unit];
set x_116[0] := x_119;
ret x_116
Bool.true →
let x_120 : obj := proj[1] x_116;
inc x_120;
dec x_116;
let x_121 : obj := ctor_0[PUnit.unit];
let x_122 : obj := ctor_0[EStateM.Result.ok] x_121 x_120;
ret x_122
EStateM.Result.error →
dec x_45;
dec x_44;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_123 : u8 := isShared x_46;
case x_123 : u8 of
Bool.false →
ret x_46
Bool.true →
let x_124 : obj := proj[0] x_46;
let x_125 : obj := proj[1] x_46;
inc x_125;
inc x_124;
dec x_46;
let x_126 : obj := ctor_1[EStateM.Result.error] x_124 x_125;
ret x_126
Lean.Compiler.LCNF.Code.cases →
let x_127 : obj := proj[0] x_1;
inc x_127;
dec x_1;
let x_128 : obj := proj[3] x_127;
inc x_128;
dec x_127;
let x_129 : obj := Array.size ◾ x_128;
let x_130 : obj := 0;
let x_131 : u8 := Nat.decLt x_130 x_129;
case x_131 : u8 of
Bool.false →
dec x_129;
dec x_128;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_132 : obj := ctor_0[PUnit.unit];
let x_133 : obj := ctor_0[EStateM.Result.ok] x_132 x_9;
ret x_133
Bool.true →
let x_134 : u8 := Nat.decLe x_129 x_129;
case x_134 : u8 of
Bool.false →
dec x_129;
dec x_128;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_135 : obj := ctor_0[PUnit.unit];
let x_136 : obj := ctor_0[EStateM.Result.ok] x_135 x_9;
ret x_136
Bool.true →
let x_137 : usize := 0;
let x_138 : usize := USize.ofNat x_129;
dec x_129;
let x_139 : obj := ctor_0[PUnit.unit];
let x_140 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_14 x_128 x_137 x_138 x_139 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9;
dec x_128;
ret x_140
default →
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_141 : obj := ctor_0[PUnit.unit];
let x_142 : obj := ctor_0[EStateM.Result.ok] x_141 x_9;
ret x_142
def ReaderT.pure._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_1._rarg._boxed (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) : obj :=
let x_10 : obj := ReaderT.pure._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_1._rarg x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
ret x_10
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_5._boxed (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) (x_11 : obj) (x_12 : obj) : obj :=
let x_13 : usize := unbox x_2;
dec x_2;
let x_14 : usize := unbox x_3;
dec x_3;
let x_15 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyzeFunDecl._spec_5 x_1 x_13 x_14 x_4 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12;
dec x_11;
dec x_10;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_1;
ret x_15
def Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1._boxed (x_1 : obj) (x_2 : obj) : obj :=
let x_3 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_1 x_2;
dec x_2;
dec x_1;
ret x_3
def Lean.mkHashMap._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_7._boxed (x_1 : obj) : obj :=
let x_2 : obj := Lean.mkHashMap._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_7 x_1;
dec x_1;
ret x_2
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_8._boxed (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) (x_11 : obj) (x_12 : obj) (x_13 : obj) : obj :=
let x_14 : usize := unbox x_3;
dec x_3;
let x_15 : usize := unbox x_4;
dec x_4;
let x_16 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_8 x_1 x_2 x_14 x_15 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12 x_13;
dec x_2;
ret x_16
def Lean.AssocList.erase._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_10._boxed (x_1 : obj) (x_2 : obj) : obj :=
let x_3 : obj := Lean.AssocList.erase._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_10 x_1 x_2;
dec x_1;
ret x_3
def Lean.HashMapImp.erase._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_9._boxed (x_1 : obj) (x_2 : obj) : obj :=
let x_3 : obj := Lean.HashMapImp.erase._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_9 x_1 x_2;
dec x_2;
ret x_3
def Array.forInUnsafe.loop._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_11._boxed (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) (x_11 : obj) (x_12 : obj) : obj :=
let x_13 : usize := unbox x_2;
dec x_2;
let x_14 : usize := unbox x_3;
dec x_3;
let x_15 : obj := Array.forInUnsafe.loop._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_11 x_1 x_13 x_14 x_4 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12;
dec x_11;
dec x_10;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_1;
ret x_15
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_14._boxed (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) (x_11 : obj) (x_12 : obj) : obj :=
let x_13 : usize := unbox x_2;
dec x_2;
let x_14 : usize := unbox x_3;
dec x_3;
let x_15 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_14 x_1 x_13 x_14 x_4 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12;
dec x_1;
ret x_15
[result]
def Lean.HashMapImp.contains._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_1 (x_1 : @& obj) (x_2 : @& obj) : u8 :=
let x_3 : obj := proj[1] x_1;
let x_4 : obj := Array.size ◾ x_3;
let x_5 : u64 := _private.Lean.Expr.0.Lean.hashFVarId._@.Lean.Expr._hyg.1674 x_2;
let x_6 : usize := _private.Lean.Data.HashMap.0.Lean.HashMapImp.mkIdx x_4 x_5 ◾;
let x_7 : obj := Array.uget ◾ x_3 x_6 ◾;
let x_8 : u8 := Lean.AssocList.contains._at.Lean.Compiler.LCNF.addFVarSubst._spec_2 x_2 x_7;
dec x_7;
ret x_8
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2._lambda_1 (x_1 : u8) (x_2 : @& obj) (x_3 : @& obj) (x_4 : @& obj) (x_5 : @& obj) (x_6 : @& obj) (x_7 : @& obj) (x_8 : obj) : obj :=
case x_1 : u8 of
Bool.false →
let x_9 : u8 := 1;
let x_10 : obj := box x_9;
let x_11 : obj := ctor_0[EStateM.Result.ok] x_10 x_8;
ret x_11
Bool.true →
let x_12 : u8 := 0;
let x_13 : obj := box x_12;
let x_14 : obj := ctor_0[EStateM.Result.ok] x_13 x_8;
ret x_14
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 (x_1 : @& obj) (x_2 : @& obj) (x_3 : usize) (x_4 : usize) (x_5 : obj) (x_6 : @& obj) (x_7 : @& obj) (x_8 : @& obj) (x_9 : @& obj) (x_10 : @& obj) (x_11 : obj) : obj :=
let x_12 : u8 := USize.decEq x_3 x_4;
case x_12 : u8 of
Bool.false →
let x_13 : obj := Array.uget ◾ x_2 x_3 ◾;
let x_14 : obj := proj[0] x_13;
inc x_14;
let x_15 : u8 := Lean.HashMapImp.contains._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_1 x_1 x_14;
dec x_14;
case x_15 : u8 of
Bool.false →
let x_16 : obj := ctor_0[PUnit.unit];
let x_17 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2._lambda_1 x_15 x_16 x_6 x_7 x_8 x_9 x_10 x_11;
let x_18 : obj := proj[0] x_17;
inc x_18;
let x_19 : u8 := unbox x_18;
dec x_18;
case x_19 : u8 of
Bool.false →
dec x_13;
let x_20 : obj := proj[1] x_17;
inc x_20;
dec x_17;
let x_21 : usize := 1;
let x_22 : usize := USize.add x_3 x_21;
let x_23 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 x_1 x_2 x_22 x_4 x_5 x_6 x_7 x_8 x_9 x_10 x_20;
ret x_23
Bool.true →
let x_24 : obj := proj[1] x_17;
inc x_24;
dec x_17;
let x_25 : obj := Array.push ◾ x_5 x_13;
let x_26 : usize := 1;
let x_27 : usize := USize.add x_3 x_26;
let x_28 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 x_1 x_2 x_27 x_4 x_25 x_6 x_7 x_8 x_9 x_10 x_24;
ret x_28
Bool.true →
let x_29 : obj := Lean.Compiler.LCNF.eraseParam x_13 x_7 x_8 x_9 x_10 x_11;
let x_30 : obj := proj[0] x_29;
inc x_30;
let x_31 : obj := proj[1] x_29;
inc x_31;
dec x_29;
let x_32 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2._lambda_1 x_15 x_30 x_6 x_7 x_8 x_9 x_10 x_31;
dec x_30;
let x_33 : obj := proj[0] x_32;
inc x_33;
let x_34 : u8 := unbox x_33;
dec x_33;
case x_34 : u8 of
Bool.false →
dec x_13;
let x_35 : obj := proj[1] x_32;
inc x_35;
dec x_32;
let x_36 : usize := 1;
let x_37 : usize := USize.add x_3 x_36;
let x_38 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 x_1 x_2 x_37 x_4 x_5 x_6 x_7 x_8 x_9 x_10 x_35;
ret x_38
Bool.true →
let x_39 : obj := proj[1] x_32;
inc x_39;
dec x_32;
let x_40 : obj := Array.push ◾ x_5 x_13;
let x_41 : usize := 1;
let x_42 : usize := USize.add x_3 x_41;
let x_43 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 x_1 x_2 x_42 x_4 x_40 x_6 x_7 x_8 x_9 x_10 x_39;
ret x_43
Bool.true →
let x_44 : obj := ctor_0[EStateM.Result.ok] x_5 x_11;
ret x_44
def Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_3 (x_1 : usize) (x_2 : usize) (x_3 : obj) : obj :=
let x_4 : u8 := USize.decLt x_2 x_1;
case x_4 : u8 of
Bool.false →
ret x_3
Bool.true →
let x_5 : obj := Array.uget ◾ x_3 x_2 ◾;
let x_6 : obj := 0;
let x_7 : obj := Array.uset ◾ x_3 x_2 x_6 ◾;
let x_8 : obj := proj[1] x_5;
inc x_8;
dec x_5;
let x_9 : usize := 1;
let x_10 : usize := USize.add x_2 x_9;
let x_11 : obj := Array.uset ◾ x_7 x_2 x_8 ◾;
let x_12 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_3 x_1 x_10 x_11;
ret x_12
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_4 (x_1 : @& obj) (x_2 : @& obj) (x_3 : usize) (x_4 : usize) (x_5 : obj) : obj :=
let x_6 : u8 := USize.decEq x_3 x_4;
case x_6 : u8 of
Bool.false →
let x_7 : obj := Array.uget ◾ x_2 x_3 ◾;
let x_8 : obj := proj[0] x_7;
inc x_8;
let x_9 : obj := proj[0] x_8;
inc x_9;
dec x_8;
let x_10 : usize := 1;
let x_11 : usize := USize.add x_3 x_10;
let x_12 : u8 := Lean.HashMapImp.contains._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_1 x_1 x_9;
dec x_9;
case x_12 : u8 of
Bool.false →
let x_13 : obj := Array.push ◾ x_5 x_7;
let x_14 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_4 x_1 x_2 x_11 x_4 x_13;
ret x_14
Bool.true →
dec x_7;
let x_15 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_4 x_1 x_2 x_11 x_4 x_5;
ret x_15
Bool.true →
ret x_5
def panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_5 (x_1 : obj) : obj :=
let x_2 : obj := Lean.Compiler.LCNF.JoinPointFinder.find._closed_1;
let x_3 : obj := panicCore ◾ x_2 x_1;
ret x_3
def Lean.Compiler.LCNF.AltCore.mapCodeM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_6 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) : obj :=
let x_9 : obj := Lean.Compiler.LCNF.AltCore.getCode x_1;
let x_10 : obj := app x_2 x_9 x_3 x_4 x_5 x_6 x_7 x_8;
case x_10 : obj of
EStateM.Result.ok →
let x_11 : u8 := isShared x_10;
case x_11 : u8 of
Bool.false →
let x_12 : obj := proj[0] x_10;
let x_13 : obj := _private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltCodeImp x_1 x_12;
set x_10[0] := x_13;
ret x_10
Bool.true →
let x_14 : obj := proj[0] x_10;
let x_15 : obj := proj[1] x_10;
inc x_15;
inc x_14;
dec x_10;
let x_16 : obj := _private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltCodeImp x_1 x_14;
let x_17 : obj := ctor_0[EStateM.Result.ok] x_16 x_15;
ret x_17
EStateM.Result.error →
dec x_1;
let x_18 : u8 := isShared x_10;
case x_18 : u8 of
Bool.false →
ret x_10
Bool.true →
let x_19 : obj := proj[0] x_10;
let x_20 : obj := proj[1] x_10;
inc x_20;
inc x_19;
dec x_10;
let x_21 : obj := ctor_1[EStateM.Result.error] x_19 x_20;
ret x_21
def Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7._closed_1 : obj :=
let x_1 : obj := pap Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce;
ret x_1
def Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 (x_1 : usize) (x_2 : usize) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) : obj :=
let x_10 : u8 := USize.decLt x_2 x_1;
case x_10 : u8 of
Bool.false →
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
let x_11 : obj := ctor_0[EStateM.Result.ok] x_3 x_9;
ret x_11
Bool.true →
let x_12 : obj := Array.uget ◾ x_3 x_2 ◾;
let x_13 : obj := 0;
let x_14 : obj := Array.uset ◾ x_3 x_2 x_13 ◾;
let x_15 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7._closed_1;
inc x_8;
inc x_7;
inc x_6;
inc x_5;
inc x_4;
let x_16 : obj := Lean.Compiler.LCNF.AltCore.mapCodeM._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_6 x_12 x_15 x_4 x_5 x_6 x_7 x_8 x_9;
case x_16 : obj of
EStateM.Result.ok →
let x_17 : obj := proj[0] x_16;
inc x_17;
let x_18 : obj := proj[1] x_16;
inc x_18;
dec x_16;
let x_19 : usize := 1;
let x_20 : usize := USize.add x_2 x_19;
let x_21 : obj := Array.uset ◾ x_14 x_2 x_17 ◾;
let x_22 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_1 x_20 x_21 x_4 x_5 x_6 x_7 x_8 x_18;
ret x_22
EStateM.Result.error →
dec x_14;
dec x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
let x_23 : u8 := isShared x_16;
case x_23 : u8 of
Bool.false →
ret x_16
Bool.true →
let x_24 : obj := proj[0] x_16;
let x_25 : obj := proj[1] x_16;
inc x_25;
inc x_24;
dec x_16;
let x_26 : obj := ctor_1[EStateM.Result.error] x_24 x_25;
ret x_26
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) (x_11 : obj) (x_12 : obj) : obj :=
inc x_11;
inc x_10;
inc x_9;
inc x_8;
inc x_1;
let x_13 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_1 x_7 x_8 x_9 x_10 x_11 x_12;
case x_13 : obj of
EStateM.Result.ok →
let x_14 : obj := proj[0] x_13;
inc x_14;
let x_15 : obj := proj[1] x_13;
inc x_15;
dec x_13;
inc x_2;
let x_16 : obj := _private.Lean.Compiler.LCNF.CompilerM.0.Lean.Compiler.LCNF.updateFunDeclImp x_2 x_6 x_3 x_4 x_8 x_9 x_10 x_11 x_15;
dec x_11;
dec x_10;
dec x_9;
dec x_8;
let x_17 : u8 := isShared x_16;
case x_17 : u8 of
Bool.false →
let x_18 : obj := proj[0] x_16;
let x_19 : usize := ptrAddrUnsafe ◾ x_1;
dec x_1;
let x_20 : usize := ptrAddrUnsafe ◾ x_14;
let x_21 : u8 := USize.decEq x_19 x_20;
case x_21 : u8 of
Bool.false →
dec x_5;
dec x_2;
let x_22 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_18 x_14;
set x_16[0] := x_22;
ret x_16
Bool.true →
let x_23 : usize := ptrAddrUnsafe ◾ x_2;
dec x_2;
let x_24 : usize := ptrAddrUnsafe ◾ x_18;
let x_25 : u8 := USize.decEq x_23 x_24;
case x_25 : u8 of
Bool.false →
dec x_5;
let x_26 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_18 x_14;
set x_16[0] := x_26;
ret x_16
Bool.true →
dec x_18;
dec x_14;
set x_16[0] := x_5;
ret x_16
Bool.true →
let x_27 : obj := proj[0] x_16;
let x_28 : obj := proj[1] x_16;
inc x_28;
inc x_27;
dec x_16;
let x_29 : usize := ptrAddrUnsafe ◾ x_1;
dec x_1;
let x_30 : usize := ptrAddrUnsafe ◾ x_14;
let x_31 : u8 := USize.decEq x_29 x_30;
case x_31 : u8 of
Bool.false →
dec x_5;
dec x_2;
let x_32 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_27 x_14;
let x_33 : obj := ctor_0[EStateM.Result.ok] x_32 x_28;
ret x_33
Bool.true →
let x_34 : usize := ptrAddrUnsafe ◾ x_2;
dec x_2;
let x_35 : usize := ptrAddrUnsafe ◾ x_27;
let x_36 : u8 := USize.decEq x_34 x_35;
case x_36 : u8 of
Bool.false →
dec x_5;
let x_37 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_27 x_14;
let x_38 : obj := ctor_0[EStateM.Result.ok] x_37 x_28;
ret x_38
Bool.true →
dec x_27;
dec x_14;
let x_39 : obj := ctor_0[EStateM.Result.ok] x_5 x_28;
ret x_39
EStateM.Result.error →
dec x_11;
dec x_10;
dec x_9;
dec x_8;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_40 : u8 := isShared x_13;
case x_40 : u8 of
Bool.false →
ret x_13
Bool.true →
let x_41 : obj := proj[0] x_13;
let x_42 : obj := proj[1] x_13;
inc x_42;
inc x_41;
dec x_13;
let x_43 : obj := ctor_1[EStateM.Result.error] x_41 x_42;
ret x_43
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1 : obj :=
let x_1 : obj := 0;
let x_2 : obj := Array.mkEmpty ◾ x_1;
ret x_2
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2 : obj :=
let x_1 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_2 : obj := Array.size ◾ x_1;
dec x_1;
ret x_2
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_3 : obj :=
let x_1 : obj := "Lean.Compiler.LCNF.Basic";
ret x_1
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_4 : obj :=
let x_1 : obj := "_private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateJmpImp";
ret x_1
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5 : obj :=
let x_1 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_3;
let x_2 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_4;
let x_3 : obj := 318;
let x_4 : obj := 9;
let x_5 : obj := Lean.Compiler.LCNF.Expr.forFVarM._at._private.miscompile.0.Lean.Compiler.LCNF.JoinPointFinder.removeCandidatesInArg._spec_2._closed_3;
let x_6 : obj := _private.Init.Util.0.mkPanicMessageWithDecl x_1 x_2 x_3 x_4 x_5;
dec x_5;
dec x_2;
dec x_1;
ret x_6
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) : obj :=
case x_1 : obj of
Lean.Compiler.LCNF.Code.let →
let x_8 : obj := proj[0] x_1;
inc x_8;
let x_9 : obj := proj[1] x_1;
inc x_9;
inc x_9;
let x_10 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_9 x_2 x_3 x_4 x_5 x_6 x_7;
case x_10 : obj of
EStateM.Result.ok →
let x_11 : u8 := isShared x_10;
case x_11 : u8 of
Bool.false →
let x_12 : obj := proj[0] x_10;
let x_13 : usize := ptrAddrUnsafe ◾ x_9;
dec x_9;
let x_14 : usize := ptrAddrUnsafe ◾ x_12;
let x_15 : u8 := USize.decEq x_13 x_14;
case x_15 : u8 of
Bool.false →
let x_16 : u8 := isShared x_1;
case x_16 : u8 of
Bool.false →
let x_17 : obj := proj[1] x_1;
dec x_17;
let x_18 : obj := proj[0] x_1;
dec x_18;
set x_1[1] := x_12;
set x_10[0] := x_1;
ret x_10
Bool.true →
dec x_1;
let x_19 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_12;
set x_10[0] := x_19;
ret x_10
Bool.true →
let x_20 : usize := ptrAddrUnsafe ◾ x_8;
let x_21 : u8 := USize.decEq x_20 x_20;
case x_21 : u8 of
Bool.false →
let x_22 : u8 := isShared x_1;
case x_22 : u8 of
Bool.false →
let x_23 : obj := proj[1] x_1;
dec x_23;
let x_24 : obj := proj[0] x_1;
dec x_24;
set x_1[1] := x_12;
set x_10[0] := x_1;
ret x_10
Bool.true →
dec x_1;
let x_25 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_12;
set x_10[0] := x_25;
ret x_10
Bool.true →
dec x_12;
dec x_8;
set x_10[0] := x_1;
ret x_10
Bool.true →
let x_26 : obj := proj[0] x_10;
let x_27 : obj := proj[1] x_10;
inc x_27;
inc x_26;
dec x_10;
let x_28 : usize := ptrAddrUnsafe ◾ x_9;
dec x_9;
let x_29 : usize := ptrAddrUnsafe ◾ x_26;
let x_30 : u8 := USize.decEq x_28 x_29;
case x_30 : u8 of
Bool.false →
let x_31 : obj := reset[2] x_1;
let x_32 : obj := reuse x_31 in ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_26;
let x_33 : obj := ctor_0[EStateM.Result.ok] x_32 x_27;
ret x_33
Bool.true →
let x_34 : usize := ptrAddrUnsafe ◾ x_8;
let x_35 : u8 := USize.decEq x_34 x_34;
case x_35 : u8 of
Bool.false →
let x_36 : obj := reset[2] x_1;
let x_37 : obj := reuse x_36 in ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_26;
let x_38 : obj := ctor_0[EStateM.Result.ok] x_37 x_27;
ret x_38
Bool.true →
dec x_26;
dec x_8;
let x_39 : obj := ctor_0[EStateM.Result.ok] x_1 x_27;
ret x_39
EStateM.Result.error →
dec x_9;
dec x_8;
dec x_1;
let x_40 : u8 := isShared x_10;
case x_40 : u8 of
Bool.false →
ret x_10
Bool.true →
let x_41 : obj := proj[0] x_10;
let x_42 : obj := proj[1] x_10;
inc x_42;
inc x_41;
dec x_10;
let x_43 : obj := ctor_1[EStateM.Result.error] x_41 x_42;
ret x_43
Lean.Compiler.LCNF.Code.fun →
let x_44 : obj := proj[0] x_1;
inc x_44;
let x_45 : obj := proj[1] x_1;
inc x_45;
let x_46 : obj := proj[4] x_44;
inc x_46;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_47 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_46 x_2 x_3 x_4 x_5 x_6 x_7;
case x_47 : obj of
EStateM.Result.ok →
let x_48 : obj := proj[0] x_47;
inc x_48;
let x_49 : obj := proj[1] x_47;
inc x_49;
dec x_47;
let x_50 : obj := proj[3] x_44;
inc x_50;
let x_51 : obj := proj[2] x_44;
inc x_51;
inc x_44;
let x_52 : obj := _private.Lean.Compiler.LCNF.CompilerM.0.Lean.Compiler.LCNF.updateFunDeclImp x_44 x_50 x_51 x_48 x_3 x_4 x_5 x_6 x_49;
let x_53 : obj := proj[0] x_52;
inc x_53;
let x_54 : obj := proj[1] x_52;
inc x_54;
dec x_52;
inc x_45;
let x_55 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_45 x_2 x_3 x_4 x_5 x_6 x_54;
case x_55 : obj of
EStateM.Result.ok →
let x_56 : u8 := isShared x_55;
case x_56 : u8 of
Bool.false →
let x_57 : obj := proj[0] x_55;
let x_58 : usize := ptrAddrUnsafe ◾ x_45;
dec x_45;
let x_59 : usize := ptrAddrUnsafe ◾ x_57;
let x_60 : u8 := USize.decEq x_58 x_59;
case x_60 : u8 of
Bool.false →
dec x_44;
let x_61 : u8 := isShared x_1;
case x_61 : u8 of
Bool.false →
let x_62 : obj := proj[1] x_1;
dec x_62;
let x_63 : obj := proj[0] x_1;
dec x_63;
set x_1[1] := x_57;
set x_1[0] := x_53;
set x_55[0] := x_1;
ret x_55
Bool.true →
dec x_1;
let x_64 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_57;
set x_55[0] := x_64;
ret x_55
Bool.true →
let x_65 : usize := ptrAddrUnsafe ◾ x_44;
dec x_44;
let x_66 : usize := ptrAddrUnsafe ◾ x_53;
let x_67 : u8 := USize.decEq x_65 x_66;
case x_67 : u8 of
Bool.false →
let x_68 : u8 := isShared x_1;
case x_68 : u8 of
Bool.false →
let x_69 : obj := proj[1] x_1;
dec x_69;
let x_70 : obj := proj[0] x_1;
dec x_70;
set x_1[1] := x_57;
set x_1[0] := x_53;
set x_55[0] := x_1;
ret x_55
Bool.true →
dec x_1;
let x_71 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_57;
set x_55[0] := x_71;
ret x_55
Bool.true →
dec x_57;
dec x_53;
set x_55[0] := x_1;
ret x_55
Bool.true →
let x_72 : obj := proj[0] x_55;
let x_73 : obj := proj[1] x_55;
inc x_73;
inc x_72;
dec x_55;
let x_74 : usize := ptrAddrUnsafe ◾ x_45;
dec x_45;
let x_75 : usize := ptrAddrUnsafe ◾ x_72;
let x_76 : u8 := USize.decEq x_74 x_75;
case x_76 : u8 of
Bool.false →
dec x_44;
let x_77 : obj := reset[2] x_1;
let x_78 : obj := reuse x_77 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_72;
let x_79 : obj := ctor_0[EStateM.Result.ok] x_78 x_73;
ret x_79
Bool.true →
let x_80 : usize := ptrAddrUnsafe ◾ x_44;
dec x_44;
let x_81 : usize := ptrAddrUnsafe ◾ x_53;
let x_82 : u8 := USize.decEq x_80 x_81;
case x_82 : u8 of
Bool.false →
let x_83 : obj := reset[2] x_1;
let x_84 : obj := reuse x_83 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_72;
let x_85 : obj := ctor_0[EStateM.Result.ok] x_84 x_73;
ret x_85
Bool.true →
dec x_72;
dec x_53;
let x_86 : obj := ctor_0[EStateM.Result.ok] x_1 x_73;
ret x_86
EStateM.Result.error →
dec x_53;
dec x_45;
dec x_44;
dec x_1;
let x_87 : u8 := isShared x_55;
case x_87 : u8 of
Bool.false →
ret x_55
Bool.true →
let x_88 : obj := proj[0] x_55;
let x_89 : obj := proj[1] x_55;
inc x_89;
inc x_88;
dec x_55;
let x_90 : obj := ctor_1[EStateM.Result.error] x_88 x_89;
ret x_90
EStateM.Result.error →
dec x_45;
dec x_44;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_91 : u8 := isShared x_47;
case x_91 : u8 of
Bool.false →
ret x_47
Bool.true →
let x_92 : obj := proj[0] x_47;
let x_93 : obj := proj[1] x_47;
inc x_93;
inc x_92;
dec x_47;
let x_94 : obj := ctor_1[EStateM.Result.error] x_92 x_93;
ret x_94
Lean.Compiler.LCNF.Code.jp →
let x_95 : obj := proj[0] x_1;
inc x_95;
let x_96 : obj := proj[1] x_1;
inc x_96;
let x_97 : obj := proj[0] x_95;
inc x_97;
let x_98 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_97;
dec x_97;
case x_98 : obj of
Option.none →
inc x_96;
let x_99 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_96 x_2 x_3 x_4 x_5 x_6 x_7;
case x_99 : obj of
EStateM.Result.ok →
let x_100 : u8 := isShared x_99;
case x_100 : u8 of
Bool.false →
let x_101 : obj := proj[0] x_99;
let x_102 : usize := ptrAddrUnsafe ◾ x_96;
dec x_96;
let x_103 : usize := ptrAddrUnsafe ◾ x_101;
let x_104 : u8 := USize.decEq x_102 x_103;
case x_104 : u8 of
Bool.false →
let x_105 : u8 := isShared x_1;
case x_105 : u8 of
Bool.false →
let x_106 : obj := proj[1] x_1;
dec x_106;
let x_107 : obj := proj[0] x_1;
dec x_107;
set x_1[1] := x_101;
set x_99[0] := x_1;
ret x_99
Bool.true →
dec x_1;
let x_108 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_101;
set x_99[0] := x_108;
ret x_99
Bool.true →
let x_109 : usize := ptrAddrUnsafe ◾ x_95;
let x_110 : u8 := USize.decEq x_109 x_109;
case x_110 : u8 of
Bool.false →
let x_111 : u8 := isShared x_1;
case x_111 : u8 of
Bool.false →
let x_112 : obj := proj[1] x_1;
dec x_112;
let x_113 : obj := proj[0] x_1;
dec x_113;
set x_1[1] := x_101;
set x_99[0] := x_1;
ret x_99
Bool.true →
dec x_1;
let x_114 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_101;
set x_99[0] := x_114;
ret x_99
Bool.true →
dec x_101;
dec x_95;
set x_99[0] := x_1;
ret x_99
Bool.true →
let x_115 : obj := proj[0] x_99;
let x_116 : obj := proj[1] x_99;
inc x_116;
inc x_115;
dec x_99;
let x_117 : usize := ptrAddrUnsafe ◾ x_96;
dec x_96;
let x_118 : usize := ptrAddrUnsafe ◾ x_115;
let x_119 : u8 := USize.decEq x_117 x_118;
case x_119 : u8 of
Bool.false →
let x_120 : obj := reset[2] x_1;
let x_121 : obj := reuse x_120 in ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_115;
let x_122 : obj := ctor_0[EStateM.Result.ok] x_121 x_116;
ret x_122
Bool.true →
let x_123 : usize := ptrAddrUnsafe ◾ x_95;
let x_124 : u8 := USize.decEq x_123 x_123;
case x_124 : u8 of
Bool.false →
let x_125 : obj := reset[2] x_1;
let x_126 : obj := reuse x_125 in ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_115;
let x_127 : obj := ctor_0[EStateM.Result.ok] x_126 x_116;
ret x_127
Bool.true →
dec x_115;
dec x_95;
let x_128 : obj := ctor_0[EStateM.Result.ok] x_1 x_116;
ret x_128
EStateM.Result.error →
dec x_96;
dec x_95;
dec x_1;
let x_129 : u8 := isShared x_99;
case x_129 : u8 of
Bool.false →
ret x_99
Bool.true →
let x_130 : obj := proj[0] x_99;
let x_131 : obj := proj[1] x_99;
inc x_131;
inc x_130;
dec x_99;
let x_132 : obj := ctor_1[EStateM.Result.error] x_130 x_131;
ret x_132
Option.some →
let x_133 : obj := proj[0] x_98;
inc x_133;
dec x_98;
let x_134 : obj := proj[2] x_95;
inc x_134;
let x_135 : obj := Array.size ◾ x_134;
let x_136 : obj := 0;
let x_137 : u8 := Nat.decLt x_136 x_135;
case x_137 : u8 of
Bool.false →
dec x_134;
let x_138 : obj := proj[4] x_95;
inc x_138;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_139 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_138 x_2 x_3 x_4 x_5 x_6 x_7;
case x_139 : obj of
EStateM.Result.ok →
let x_140 : obj := proj[0] x_139;
inc x_140;
let x_141 : obj := proj[1] x_139;
inc x_141;
dec x_139;
let x_142 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_143 : obj := Lean.Compiler.LCNF.normCodeImp x_142 x_140 x_133 x_3 x_4 x_5 x_6 x_141;
case x_143 : obj of
EStateM.Result.ok →
let x_144 : obj := proj[0] x_143;
inc x_144;
let x_145 : obj := proj[1] x_143;
inc x_145;
dec x_143;
let x_146 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
let x_147 : u8 := Nat.beq x_146 x_135;
dec x_135;
dec x_146;
case x_147 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_144;
let x_148 : obj := Lean.Compiler.LCNF.Code.inferType x_144 x_3 x_4 x_5 x_6 x_145;
case x_148 : obj of
EStateM.Result.ok →
let x_149 : obj := proj[0] x_148;
inc x_149;
let x_150 : obj := proj[1] x_148;
inc x_150;
dec x_148;
let x_151 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_151;
let x_152 : obj := Lean.Compiler.LCNF.mkForallParams x_151 x_149 x_3 x_4 x_5 x_6 x_150;
case x_152 : obj of
EStateM.Result.ok →
let x_153 : obj := proj[0] x_152;
inc x_153;
let x_154 : obj := proj[1] x_152;
inc x_154;
dec x_152;
let x_155 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_151 x_144 x_1 x_153 x_2 x_3 x_4 x_5 x_6 x_154;
ret x_155
EStateM.Result.error →
dec x_151;
dec x_144;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_156 : u8 := isShared x_152;
case x_156 : u8 of
Bool.false →
ret x_152
Bool.true →
let x_157 : obj := proj[0] x_152;
let x_158 : obj := proj[1] x_152;
inc x_158;
inc x_157;
dec x_152;
let x_159 : obj := ctor_1[EStateM.Result.error] x_157 x_158;
ret x_159
EStateM.Result.error →
dec x_144;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_160 : u8 := isShared x_148;
case x_160 : u8 of
Bool.false →
ret x_148
Bool.true →
let x_161 : obj := proj[0] x_148;
let x_162 : obj := proj[1] x_148;
inc x_162;
inc x_161;
dec x_148;
let x_163 : obj := ctor_1[EStateM.Result.error] x_161 x_162;
ret x_163
Bool.true →
let x_164 : obj := proj[3] x_95;
inc x_164;
let x_165 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_166 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_165 x_144 x_1 x_164 x_2 x_3 x_4 x_5 x_6 x_145;
ret x_166
EStateM.Result.error →
dec x_135;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_167 : u8 := isShared x_143;
case x_167 : u8 of
Bool.false →
ret x_143
Bool.true →
let x_168 : obj := proj[0] x_143;
let x_169 : obj := proj[1] x_143;
inc x_169;
inc x_168;
dec x_143;
let x_170 : obj := ctor_1[EStateM.Result.error] x_168 x_169;
ret x_170
EStateM.Result.error →
dec x_135;
dec x_133;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_171 : u8 := isShared x_139;
case x_171 : u8 of
Bool.false →
ret x_139
Bool.true →
let x_172 : obj := proj[0] x_139;
let x_173 : obj := proj[1] x_139;
inc x_173;
inc x_172;
dec x_139;
let x_174 : obj := ctor_1[EStateM.Result.error] x_172 x_173;
ret x_174
Bool.true →
let x_175 : u8 := Nat.decLe x_135 x_135;
case x_175 : u8 of
Bool.false →
dec x_134;
let x_176 : obj := proj[4] x_95;
inc x_176;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_177 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_176 x_2 x_3 x_4 x_5 x_6 x_7;
case x_177 : obj of
EStateM.Result.ok →
let x_178 : obj := proj[0] x_177;
inc x_178;
let x_179 : obj := proj[1] x_177;
inc x_179;
dec x_177;
let x_180 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_181 : obj := Lean.Compiler.LCNF.normCodeImp x_180 x_178 x_133 x_3 x_4 x_5 x_6 x_179;
case x_181 : obj of
EStateM.Result.ok →
let x_182 : obj := proj[0] x_181;
inc x_182;
let x_183 : obj := proj[1] x_181;
inc x_183;
dec x_181;
let x_184 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
let x_185 : u8 := Nat.beq x_184 x_135;
dec x_135;
dec x_184;
case x_185 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_182;
let x_186 : obj := Lean.Compiler.LCNF.Code.inferType x_182 x_3 x_4 x_5 x_6 x_183;
case x_186 : obj of
EStateM.Result.ok →
let x_187 : obj := proj[0] x_186;
inc x_187;
let x_188 : obj := proj[1] x_186;
inc x_188;
dec x_186;
let x_189 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_189;
let x_190 : obj := Lean.Compiler.LCNF.mkForallParams x_189 x_187 x_3 x_4 x_5 x_6 x_188;
case x_190 : obj of
EStateM.Result.ok →
let x_191 : obj := proj[0] x_190;
inc x_191;
let x_192 : obj := proj[1] x_190;
inc x_192;
dec x_190;
let x_193 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_189 x_182 x_1 x_191 x_2 x_3 x_4 x_5 x_6 x_192;
ret x_193
EStateM.Result.error →
dec x_189;
dec x_182;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_194 : u8 := isShared x_190;
case x_194 : u8 of
Bool.false →
ret x_190
Bool.true →
let x_195 : obj := proj[0] x_190;
let x_196 : obj := proj[1] x_190;
inc x_196;
inc x_195;
dec x_190;
let x_197 : obj := ctor_1[EStateM.Result.error] x_195 x_196;
ret x_197
EStateM.Result.error →
dec x_182;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_198 : u8 := isShared x_186;
case x_198 : u8 of
Bool.false →
ret x_186
Bool.true →
let x_199 : obj := proj[0] x_186;
let x_200 : obj := proj[1] x_186;
inc x_200;
inc x_199;
dec x_186;
let x_201 : obj := ctor_1[EStateM.Result.error] x_199 x_200;
ret x_201
Bool.true →
let x_202 : obj := proj[3] x_95;
inc x_202;
let x_203 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_204 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_203 x_182 x_1 x_202 x_2 x_3 x_4 x_5 x_6 x_183;
ret x_204
EStateM.Result.error →
dec x_135;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_205 : u8 := isShared x_181;
case x_205 : u8 of
Bool.false →
ret x_181
Bool.true →
let x_206 : obj := proj[0] x_181;
let x_207 : obj := proj[1] x_181;
inc x_207;
inc x_206;
dec x_181;
let x_208 : obj := ctor_1[EStateM.Result.error] x_206 x_207;
ret x_208
EStateM.Result.error →
dec x_135;
dec x_133;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_209 : u8 := isShared x_177;
case x_209 : u8 of
Bool.false →
ret x_177
Bool.true →
let x_210 : obj := proj[0] x_177;
let x_211 : obj := proj[1] x_177;
inc x_211;
inc x_210;
dec x_177;
let x_212 : obj := ctor_1[EStateM.Result.error] x_210 x_211;
ret x_212
Bool.true →
let x_213 : usize := 0;
let x_214 : usize := USize.ofNat x_135;
let x_215 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_216 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 x_133 x_134 x_213 x_214 x_215 x_2 x_3 x_4 x_5 x_6 x_7;
dec x_134;
let x_217 : obj := proj[0] x_216;
inc x_217;
let x_218 : obj := proj[1] x_216;
inc x_218;
dec x_216;
let x_219 : obj := proj[4] x_95;
inc x_219;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_220 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_219 x_2 x_3 x_4 x_5 x_6 x_218;
case x_220 : obj of
EStateM.Result.ok →
let x_221 : obj := proj[0] x_220;
inc x_221;
let x_222 : obj := proj[1] x_220;
inc x_222;
dec x_220;
let x_223 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_224 : obj := Lean.Compiler.LCNF.normCodeImp x_223 x_221 x_133 x_3 x_4 x_5 x_6 x_222;
case x_224 : obj of
EStateM.Result.ok →
let x_225 : obj := proj[0] x_224;
inc x_225;
let x_226 : obj := proj[1] x_224;
inc x_226;
dec x_224;
let x_227 : obj := Array.size ◾ x_217;
let x_228 : u8 := Nat.beq x_227 x_135;
dec x_135;
dec x_227;
case x_228 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_225;
let x_229 : obj := Lean.Compiler.LCNF.Code.inferType x_225 x_3 x_4 x_5 x_6 x_226;
case x_229 : obj of
EStateM.Result.ok →
let x_230 : obj := proj[0] x_229;
inc x_230;
let x_231 : obj := proj[1] x_229;
inc x_231;
dec x_229;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_217;
let x_232 : obj := Lean.Compiler.LCNF.mkForallParams x_217 x_230 x_3 x_4 x_5 x_6 x_231;
case x_232 : obj of
EStateM.Result.ok →
let x_233 : obj := proj[0] x_232;
inc x_233;
let x_234 : obj := proj[1] x_232;
inc x_234;
dec x_232;
let x_235 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_217 x_225 x_1 x_233 x_2 x_3 x_4 x_5 x_6 x_234;
ret x_235
EStateM.Result.error →
dec x_225;
dec x_217;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_236 : u8 := isShared x_232;
case x_236 : u8 of
Bool.false →
ret x_232
Bool.true →
let x_237 : obj := proj[0] x_232;
let x_238 : obj := proj[1] x_232;
inc x_238;
inc x_237;
dec x_232;
let x_239 : obj := ctor_1[EStateM.Result.error] x_237 x_238;
ret x_239
EStateM.Result.error →
dec x_225;
dec x_217;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_240 : u8 := isShared x_229;
case x_240 : u8 of
Bool.false →
ret x_229
Bool.true →
let x_241 : obj := proj[0] x_229;
let x_242 : obj := proj[1] x_229;
inc x_242;
inc x_241;
dec x_229;
let x_243 : obj := ctor_1[EStateM.Result.error] x_241 x_242;
ret x_243
Bool.true →
let x_244 : obj := proj[3] x_95;
inc x_244;
let x_245 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_217 x_225 x_1 x_244 x_2 x_3 x_4 x_5 x_6 x_226;
ret x_245
EStateM.Result.error →
dec x_217;
dec x_135;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_246 : u8 := isShared x_224;
case x_246 : u8 of
Bool.false →
ret x_224
Bool.true →
let x_247 : obj := proj[0] x_224;
let x_248 : obj := proj[1] x_224;
inc x_248;
inc x_247;
dec x_224;
let x_249 : obj := ctor_1[EStateM.Result.error] x_247 x_248;
ret x_249
EStateM.Result.error →
dec x_217;
dec x_135;
dec x_133;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_250 : u8 := isShared x_220;
case x_250 : u8 of
Bool.false →
ret x_220
Bool.true →
let x_251 : obj := proj[0] x_220;
let x_252 : obj := proj[1] x_220;
inc x_252;
inc x_251;
dec x_220;
let x_253 : obj := ctor_1[EStateM.Result.error] x_251 x_252;
ret x_253
Lean.Compiler.LCNF.Code.jmp →
let x_254 : obj := proj[0] x_1;
inc x_254;
let x_255 : obj := proj[1] x_1;
inc x_255;
block_299 (x_256 : obj) (x_257 : obj) (x_258 : obj) :=
block_286 (x_259 : obj) :=
case x_1 : obj of
Lean.Compiler.LCNF.Code.jmp →
let x_260 : obj := proj[0] x_1;
inc x_260;
let x_261 : obj := proj[1] x_1;
inc x_261;
let x_262 : obj := Array.size ◾ x_259;
let x_263 : usize := USize.ofNat x_262;
dec x_262;
let x_264 : usize := 0;
let x_265 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_3 x_263 x_264 x_259;
let x_266 : u8 := Lean.Name.beq x_260 x_254;
dec x_260;
case x_266 : u8 of
Bool.false →
dec x_261;
let x_267 : u8 := isShared x_1;
case x_267 : u8 of
Bool.false →
let x_268 : obj := proj[1] x_1;
dec x_268;
let x_269 : obj := proj[0] x_1;
dec x_269;
set x_1[1] := x_265;
let x_270 : obj := ctor_0[EStateM.Result.ok] x_1 x_258;
ret x_270
Bool.true →
dec x_1;
let x_271 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_254 x_265;
let x_272 : obj := ctor_0[EStateM.Result.ok] x_271 x_258;
ret x_272
Bool.true →
let x_273 : usize := ptrAddrUnsafe ◾ x_261;
dec x_261;
let x_274 : usize := ptrAddrUnsafe ◾ x_265;
let x_275 : u8 := USize.decEq x_273 x_274;
case x_275 : u8 of
Bool.false →
let x_276 : u8 := isShared x_1;
case x_276 : u8 of
Bool.false →
let x_277 : obj := proj[1] x_1;
dec x_277;
let x_278 : obj := proj[0] x_1;
dec x_278;
set x_1[1] := x_265;
let x_279 : obj := ctor_0[EStateM.Result.ok] x_1 x_258;
ret x_279
Bool.true →
dec x_1;
let x_280 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_254 x_265;
let x_281 : obj := ctor_0[EStateM.Result.ok] x_280 x_258;
ret x_281
Bool.true →
dec x_265;
dec x_254;
let x_282 : obj := ctor_0[EStateM.Result.ok] x_1 x_258;
ret x_282
default →
dec x_259;
dec x_254;
dec x_1;
let x_283 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
let x_284 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_283;
let x_285 : obj := ctor_0[EStateM.Result.ok] x_284 x_258;
ret x_285;
let x_287 : obj := proj[2] x_257;
inc x_287;
dec x_257;
let x_288 : obj := Array.zip._rarg x_287 x_255;
dec x_255;
dec x_287;
let x_289 : obj := Array.size ◾ x_288;
let x_290 : obj := 0;
let x_291 : u8 := Nat.decLt x_290 x_289;
case x_291 : u8 of
Bool.false →
dec x_289;
dec x_288;
dec x_256;
let x_292 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
jmp block_286 x_292
Bool.true →
let x_293 : u8 := Nat.decLe x_289 x_289;
case x_293 : u8 of
Bool.false →
dec x_289;
dec x_288;
dec x_256;
let x_294 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
jmp block_286 x_294
Bool.true →
let x_295 : usize := 0;
let x_296 : usize := USize.ofNat x_289;
dec x_289;
let x_297 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_298 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_4 x_256 x_288 x_295 x_296 x_297;
dec x_288;
dec x_256;
jmp block_286 x_298;
inc x_254;
let x_300 : obj := Lean.Compiler.LCNF.getFunDecl x_254 x_3 x_4 x_5 x_6 x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
let x_301 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_254;
dec x_2;
case x_301 : obj of
Option.none →
case x_300 : obj of
EStateM.Result.ok →
let x_302 : obj := proj[0] x_300;
inc x_302;
let x_303 : obj := proj[1] x_300;
inc x_303;
dec x_300;
let x_304 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.isInJpScope._closed_3;
let x_305 : obj := panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_5 x_304;
jmp block_299 x_305 x_302 x_303
EStateM.Result.error →
dec x_255;
dec x_254;
dec x_1;
let x_306 : u8 := isShared x_300;
case x_306 : u8 of
Bool.false →
ret x_300
Bool.true →
let x_307 : obj := proj[0] x_300;
let x_308 : obj := proj[1] x_300;
inc x_308;
inc x_307;
dec x_300;
let x_309 : obj := ctor_1[EStateM.Result.error] x_307 x_308;
ret x_309
Option.some →
case x_300 : obj of
EStateM.Result.ok →
let x_310 : obj := proj[0] x_301;
inc x_310;
dec x_301;
let x_311 : obj := proj[0] x_300;
inc x_311;
let x_312 : obj := proj[1] x_300;
inc x_312;
dec x_300;
jmp block_299 x_310 x_311 x_312
EStateM.Result.error →
dec x_301;
dec x_255;
dec x_254;
dec x_1;
let x_313 : u8 := isShared x_300;
case x_313 : u8 of
Bool.false →
ret x_300
Bool.true →
let x_314 : obj := proj[0] x_300;
let x_315 : obj := proj[1] x_300;
inc x_315;
inc x_314;
dec x_300;
let x_316 : obj := ctor_1[EStateM.Result.error] x_314 x_315;
ret x_316
Lean.Compiler.LCNF.Code.cases →
let x_317 : obj := proj[0] x_1;
inc x_317;
let x_318 : u8 := isShared x_317;
case x_318 : u8 of
Bool.false →
let x_319 : obj := proj[0] x_317;
let x_320 : obj := proj[1] x_317;
let x_321 : obj := proj[2] x_317;
let x_322 : obj := proj[3] x_317;
let x_323 : obj := Array.size ◾ x_322;
let x_324 : usize := USize.ofNat x_323;
dec x_323;
let x_325 : usize := 0;
inc x_322;
let x_326 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_324 x_325 x_322 x_2 x_3 x_4 x_5 x_6 x_7;
case x_326 : obj of
EStateM.Result.ok →
let x_327 : u8 := isShared x_326;
case x_327 : u8 of
Bool.false →
let x_328 : obj := proj[0] x_326;
let x_329 : usize := ptrAddrUnsafe ◾ x_322;
dec x_322;
let x_330 : usize := ptrAddrUnsafe ◾ x_328;
let x_331 : u8 := USize.decEq x_329 x_330;
case x_331 : u8 of
Bool.false →
let x_332 : u8 := isShared x_1;
case x_332 : u8 of
Bool.false →
let x_333 : obj := proj[0] x_1;
dec x_333;
set x_317[3] := x_328;
set x_326[0] := x_1;
ret x_326
Bool.true →
dec x_1;
set x_317[3] := x_328;
let x_334 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
set x_326[0] := x_334;
ret x_326
Bool.true →
let x_335 : usize := ptrAddrUnsafe ◾ x_320;
let x_336 : u8 := USize.decEq x_335 x_335;
case x_336 : u8 of
Bool.false →
let x_337 : u8 := isShared x_1;
case x_337 : u8 of
Bool.false →
let x_338 : obj := proj[0] x_1;
dec x_338;
set x_317[3] := x_328;
set x_326[0] := x_1;
ret x_326
Bool.true →
dec x_1;
set x_317[3] := x_328;
let x_339 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
set x_326[0] := x_339;
ret x_326
Bool.true →
let x_340 : u8 := Lean.Name.beq x_321 x_321;
case x_340 : u8 of
Bool.false →
let x_341 : u8 := isShared x_1;
case x_341 : u8 of
Bool.false →
let x_342 : obj := proj[0] x_1;
dec x_342;
set x_317[3] := x_328;
set x_326[0] := x_1;
ret x_326
Bool.true →
dec x_1;
set x_317[3] := x_328;
let x_343 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
set x_326[0] := x_343;
ret x_326
Bool.true →
dec x_328;
del x_317;
dec x_321;
dec x_320;
dec x_319;
set x_326[0] := x_1;
ret x_326
Bool.true →
let x_344 : obj := proj[0] x_326;
let x_345 : obj := proj[1] x_326;
inc x_345;
inc x_344;
dec x_326;
let x_346 : usize := ptrAddrUnsafe ◾ x_322;
dec x_322;
let x_347 : usize := ptrAddrUnsafe ◾ x_344;
let x_348 : u8 := USize.decEq x_346 x_347;
case x_348 : u8 of
Bool.false →
let x_349 : obj := reset[1] x_1;
set x_317[3] := x_344;
let x_350 : obj := reuse x_349 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
let x_351 : obj := ctor_0[EStateM.Result.ok] x_350 x_345;
ret x_351
Bool.true →
let x_352 : usize := ptrAddrUnsafe ◾ x_320;
let x_353 : u8 := USize.decEq x_352 x_352;
case x_353 : u8 of
Bool.false →
let x_354 : obj := reset[1] x_1;
set x_317[3] := x_344;
let x_355 : obj := reuse x_354 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
let x_356 : obj := ctor_0[EStateM.Result.ok] x_355 x_345;
ret x_356
Bool.true →
let x_357 : u8 := Lean.Name.beq x_321 x_321;
case x_357 : u8 of
Bool.false →
let x_358 : obj := reset[1] x_1;
set x_317[3] := x_344;
let x_359 : obj := reuse x_358 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
let x_360 : obj := ctor_0[EStateM.Result.ok] x_359 x_345;
ret x_360
Bool.true →
dec x_344;
del x_317;
dec x_321;
dec x_320;
dec x_319;
let x_361 : obj := ctor_0[EStateM.Result.ok] x_1 x_345;
ret x_361
EStateM.Result.error →
del x_317;
dec x_322;
dec x_321;
dec x_320;
dec x_319;
dec x_1;
let x_362 : u8 := isShared x_326;
case x_362 : u8 of
Bool.false →
ret x_326
Bool.true →
let x_363 : obj := proj[0] x_326;
let x_364 : obj := proj[1] x_326;
inc x_364;
inc x_363;
dec x_326;
let x_365 : obj := ctor_1[EStateM.Result.error] x_363 x_364;
ret x_365
Bool.true →
let x_366 : obj := proj[0] x_317;
let x_367 : obj := proj[1] x_317;
let x_368 : obj := proj[2] x_317;
let x_369 : obj := proj[3] x_317;
inc x_369;
inc x_368;
inc x_367;
inc x_366;
dec x_317;
let x_370 : obj := Array.size ◾ x_369;
let x_371 : usize := USize.ofNat x_370;
dec x_370;
let x_372 : usize := 0;
inc x_369;
let x_373 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_371 x_372 x_369 x_2 x_3 x_4 x_5 x_6 x_7;
case x_373 : obj of
EStateM.Result.ok →
let x_374 : obj := proj[0] x_373;
inc x_374;
let x_375 : obj := proj[1] x_373;
inc x_375;
let x_376 : obj := reset[2] x_373;
let x_377 : usize := ptrAddrUnsafe ◾ x_369;
dec x_369;
let x_378 : usize := ptrAddrUnsafe ◾ x_374;
let x_379 : u8 := USize.decEq x_377 x_378;
case x_379 : u8 of
Bool.false →
let x_380 : obj := reset[1] x_1;
let x_381 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_366 x_367 x_368 x_374;
let x_382 : obj := reuse x_380 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_381;
let x_383 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_382 x_375;
ret x_383
Bool.true →
let x_384 : usize := ptrAddrUnsafe ◾ x_367;
let x_385 : u8 := USize.decEq x_384 x_384;
case x_385 : u8 of
Bool.false →
let x_386 : obj := reset[1] x_1;
let x_387 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_366 x_367 x_368 x_374;
let x_388 : obj := reuse x_386 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_387;
let x_389 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_388 x_375;
ret x_389
Bool.true →
let x_390 : u8 := Lean.Name.beq x_368 x_368;
case x_390 : u8 of
Bool.false →
let x_391 : obj := reset[1] x_1;
let x_392 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_366 x_367 x_368 x_374;
let x_393 : obj := reuse x_391 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_392;
let x_394 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_393 x_375;
ret x_394
Bool.true →
dec x_374;
dec x_368;
dec x_367;
dec x_366;
let x_395 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_1 x_375;
ret x_395
EStateM.Result.error →
dec x_369;
dec x_368;
dec x_367;
dec x_366;
dec x_1;
let x_396 : obj := proj[0] x_373;
inc x_396;
let x_397 : obj := proj[1] x_373;
inc x_397;
let x_398 : obj := reset[2] x_373;
let x_399 : obj := reuse x_398 in ctor_1[EStateM.Result.error] x_396 x_397;
ret x_399
default →
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_400 : obj := ctor_0[EStateM.Result.ok] x_1 x_7;
ret x_400
def Lean.HashMapImp.contains._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_1._boxed (x_1 : obj) (x_2 : obj) : obj :=
let x_3 : u8 := Lean.HashMapImp.contains._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_1 x_1 x_2;
dec x_2;
dec x_1;
let x_4 : obj := box x_3;
ret x_4
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2._lambda_1._boxed (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) : obj :=
let x_9 : u8 := unbox x_1;
dec x_1;
let x_10 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2._lambda_1 x_9 x_2 x_3 x_4 x_5 x_6 x_7 x_8;
dec x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
ret x_10
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2._boxed (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) (x_10 : obj) (x_11 : obj) : obj :=
let x_12 : usize := unbox x_3;
dec x_3;
let x_13 : usize := unbox x_4;
dec x_4;
let x_14 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 x_1 x_2 x_12 x_13 x_5 x_6 x_7 x_8 x_9 x_10 x_11;
dec x_10;
dec x_9;
dec x_8;
dec x_7;
dec x_6;
dec x_2;
dec x_1;
ret x_14
def Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_3._boxed (x_1 : obj) (x_2 : obj) (x_3 : obj) : obj :=
let x_4 : usize := unbox x_1;
dec x_1;
let x_5 : usize := unbox x_2;
dec x_2;
let x_6 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_3 x_4 x_5 x_3;
ret x_6
def Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_4._boxed (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) : obj :=
let x_6 : usize := unbox x_3;
dec x_3;
let x_7 : usize := unbox x_4;
dec x_4;
let x_8 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_4 x_1 x_2 x_6 x_7 x_5;
dec x_2;
dec x_1;
ret x_8
def Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7._boxed (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) (x_8 : obj) (x_9 : obj) : obj :=
let x_10 : usize := unbox x_1;
dec x_1;
let x_11 : usize := unbox x_2;
dec x_2;
let x_12 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_10 x_11 x_3 x_4 x_5 x_6 x_7 x_8 x_9;
ret x_12
[result]
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) : obj :=
let x_7 : u8 := isShared x_1;
case x_7 : u8 of
Bool.false →
let x_8 : obj := proj[0] x_1;
let x_9 : obj := proj[1] x_1;
let x_10 : obj := proj[2] x_1;
let x_11 : obj := proj[3] x_1;
let x_12 : obj := proj[4] x_1;
let x_13 : obj := proj[5] x_1;
let x_14 : obj := ctor_0[Lean.RBNode.leaf];
let x_15 : obj := ST.Prim.mkRef ◾ ◾ x_14 x_6;
let x_16 : obj := proj[0] x_15;
inc x_16;
let x_17 : obj := proj[1] x_15;
inc x_17;
dec x_15;
let x_18 : obj := ST.Prim.mkRef ◾ ◾ x_14 x_17;
let x_19 : obj := proj[0] x_18;
inc x_19;
let x_20 : obj := proj[1] x_18;
inc x_20;
dec x_18;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
inc x_16;
inc x_19;
inc x_12;
let x_21 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze x_12 x_14 x_19 x_16 x_2 x_3 x_4 x_5 x_20;
case x_21 : obj of
EStateM.Result.ok →
let x_22 : obj := proj[1] x_21;
inc x_22;
dec x_21;
let x_23 : obj := ST.Prim.Ref.get ◾ ◾ x_19 x_22;
dec x_19;
let x_24 : obj := proj[0] x_23;
inc x_24;
let x_25 : obj := proj[1] x_23;
inc x_25;
dec x_23;
let x_26 : obj := ST.Prim.Ref.get ◾ ◾ x_16 x_25;
dec x_16;
let x_27 : obj := proj[1] x_26;
inc x_27;
dec x_26;
let x_28 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_12 x_24 x_2 x_3 x_4 x_5 x_27;
case x_28 : obj of
EStateM.Result.ok →
let x_29 : u8 := isShared x_28;
case x_29 : u8 of
Bool.false →
let x_30 : obj := proj[0] x_28;
set x_1[4] := x_30;
set x_28[0] := x_1;
ret x_28
Bool.true →
let x_31 : obj := proj[0] x_28;
let x_32 : obj := proj[1] x_28;
inc x_32;
inc x_31;
dec x_28;
set x_1[4] := x_31;
let x_33 : obj := ctor_0[EStateM.Result.ok] x_1 x_32;
ret x_33
EStateM.Result.error →
del x_1;
dec x_13;
dec x_11;
dec x_10;
dec x_9;
dec x_8;
let x_34 : u8 := isShared x_28;
case x_34 : u8 of
Bool.false →
ret x_28
Bool.true →
let x_35 : obj := proj[0] x_28;
let x_36 : obj := proj[1] x_28;
inc x_36;
inc x_35;
dec x_28;
let x_37 : obj := ctor_1[EStateM.Result.error] x_35 x_36;
ret x_37
EStateM.Result.error →
dec x_19;
dec x_16;
del x_1;
dec x_13;
dec x_12;
dec x_11;
dec x_10;
dec x_9;
dec x_8;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_38 : u8 := isShared x_21;
case x_38 : u8 of
Bool.false →
ret x_21
Bool.true →
let x_39 : obj := proj[0] x_21;
let x_40 : obj := proj[1] x_21;
inc x_40;
inc x_39;
dec x_21;
let x_41 : obj := ctor_1[EStateM.Result.error] x_39 x_40;
ret x_41
Bool.true →
let x_42 : obj := proj[0] x_1;
let x_43 : obj := proj[1] x_1;
let x_44 : obj := proj[2] x_1;
let x_45 : obj := proj[3] x_1;
let x_46 : obj := proj[4] x_1;
let x_47 : u8 := sproj[6, 0] x_1;
let x_48 : u8 := sproj[6, 1] x_1;
let x_49 : obj := proj[5] x_1;
inc x_49;
inc x_46;
inc x_45;
inc x_44;
inc x_43;
inc x_42;
dec x_1;
let x_50 : obj := ctor_0[Lean.RBNode.leaf];
let x_51 : obj := ST.Prim.mkRef ◾ ◾ x_50 x_6;
let x_52 : obj := proj[0] x_51;
inc x_52;
let x_53 : obj := proj[1] x_51;
inc x_53;
dec x_51;
let x_54 : obj := ST.Prim.mkRef ◾ ◾ x_50 x_53;
let x_55 : obj := proj[0] x_54;
inc x_55;
let x_56 : obj := proj[1] x_54;
inc x_56;
dec x_54;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
inc x_52;
inc x_55;
inc x_46;
let x_57 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze x_46 x_50 x_55 x_52 x_2 x_3 x_4 x_5 x_56;
case x_57 : obj of
EStateM.Result.ok →
let x_58 : obj := proj[1] x_57;
inc x_58;
dec x_57;
let x_59 : obj := ST.Prim.Ref.get ◾ ◾ x_55 x_58;
dec x_55;
let x_60 : obj := proj[0] x_59;
inc x_60;
let x_61 : obj := proj[1] x_59;
inc x_61;
dec x_59;
let x_62 : obj := ST.Prim.Ref.get ◾ ◾ x_52 x_61;
dec x_52;
let x_63 : obj := proj[1] x_62;
inc x_63;
dec x_62;
let x_64 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_46 x_60 x_2 x_3 x_4 x_5 x_63;
case x_64 : obj of
EStateM.Result.ok →
let x_65 : obj := proj[0] x_64;
inc x_65;
let x_66 : obj := proj[1] x_64;
inc x_66;
let x_67 : obj := reset[2] x_64;
let x_68 : obj := ctor_0.0.2[Lean.Compiler.LCNF.Decl.mk] x_42 x_43 x_44 x_45 x_65 x_49;
sset x_68[6, 0] : u8 := x_47;
sset x_68[6, 1] : u8 := x_48;
let x_69 : obj := reuse x_67 in ctor_0[EStateM.Result.ok] x_68 x_66;
ret x_69
EStateM.Result.error →
dec x_49;
dec x_45;
dec x_44;
dec x_43;
dec x_42;
let x_70 : obj := proj[0] x_64;
inc x_70;
let x_71 : obj := proj[1] x_64;
inc x_71;
let x_72 : obj := reset[2] x_64;
let x_73 : obj := reuse x_72 in ctor_1[EStateM.Result.error] x_70 x_71;
ret x_73
EStateM.Result.error →
dec x_55;
dec x_52;
dec x_49;
dec x_46;
dec x_45;
dec x_44;
dec x_43;
dec x_42;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_74 : obj := proj[0] x_57;
inc x_74;
let x_75 : obj := proj[1] x_57;
inc x_75;
let x_76 : obj := reset[2] x_57;
let x_77 : obj := reuse x_76 in ctor_1[EStateM.Result.error] x_74 x_75;
ret x_77
def Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce (x_1 : obj) (x_2 : obj) (x_3 : obj) (x_4 : obj) (x_5 : obj) (x_6 : obj) (x_7 : obj) : obj :=
case x_1 : obj of
Lean.Compiler.LCNF.Code.let →
let x_8 : obj := proj[0] x_1;
inc x_8;
let x_9 : obj := proj[1] x_1;
inc x_9;
inc x_9;
let x_10 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_9 x_2 x_3 x_4 x_5 x_6 x_7;
case x_10 : obj of
EStateM.Result.ok →
let x_11 : u8 := isShared x_10;
case x_11 : u8 of
Bool.false →
let x_12 : obj := proj[0] x_10;
let x_13 : usize := ptrAddrUnsafe ◾ x_9;
dec x_9;
let x_14 : usize := ptrAddrUnsafe ◾ x_12;
let x_15 : u8 := USize.decEq x_13 x_14;
case x_15 : u8 of
Bool.false →
let x_16 : u8 := isShared x_1;
case x_16 : u8 of
Bool.false →
let x_17 : obj := proj[1] x_1;
dec x_17;
let x_18 : obj := proj[0] x_1;
dec x_18;
set x_1[1] := x_12;
set x_10[0] := x_1;
ret x_10
Bool.true →
dec x_1;
let x_19 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_12;
set x_10[0] := x_19;
ret x_10
Bool.true →
let x_20 : usize := ptrAddrUnsafe ◾ x_8;
let x_21 : u8 := USize.decEq x_20 x_20;
case x_21 : u8 of
Bool.false →
let x_22 : u8 := isShared x_1;
case x_22 : u8 of
Bool.false →
let x_23 : obj := proj[1] x_1;
dec x_23;
let x_24 : obj := proj[0] x_1;
dec x_24;
set x_1[1] := x_12;
set x_10[0] := x_1;
ret x_10
Bool.true →
dec x_1;
let x_25 : obj := ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_12;
set x_10[0] := x_25;
ret x_10
Bool.true →
dec x_12;
dec x_8;
set x_10[0] := x_1;
ret x_10
Bool.true →
let x_26 : obj := proj[0] x_10;
let x_27 : obj := proj[1] x_10;
inc x_27;
inc x_26;
dec x_10;
let x_28 : usize := ptrAddrUnsafe ◾ x_9;
dec x_9;
let x_29 : usize := ptrAddrUnsafe ◾ x_26;
let x_30 : u8 := USize.decEq x_28 x_29;
case x_30 : u8 of
Bool.false →
let x_31 : obj := reset[2] x_1;
let x_32 : obj := reuse x_31 in ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_26;
let x_33 : obj := ctor_0[EStateM.Result.ok] x_32 x_27;
ret x_33
Bool.true →
let x_34 : usize := ptrAddrUnsafe ◾ x_8;
let x_35 : u8 := USize.decEq x_34 x_34;
case x_35 : u8 of
Bool.false →
let x_36 : obj := reset[2] x_1;
let x_37 : obj := reuse x_36 in ctor_0[Lean.Compiler.LCNF.Code.let] x_8 x_26;
let x_38 : obj := ctor_0[EStateM.Result.ok] x_37 x_27;
ret x_38
Bool.true →
dec x_26;
dec x_8;
let x_39 : obj := ctor_0[EStateM.Result.ok] x_1 x_27;
ret x_39
EStateM.Result.error →
dec x_9;
dec x_8;
dec x_1;
let x_40 : u8 := isShared x_10;
case x_40 : u8 of
Bool.false →
ret x_10
Bool.true →
let x_41 : obj := proj[0] x_10;
let x_42 : obj := proj[1] x_10;
inc x_42;
inc x_41;
dec x_10;
let x_43 : obj := ctor_1[EStateM.Result.error] x_41 x_42;
ret x_43
Lean.Compiler.LCNF.Code.fun →
let x_44 : obj := proj[0] x_1;
inc x_44;
let x_45 : obj := proj[1] x_1;
inc x_45;
let x_46 : obj := proj[4] x_44;
inc x_46;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_47 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_46 x_2 x_3 x_4 x_5 x_6 x_7;
case x_47 : obj of
EStateM.Result.ok →
let x_48 : obj := proj[0] x_47;
inc x_48;
let x_49 : obj := proj[1] x_47;
inc x_49;
dec x_47;
let x_50 : obj := proj[3] x_44;
inc x_50;
let x_51 : obj := proj[2] x_44;
inc x_51;
inc x_44;
let x_52 : obj := _private.Lean.Compiler.LCNF.CompilerM.0.Lean.Compiler.LCNF.updateFunDeclImp x_44 x_50 x_51 x_48 x_3 x_4 x_5 x_6 x_49;
let x_53 : obj := proj[0] x_52;
inc x_53;
let x_54 : obj := proj[1] x_52;
inc x_54;
dec x_52;
inc x_45;
let x_55 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_45 x_2 x_3 x_4 x_5 x_6 x_54;
case x_55 : obj of
EStateM.Result.ok →
let x_56 : u8 := isShared x_55;
case x_56 : u8 of
Bool.false →
let x_57 : obj := proj[0] x_55;
let x_58 : usize := ptrAddrUnsafe ◾ x_45;
dec x_45;
let x_59 : usize := ptrAddrUnsafe ◾ x_57;
let x_60 : u8 := USize.decEq x_58 x_59;
case x_60 : u8 of
Bool.false →
dec x_44;
let x_61 : u8 := isShared x_1;
case x_61 : u8 of
Bool.false →
let x_62 : obj := proj[1] x_1;
dec x_62;
let x_63 : obj := proj[0] x_1;
dec x_63;
set x_1[1] := x_57;
set x_1[0] := x_53;
set x_55[0] := x_1;
ret x_55
Bool.true →
dec x_1;
let x_64 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_57;
set x_55[0] := x_64;
ret x_55
Bool.true →
let x_65 : usize := ptrAddrUnsafe ◾ x_44;
dec x_44;
let x_66 : usize := ptrAddrUnsafe ◾ x_53;
let x_67 : u8 := USize.decEq x_65 x_66;
case x_67 : u8 of
Bool.false →
let x_68 : u8 := isShared x_1;
case x_68 : u8 of
Bool.false →
let x_69 : obj := proj[1] x_1;
dec x_69;
let x_70 : obj := proj[0] x_1;
dec x_70;
set x_1[1] := x_57;
set x_1[0] := x_53;
set x_55[0] := x_1;
ret x_55
Bool.true →
dec x_1;
let x_71 : obj := ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_57;
set x_55[0] := x_71;
ret x_55
Bool.true →
dec x_57;
dec x_53;
set x_55[0] := x_1;
ret x_55
Bool.true →
let x_72 : obj := proj[0] x_55;
let x_73 : obj := proj[1] x_55;
inc x_73;
inc x_72;
dec x_55;
let x_74 : usize := ptrAddrUnsafe ◾ x_45;
dec x_45;
let x_75 : usize := ptrAddrUnsafe ◾ x_72;
let x_76 : u8 := USize.decEq x_74 x_75;
case x_76 : u8 of
Bool.false →
dec x_44;
let x_77 : obj := reset[2] x_1;
let x_78 : obj := reuse x_77 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_72;
let x_79 : obj := ctor_0[EStateM.Result.ok] x_78 x_73;
ret x_79
Bool.true →
let x_80 : usize := ptrAddrUnsafe ◾ x_44;
dec x_44;
let x_81 : usize := ptrAddrUnsafe ◾ x_53;
let x_82 : u8 := USize.decEq x_80 x_81;
case x_82 : u8 of
Bool.false →
let x_83 : obj := reset[2] x_1;
let x_84 : obj := reuse x_83 in ctor_1[Lean.Compiler.LCNF.Code.fun] x_53 x_72;
let x_85 : obj := ctor_0[EStateM.Result.ok] x_84 x_73;
ret x_85
Bool.true →
dec x_72;
dec x_53;
let x_86 : obj := ctor_0[EStateM.Result.ok] x_1 x_73;
ret x_86
EStateM.Result.error →
dec x_53;
dec x_45;
dec x_44;
dec x_1;
let x_87 : u8 := isShared x_55;
case x_87 : u8 of
Bool.false →
ret x_55
Bool.true →
let x_88 : obj := proj[0] x_55;
let x_89 : obj := proj[1] x_55;
inc x_89;
inc x_88;
dec x_55;
let x_90 : obj := ctor_1[EStateM.Result.error] x_88 x_89;
ret x_90
EStateM.Result.error →
dec x_45;
dec x_44;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_91 : u8 := isShared x_47;
case x_91 : u8 of
Bool.false →
ret x_47
Bool.true →
let x_92 : obj := proj[0] x_47;
let x_93 : obj := proj[1] x_47;
inc x_93;
inc x_92;
dec x_47;
let x_94 : obj := ctor_1[EStateM.Result.error] x_92 x_93;
ret x_94
Lean.Compiler.LCNF.Code.jp →
let x_95 : obj := proj[0] x_1;
inc x_95;
let x_96 : obj := proj[1] x_1;
inc x_96;
let x_97 : obj := proj[0] x_95;
inc x_97;
let x_98 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_97;
dec x_97;
case x_98 : obj of
Option.none →
inc x_96;
let x_99 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_96 x_2 x_3 x_4 x_5 x_6 x_7;
case x_99 : obj of
EStateM.Result.ok →
let x_100 : u8 := isShared x_99;
case x_100 : u8 of
Bool.false →
let x_101 : obj := proj[0] x_99;
let x_102 : usize := ptrAddrUnsafe ◾ x_96;
dec x_96;
let x_103 : usize := ptrAddrUnsafe ◾ x_101;
let x_104 : u8 := USize.decEq x_102 x_103;
case x_104 : u8 of
Bool.false →
let x_105 : u8 := isShared x_1;
case x_105 : u8 of
Bool.false →
let x_106 : obj := proj[1] x_1;
dec x_106;
let x_107 : obj := proj[0] x_1;
dec x_107;
set x_1[1] := x_101;
set x_99[0] := x_1;
ret x_99
Bool.true →
dec x_1;
let x_108 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_101;
set x_99[0] := x_108;
ret x_99
Bool.true →
let x_109 : usize := ptrAddrUnsafe ◾ x_95;
let x_110 : u8 := USize.decEq x_109 x_109;
case x_110 : u8 of
Bool.false →
let x_111 : u8 := isShared x_1;
case x_111 : u8 of
Bool.false →
let x_112 : obj := proj[1] x_1;
dec x_112;
let x_113 : obj := proj[0] x_1;
dec x_113;
set x_1[1] := x_101;
set x_99[0] := x_1;
ret x_99
Bool.true →
dec x_1;
let x_114 : obj := ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_101;
set x_99[0] := x_114;
ret x_99
Bool.true →
dec x_101;
dec x_95;
set x_99[0] := x_1;
ret x_99
Bool.true →
let x_115 : obj := proj[0] x_99;
let x_116 : obj := proj[1] x_99;
inc x_116;
inc x_115;
dec x_99;
let x_117 : usize := ptrAddrUnsafe ◾ x_96;
dec x_96;
let x_118 : usize := ptrAddrUnsafe ◾ x_115;
let x_119 : u8 := USize.decEq x_117 x_118;
case x_119 : u8 of
Bool.false →
let x_120 : obj := reset[2] x_1;
let x_121 : obj := reuse x_120 in ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_115;
let x_122 : obj := ctor_0[EStateM.Result.ok] x_121 x_116;
ret x_122
Bool.true →
let x_123 : usize := ptrAddrUnsafe ◾ x_95;
let x_124 : u8 := USize.decEq x_123 x_123;
case x_124 : u8 of
Bool.false →
let x_125 : obj := reset[2] x_1;
let x_126 : obj := reuse x_125 in ctor_2[Lean.Compiler.LCNF.Code.jp] x_95 x_115;
let x_127 : obj := ctor_0[EStateM.Result.ok] x_126 x_116;
ret x_127
Bool.true →
dec x_115;
dec x_95;
let x_128 : obj := ctor_0[EStateM.Result.ok] x_1 x_116;
ret x_128
EStateM.Result.error →
dec x_96;
dec x_95;
dec x_1;
let x_129 : u8 := isShared x_99;
case x_129 : u8 of
Bool.false →
ret x_99
Bool.true →
let x_130 : obj := proj[0] x_99;
let x_131 : obj := proj[1] x_99;
inc x_131;
inc x_130;
dec x_99;
let x_132 : obj := ctor_1[EStateM.Result.error] x_130 x_131;
ret x_132
Option.some →
let x_133 : obj := proj[0] x_98;
inc x_133;
dec x_98;
let x_134 : obj := proj[2] x_95;
inc x_134;
let x_135 : obj := Array.size ◾ x_134;
let x_136 : obj := 0;
let x_137 : u8 := Nat.decLt x_136 x_135;
case x_137 : u8 of
Bool.false →
dec x_134;
let x_138 : obj := proj[4] x_95;
inc x_138;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_139 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_138 x_2 x_3 x_4 x_5 x_6 x_7;
case x_139 : obj of
EStateM.Result.ok →
let x_140 : obj := proj[0] x_139;
inc x_140;
let x_141 : obj := proj[1] x_139;
inc x_141;
dec x_139;
let x_142 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_143 : obj := Lean.Compiler.LCNF.normCodeImp x_142 x_140 x_133 x_3 x_4 x_5 x_6 x_141;
case x_143 : obj of
EStateM.Result.ok →
let x_144 : obj := proj[0] x_143;
inc x_144;
let x_145 : obj := proj[1] x_143;
inc x_145;
dec x_143;
let x_146 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
let x_147 : u8 := Nat.beq x_146 x_135;
dec x_135;
dec x_146;
case x_147 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_144;
let x_148 : obj := Lean.Compiler.LCNF.Code.inferType x_144 x_3 x_4 x_5 x_6 x_145;
case x_148 : obj of
EStateM.Result.ok →
let x_149 : obj := proj[0] x_148;
inc x_149;
let x_150 : obj := proj[1] x_148;
inc x_150;
dec x_148;
let x_151 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_151;
let x_152 : obj := Lean.Compiler.LCNF.mkForallParams x_151 x_149 x_3 x_4 x_5 x_6 x_150;
case x_152 : obj of
EStateM.Result.ok →
let x_153 : obj := proj[0] x_152;
inc x_153;
let x_154 : obj := proj[1] x_152;
inc x_154;
dec x_152;
let x_155 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_151 x_144 x_1 x_153 x_2 x_3 x_4 x_5 x_6 x_154;
ret x_155
EStateM.Result.error →
dec x_151;
dec x_144;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_156 : u8 := isShared x_152;
case x_156 : u8 of
Bool.false →
ret x_152
Bool.true →
let x_157 : obj := proj[0] x_152;
let x_158 : obj := proj[1] x_152;
inc x_158;
inc x_157;
dec x_152;
let x_159 : obj := ctor_1[EStateM.Result.error] x_157 x_158;
ret x_159
EStateM.Result.error →
dec x_144;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_160 : u8 := isShared x_148;
case x_160 : u8 of
Bool.false →
ret x_148
Bool.true →
let x_161 : obj := proj[0] x_148;
let x_162 : obj := proj[1] x_148;
inc x_162;
inc x_161;
dec x_148;
let x_163 : obj := ctor_1[EStateM.Result.error] x_161 x_162;
ret x_163
Bool.true →
let x_164 : obj := proj[3] x_95;
inc x_164;
let x_165 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_166 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_165 x_144 x_1 x_164 x_2 x_3 x_4 x_5 x_6 x_145;
ret x_166
EStateM.Result.error →
dec x_135;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_167 : u8 := isShared x_143;
case x_167 : u8 of
Bool.false →
ret x_143
Bool.true →
let x_168 : obj := proj[0] x_143;
let x_169 : obj := proj[1] x_143;
inc x_169;
inc x_168;
dec x_143;
let x_170 : obj := ctor_1[EStateM.Result.error] x_168 x_169;
ret x_170
EStateM.Result.error →
dec x_135;
dec x_133;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_171 : u8 := isShared x_139;
case x_171 : u8 of
Bool.false →
ret x_139
Bool.true →
let x_172 : obj := proj[0] x_139;
let x_173 : obj := proj[1] x_139;
inc x_173;
inc x_172;
dec x_139;
let x_174 : obj := ctor_1[EStateM.Result.error] x_172 x_173;
ret x_174
Bool.true →
let x_175 : u8 := Nat.decLe x_135 x_135;
case x_175 : u8 of
Bool.false →
dec x_134;
let x_176 : obj := proj[4] x_95;
inc x_176;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_177 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_176 x_2 x_3 x_4 x_5 x_6 x_7;
case x_177 : obj of
EStateM.Result.ok →
let x_178 : obj := proj[0] x_177;
inc x_178;
let x_179 : obj := proj[1] x_177;
inc x_179;
dec x_177;
let x_180 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_181 : obj := Lean.Compiler.LCNF.normCodeImp x_180 x_178 x_133 x_3 x_4 x_5 x_6 x_179;
case x_181 : obj of
EStateM.Result.ok →
let x_182 : obj := proj[0] x_181;
inc x_182;
let x_183 : obj := proj[1] x_181;
inc x_183;
dec x_181;
let x_184 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_2;
let x_185 : u8 := Nat.beq x_184 x_135;
dec x_135;
dec x_184;
case x_185 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_182;
let x_186 : obj := Lean.Compiler.LCNF.Code.inferType x_182 x_3 x_4 x_5 x_6 x_183;
case x_186 : obj of
EStateM.Result.ok →
let x_187 : obj := proj[0] x_186;
inc x_187;
let x_188 : obj := proj[1] x_186;
inc x_188;
dec x_186;
let x_189 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_189;
let x_190 : obj := Lean.Compiler.LCNF.mkForallParams x_189 x_187 x_3 x_4 x_5 x_6 x_188;
case x_190 : obj of
EStateM.Result.ok →
let x_191 : obj := proj[0] x_190;
inc x_191;
let x_192 : obj := proj[1] x_190;
inc x_192;
dec x_190;
let x_193 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_189 x_182 x_1 x_191 x_2 x_3 x_4 x_5 x_6 x_192;
ret x_193
EStateM.Result.error →
dec x_189;
dec x_182;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_194 : u8 := isShared x_190;
case x_194 : u8 of
Bool.false →
ret x_190
Bool.true →
let x_195 : obj := proj[0] x_190;
let x_196 : obj := proj[1] x_190;
inc x_196;
inc x_195;
dec x_190;
let x_197 : obj := ctor_1[EStateM.Result.error] x_195 x_196;
ret x_197
EStateM.Result.error →
dec x_182;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_198 : u8 := isShared x_186;
case x_198 : u8 of
Bool.false →
ret x_186
Bool.true →
let x_199 : obj := proj[0] x_186;
let x_200 : obj := proj[1] x_186;
inc x_200;
inc x_199;
dec x_186;
let x_201 : obj := ctor_1[EStateM.Result.error] x_199 x_200;
ret x_201
Bool.true →
let x_202 : obj := proj[3] x_95;
inc x_202;
let x_203 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_204 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_203 x_182 x_1 x_202 x_2 x_3 x_4 x_5 x_6 x_183;
ret x_204
EStateM.Result.error →
dec x_135;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_205 : u8 := isShared x_181;
case x_205 : u8 of
Bool.false →
ret x_181
Bool.true →
let x_206 : obj := proj[0] x_181;
let x_207 : obj := proj[1] x_181;
inc x_207;
inc x_206;
dec x_181;
let x_208 : obj := ctor_1[EStateM.Result.error] x_206 x_207;
ret x_208
EStateM.Result.error →
dec x_135;
dec x_133;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_209 : u8 := isShared x_177;
case x_209 : u8 of
Bool.false →
ret x_177
Bool.true →
let x_210 : obj := proj[0] x_177;
let x_211 : obj := proj[1] x_177;
inc x_211;
inc x_210;
dec x_177;
let x_212 : obj := ctor_1[EStateM.Result.error] x_210 x_211;
ret x_212
Bool.true →
let x_213 : usize := 0;
let x_214 : usize := USize.ofNat x_135;
let x_215 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_216 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_2 x_133 x_134 x_213 x_214 x_215 x_2 x_3 x_4 x_5 x_6 x_7;
dec x_134;
let x_217 : obj := proj[0] x_216;
inc x_217;
let x_218 : obj := proj[1] x_216;
inc x_218;
dec x_216;
let x_219 : obj := proj[4] x_95;
inc x_219;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_2;
let x_220 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce x_219 x_2 x_3 x_4 x_5 x_6 x_218;
case x_220 : obj of
EStateM.Result.ok →
let x_221 : obj := proj[0] x_220;
inc x_221;
let x_222 : obj := proj[1] x_220;
inc x_222;
dec x_220;
let x_223 : u8 := 0;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
let x_224 : obj := Lean.Compiler.LCNF.normCodeImp x_223 x_221 x_133 x_3 x_4 x_5 x_6 x_222;
case x_224 : obj of
EStateM.Result.ok →
let x_225 : obj := proj[0] x_224;
inc x_225;
let x_226 : obj := proj[1] x_224;
inc x_226;
dec x_224;
let x_227 : obj := Array.size ◾ x_217;
let x_228 : u8 := Nat.beq x_227 x_135;
dec x_135;
dec x_227;
case x_228 : u8 of
Bool.false →
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_225;
let x_229 : obj := Lean.Compiler.LCNF.Code.inferType x_225 x_3 x_4 x_5 x_6 x_226;
case x_229 : obj of
EStateM.Result.ok →
let x_230 : obj := proj[0] x_229;
inc x_230;
let x_231 : obj := proj[1] x_229;
inc x_231;
dec x_229;
inc x_6;
inc x_5;
inc x_4;
inc x_3;
inc x_217;
let x_232 : obj := Lean.Compiler.LCNF.mkForallParams x_217 x_230 x_3 x_4 x_5 x_6 x_231;
case x_232 : obj of
EStateM.Result.ok →
let x_233 : obj := proj[0] x_232;
inc x_233;
let x_234 : obj := proj[1] x_232;
inc x_234;
dec x_232;
let x_235 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_217 x_225 x_1 x_233 x_2 x_3 x_4 x_5 x_6 x_234;
ret x_235
EStateM.Result.error →
dec x_225;
dec x_217;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_236 : u8 := isShared x_232;
case x_236 : u8 of
Bool.false →
ret x_232
Bool.true →
let x_237 : obj := proj[0] x_232;
let x_238 : obj := proj[1] x_232;
inc x_238;
inc x_237;
dec x_232;
let x_239 : obj := ctor_1[EStateM.Result.error] x_237 x_238;
ret x_239
EStateM.Result.error →
dec x_225;
dec x_217;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_240 : u8 := isShared x_229;
case x_240 : u8 of
Bool.false →
ret x_229
Bool.true →
let x_241 : obj := proj[0] x_229;
let x_242 : obj := proj[1] x_229;
inc x_242;
inc x_241;
dec x_229;
let x_243 : obj := ctor_1[EStateM.Result.error] x_241 x_242;
ret x_243
Bool.true →
let x_244 : obj := proj[3] x_95;
inc x_244;
let x_245 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._lambda_1 x_96 x_95 x_217 x_225 x_1 x_244 x_2 x_3 x_4 x_5 x_6 x_226;
ret x_245
EStateM.Result.error →
dec x_217;
dec x_135;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_246 : u8 := isShared x_224;
case x_246 : u8 of
Bool.false →
ret x_224
Bool.true →
let x_247 : obj := proj[0] x_224;
let x_248 : obj := proj[1] x_224;
inc x_248;
inc x_247;
dec x_224;
let x_249 : obj := ctor_1[EStateM.Result.error] x_247 x_248;
ret x_249
EStateM.Result.error →
dec x_217;
dec x_135;
dec x_133;
dec x_96;
dec x_95;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
dec x_1;
let x_250 : u8 := isShared x_220;
case x_250 : u8 of
Bool.false →
ret x_220
Bool.true →
let x_251 : obj := proj[0] x_220;
let x_252 : obj := proj[1] x_220;
inc x_252;
inc x_251;
dec x_220;
let x_253 : obj := ctor_1[EStateM.Result.error] x_251 x_252;
ret x_253
Lean.Compiler.LCNF.Code.jmp →
let x_254 : obj := proj[0] x_1;
inc x_254;
let x_255 : obj := proj[1] x_1;
inc x_255;
block_299 (x_256 : obj) (x_257 : obj) (x_258 : obj) :=
block_286 (x_259 : obj) :=
case x_1 : obj of
Lean.Compiler.LCNF.Code.jmp →
let x_260 : obj := proj[0] x_1;
inc x_260;
let x_261 : obj := proj[1] x_1;
inc x_261;
let x_262 : obj := Array.size ◾ x_259;
let x_263 : usize := USize.ofNat x_262;
dec x_262;
let x_264 : usize := 0;
let x_265 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_3 x_263 x_264 x_259;
let x_266 : u8 := Lean.Name.beq x_260 x_254;
dec x_260;
case x_266 : u8 of
Bool.false →
dec x_261;
let x_267 : u8 := isShared x_1;
case x_267 : u8 of
Bool.false →
let x_268 : obj := proj[1] x_1;
dec x_268;
let x_269 : obj := proj[0] x_1;
dec x_269;
set x_1[1] := x_265;
let x_270 : obj := ctor_0[EStateM.Result.ok] x_1 x_258;
ret x_270
Bool.true →
dec x_1;
let x_271 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_254 x_265;
let x_272 : obj := ctor_0[EStateM.Result.ok] x_271 x_258;
ret x_272
Bool.true →
let x_273 : usize := ptrAddrUnsafe ◾ x_261;
dec x_261;
let x_274 : usize := ptrAddrUnsafe ◾ x_265;
let x_275 : u8 := USize.decEq x_273 x_274;
case x_275 : u8 of
Bool.false →
let x_276 : u8 := isShared x_1;
case x_276 : u8 of
Bool.false →
let x_277 : obj := proj[1] x_1;
dec x_277;
let x_278 : obj := proj[0] x_1;
dec x_278;
set x_1[1] := x_265;
let x_279 : obj := ctor_0[EStateM.Result.ok] x_1 x_258;
ret x_279
Bool.true →
dec x_1;
let x_280 : obj := ctor_3[Lean.Compiler.LCNF.Code.jmp] x_254 x_265;
let x_281 : obj := ctor_0[EStateM.Result.ok] x_280 x_258;
ret x_281
Bool.true →
dec x_265;
dec x_254;
let x_282 : obj := ctor_0[EStateM.Result.ok] x_1 x_258;
ret x_282
default →
dec x_259;
dec x_254;
dec x_1;
let x_283 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_5;
let x_284 : obj := panic._at._private.Lean.Compiler.LCNF.Basic.0.Lean.Compiler.LCNF.updateAltsImp._spec_1 x_283;
let x_285 : obj := ctor_0[EStateM.Result.ok] x_284 x_258;
ret x_285;
let x_287 : obj := proj[2] x_257;
inc x_287;
dec x_257;
let x_288 : obj := Array.zip._rarg x_287 x_255;
dec x_255;
dec x_287;
let x_289 : obj := Array.size ◾ x_288;
let x_290 : obj := 0;
let x_291 : u8 := Nat.decLt x_290 x_289;
case x_291 : u8 of
Bool.false →
dec x_289;
dec x_288;
dec x_256;
let x_292 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
jmp block_286 x_292
Bool.true →
let x_293 : u8 := Nat.decLe x_289 x_289;
case x_293 : u8 of
Bool.false →
dec x_289;
dec x_288;
dec x_256;
let x_294 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
jmp block_286 x_294
Bool.true →
let x_295 : usize := 0;
let x_296 : usize := USize.ofNat x_289;
dec x_289;
let x_297 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._closed_1;
let x_298 : obj := Array.foldlMUnsafe.fold._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_4 x_256 x_288 x_295 x_296 x_297;
dec x_288;
dec x_256;
jmp block_286 x_298;
inc x_254;
let x_300 : obj := Lean.Compiler.LCNF.getFunDecl x_254 x_3 x_4 x_5 x_6 x_7;
dec x_6;
dec x_5;
dec x_4;
dec x_3;
let x_301 : obj := Lean.RBNode.find._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goAnalyze._spec_1 x_2 x_254;
dec x_2;
case x_301 : obj of
Option.none →
case x_300 : obj of
EStateM.Result.ok →
let x_302 : obj := proj[0] x_300;
inc x_302;
let x_303 : obj := proj[1] x_300;
inc x_303;
dec x_300;
let x_304 : obj := Lean.Compiler.LCNF.JoinPointCommonArgs.isInJpScope._closed_3;
let x_305 : obj := panic._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_5 x_304;
jmp block_299 x_305 x_302 x_303
EStateM.Result.error →
dec x_255;
dec x_254;
dec x_1;
let x_306 : u8 := isShared x_300;
case x_306 : u8 of
Bool.false →
ret x_300
Bool.true →
let x_307 : obj := proj[0] x_300;
let x_308 : obj := proj[1] x_300;
inc x_308;
inc x_307;
dec x_300;
let x_309 : obj := ctor_1[EStateM.Result.error] x_307 x_308;
ret x_309
Option.some →
case x_300 : obj of
EStateM.Result.ok →
let x_310 : obj := proj[0] x_301;
inc x_310;
dec x_301;
let x_311 : obj := proj[0] x_300;
inc x_311;
let x_312 : obj := proj[1] x_300;
inc x_312;
dec x_300;
jmp block_299 x_310 x_311 x_312
EStateM.Result.error →
dec x_301;
dec x_255;
dec x_254;
dec x_1;
let x_313 : u8 := isShared x_300;
case x_313 : u8 of
Bool.false →
ret x_300
Bool.true →
let x_314 : obj := proj[0] x_300;
let x_315 : obj := proj[1] x_300;
inc x_315;
inc x_314;
dec x_300;
let x_316 : obj := ctor_1[EStateM.Result.error] x_314 x_315;
ret x_316
Lean.Compiler.LCNF.Code.cases →
let x_317 : obj := proj[0] x_1;
inc x_317;
let x_318 : u8 := isShared x_317;
case x_318 : u8 of
Bool.false →
let x_319 : obj := proj[0] x_317;
let x_320 : obj := proj[1] x_317;
let x_321 : obj := proj[2] x_317;
let x_322 : obj := proj[3] x_317;
let x_323 : obj := Array.size ◾ x_322;
let x_324 : usize := USize.ofNat x_323;
dec x_323;
let x_325 : usize := 0;
inc x_322;
let x_326 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_324 x_325 x_322 x_2 x_3 x_4 x_5 x_6 x_7;
case x_326 : obj of
EStateM.Result.ok →
let x_327 : u8 := isShared x_326;
case x_327 : u8 of
Bool.false →
let x_328 : obj := proj[0] x_326;
let x_329 : usize := ptrAddrUnsafe ◾ x_322;
dec x_322;
let x_330 : usize := ptrAddrUnsafe ◾ x_328;
let x_331 : u8 := USize.decEq x_329 x_330;
case x_331 : u8 of
Bool.false →
let x_332 : u8 := isShared x_1;
case x_332 : u8 of
Bool.false →
let x_333 : obj := proj[0] x_1;
dec x_333;
set x_317[3] := x_328;
set x_326[0] := x_1;
ret x_326
Bool.true →
dec x_1;
set x_317[3] := x_328;
let x_334 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
set x_326[0] := x_334;
ret x_326
Bool.true →
let x_335 : usize := ptrAddrUnsafe ◾ x_320;
let x_336 : u8 := USize.decEq x_335 x_335;
case x_336 : u8 of
Bool.false →
let x_337 : u8 := isShared x_1;
case x_337 : u8 of
Bool.false →
let x_338 : obj := proj[0] x_1;
dec x_338;
set x_317[3] := x_328;
set x_326[0] := x_1;
ret x_326
Bool.true →
dec x_1;
set x_317[3] := x_328;
let x_339 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
set x_326[0] := x_339;
ret x_326
Bool.true →
let x_340 : u8 := Lean.Name.beq x_321 x_321;
case x_340 : u8 of
Bool.false →
let x_341 : u8 := isShared x_1;
case x_341 : u8 of
Bool.false →
let x_342 : obj := proj[0] x_1;
dec x_342;
set x_317[3] := x_328;
set x_326[0] := x_1;
ret x_326
Bool.true →
dec x_1;
set x_317[3] := x_328;
let x_343 : obj := ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
set x_326[0] := x_343;
ret x_326
Bool.true →
dec x_328;
del x_317;
dec x_321;
dec x_320;
dec x_319;
set x_326[0] := x_1;
ret x_326
Bool.true →
let x_344 : obj := proj[0] x_326;
let x_345 : obj := proj[1] x_326;
inc x_345;
inc x_344;
dec x_326;
let x_346 : usize := ptrAddrUnsafe ◾ x_322;
dec x_322;
let x_347 : usize := ptrAddrUnsafe ◾ x_344;
let x_348 : u8 := USize.decEq x_346 x_347;
case x_348 : u8 of
Bool.false →
let x_349 : obj := reset[1] x_1;
set x_317[3] := x_344;
let x_350 : obj := reuse x_349 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
let x_351 : obj := ctor_0[EStateM.Result.ok] x_350 x_345;
ret x_351
Bool.true →
let x_352 : usize := ptrAddrUnsafe ◾ x_320;
let x_353 : u8 := USize.decEq x_352 x_352;
case x_353 : u8 of
Bool.false →
let x_354 : obj := reset[1] x_1;
set x_317[3] := x_344;
let x_355 : obj := reuse x_354 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
let x_356 : obj := ctor_0[EStateM.Result.ok] x_355 x_345;
ret x_356
Bool.true →
let x_357 : u8 := Lean.Name.beq x_321 x_321;
case x_357 : u8 of
Bool.false →
let x_358 : obj := reset[1] x_1;
set x_317[3] := x_344;
let x_359 : obj := reuse x_358 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_317;
let x_360 : obj := ctor_0[EStateM.Result.ok] x_359 x_345;
ret x_360
Bool.true →
dec x_344;
del x_317;
dec x_321;
dec x_320;
dec x_319;
let x_361 : obj := ctor_0[EStateM.Result.ok] x_1 x_345;
ret x_361
EStateM.Result.error →
del x_317;
dec x_322;
dec x_321;
dec x_320;
dec x_319;
dec x_1;
let x_362 : u8 := isShared x_326;
case x_362 : u8 of
Bool.false →
ret x_326
Bool.true →
let x_363 : obj := proj[0] x_326;
let x_364 : obj := proj[1] x_326;
inc x_364;
inc x_363;
dec x_326;
let x_365 : obj := ctor_1[EStateM.Result.error] x_363 x_364;
ret x_365
Bool.true →
let x_366 : obj := proj[0] x_317;
let x_367 : obj := proj[1] x_317;
let x_368 : obj := proj[2] x_317;
let x_369 : obj := proj[3] x_317;
inc x_369;
inc x_368;
inc x_367;
inc x_366;
dec x_317;
let x_370 : obj := Array.size ◾ x_369;
let x_371 : usize := USize.ofNat x_370;
dec x_370;
let x_372 : usize := 0;
inc x_369;
let x_373 : obj := Array.mapMUnsafe.map._at.Lean.Compiler.LCNF.JoinPointCommonArgs.reduce.goReduce._spec_7 x_371 x_372 x_369 x_2 x_3 x_4 x_5 x_6 x_7;
case x_373 : obj of
EStateM.Result.ok →
let x_374 : obj := proj[0] x_373;
inc x_374;
let x_375 : obj := proj[1] x_373;
inc x_375;
let x_376 : obj := reset[2] x_373;
let x_377 : usize := ptrAddrUnsafe ◾ x_369;
dec x_369;
let x_378 : usize := ptrAddrUnsafe ◾ x_374;
let x_379 : u8 := USize.decEq x_377 x_378;
case x_379 : u8 of
Bool.false →
let x_380 : obj := reset[1] x_1;
let x_381 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_366 x_367 x_368 x_374;
let x_382 : obj := reuse x_380 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_381;
let x_383 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_382 x_375;
ret x_383
Bool.true →
let x_384 : usize := ptrAddrUnsafe ◾ x_367;
let x_385 : u8 := USize.decEq x_384 x_384;
case x_385 : u8 of
Bool.false →
let x_386 : obj := reset[1] x_1;
let x_387 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_366 x_367 x_368 x_374;
let x_388 : obj := reuse x_386 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_387;
let x_389 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_388 x_375;
ret x_389
Bool.true →
let x_390 : u8 := Lean.Name.beq x_368 x_368;
case x_390 : u8 of
Bool.false →
let x_391 : obj := reset[1] x_1;
let x_392 : obj := ctor_0[Lean.Compiler.LCNF.CasesCore.mk] x_366 x_367 x_368 x_374;
let x_393 : obj := reuse x_391 in ctor_4[Lean.Compiler.LCNF.Code.cases] x_392;
let x_394 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_393 x_375;
ret x_394
Bool.true →
dec x_374;
dec x_368;
dec x_367;
dec x_366;
let x_395 : obj := reuse x_376 in ctor_0[EStateM.Result.ok] x_1 x_375;
ret x_395
EStateM.Result.error →
dec x_369;
dec x_368;
dec x_367;
dec x_366;
dec x_1;
let x_396 : obj := proj[0] x_373;
inc x_396;
let x_397 : obj := proj[1] x_373;
inc x_397;
let x_398 : obj := reset[2] x_373;
let x_399 : obj := reuse x_398 in ctor_1[EStateM.Result.error] x_396 x_397;
ret x_399
default →
dec x_6;
dec x_5;
dec x_4;
dec x_3;
dec x_2;
let x_400 : obj := ctor_0[EStateM.Result.ok] x_1 x_7;
ret x_400
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment