Zulip Chat Archive

Stream: lean4

Topic: Why it's not optimized


lean_user (Jun 13 2025 at 09:23):

leanprover/lean4:v4.20.1
set_option trace.compiler.ir.result true in
def f_optimized (xs : List Nat) : List Nat :=
  (xs.map (· + 1)).map (· * 2) -- expected xs.map ((· + 1)  *  2)

#eval Lean.Compiler.compile #[``f_optimized]
#eval Lean.Compiler.LCNF.showDecl .base ``f_optimized

lean_user (Jun 13 2025 at 09:23):

set_option trace.compiler.ir.result true in
...
[result]
def List.mapTR.loop._at.f_optimized._spec_1 (x_1 : obj) (x_2 : obj) : obj :=
  case x_1 : obj of
  List.nil 
    let x_3 : obj := List.reverse._rarg x_2;
    ret x_3
  List.cons 
    let x_4 : u8 := isShared x_1;
    case x_4 : u8 of
    Bool.false 
      let x_5 : obj := proj[0] x_1;
      let x_6 : obj := proj[1] x_1;
      let x_7 : obj := 1;
      let x_8 : obj := Nat.add x_5 x_7;
      dec x_5;
      set x_1[1] := x_2;
      set x_1[0] := x_8;
      let x_9 : obj := List.mapTR.loop._at.f_optimized._spec_1 x_6 x_1;
      ret x_9
    Bool.true 
      let x_10 : obj := proj[0] x_1;
      let x_11 : obj := proj[1] x_1;
      inc x_11;
      inc x_10;
      dec x_1;
      let x_12 : obj := 1;
      let x_13 : obj := Nat.add x_10 x_12;
      dec x_10;
      let x_14 : obj := ctor_1[List.cons] x_13 x_2;
      let x_15 : obj := List.mapTR.loop._at.f_optimized._spec_1 x_11 x_14;
      ret x_15
def List.mapTR.loop._at.f_optimized._spec_2 (x_1 : obj) (x_2 : obj) : obj :=
  case x_1 : obj of
  List.nil 
    let x_3 : obj := List.reverse._rarg x_2;
    ret x_3
  List.cons 
    let x_4 : u8 := isShared x_1;
    case x_4 : u8 of
    Bool.false 
      let x_5 : obj := proj[0] x_1;
      let x_6 : obj := proj[1] x_1;
      let x_7 : obj := 2;
      let x_8 : obj := Nat.mul x_5 x_7;
      dec x_5;
      set x_1[1] := x_2;
      set x_1[0] := x_8;
      let x_9 : obj := List.mapTR.loop._at.f_optimized._spec_2 x_6 x_1;
      ret x_9
    Bool.true 
      let x_10 : obj := proj[0] x_1;
      let x_11 : obj := proj[1] x_1;
      inc x_11;
      inc x_10;
      dec x_1;
      let x_12 : obj := 2;
      let x_13 : obj := Nat.mul x_10 x_12;
      dec x_10;
      let x_14 : obj := ctor_1[List.cons] x_13 x_2;
      let x_15 : obj := List.mapTR.loop._at.f_optimized._spec_2 x_11 x_14;
      ret x_15
def f_optimized (x_1 : obj) : obj :=
  let x_2 : obj := ctor_0[List.nil];
  let x_3 : obj := List.mapTR.loop._at.f_optimized._spec_1 x_1 x_2;
  let x_4 : obj := List.mapTR.loop._at.f_optimized._spec_2 x_3 x_2;
  ret x_4
#eval Lean.Compiler.LCNF.showDecl .base ``f_optimized
def f_optimized xs : List Nat :=
  let _x.1 := instMulNat;
  let _x.2 := @instHMul _ _x.1;
  fun _f.3 x.4 : Nat :=
    let _x.5 := _x.2 # 0;
    let _x.6 := 2;
    let _x.7 := instOfNatNat _x.6;
    let _x.8 := _x.7 # 0;
    let _x.9 := _x.5 x.4 _x.8;
    return _x.9;
  let _x.10 := instAddNat;
  let _x.11 := @instHAdd _ _x.10;
  fun _f.12 x.13 : Nat :=
    let _x.14 := _x.11 # 0;
    let _x.15 := 1;
    let _x.16 := instOfNatNat _x.15;
    let _x.17 := _x.16 # 0;
    let _x.18 := _x.14 x.13 _x.17;
    return _x.18;
  let _x.19 := @List.mapTR _ _ _f.12 xs;
  let _x.20 := @List.mapTR _ _ _f.3 _x.19;
  return _x.20

Henrik Böving (Jun 13 2025 at 09:43):

Because the compile has no support for fusion right now.


Last updated: Dec 20 2025 at 21:32 UTC