# Compiler optimization inside MetaProgramming? (precompile Expression)

**URL:** <https://discourse.julialang.org/t/compiler-optimization-inside-metaprogramming-precompile-expression/96256>\
**Category:** General Usage\
**Tags:** question, metaprogramming, precompilation\
**Created:** [March 17, 2023, 5:58pm UTC](https://discourse.julialang.org/t/compiler-optimization-inside-metaprogramming-precompile-expression/96256 "2023-03-17T17:58:30Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![FireCrumb](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/firecrumb/32/35370_2.png) [@FireCrumb](https://discourse.julialang.org/u/FireCrumb)\
**Post date:** [March 17, 2023, 5:58pm UTC](https://discourse.julialang.org/t/compiler-optimization-inside-metaprogramming-precompile-expression/96256/1 "2023-03-17T17:58:30Z")

</div>

Hi, I have a function expression (as input), and it is greatly simplified by the time it becomes LLVM code.  
How can I get the optimized simplified version back as an Expression?

Origin expression:

```julia
ex = :(
    function ab(bt)

        function a(x, y)
            t = 5
            v = y*y
            return x*2
        end;

        function b(t)
            return a(t+1, 0)
        end;

        b(bt)
    end;
)

eval(ex)

```

`MacroTools.prettify(ex)`

```julia
:(function ab(bt)
      function a(x, y)
          t = 5
          v = y * y
          return x * 2
      end
      function b(t)
          return a(t + 1, 0)
      end
      b(bt)
  end)

```

`@code_llvm ab(5)`

```julia
; @ func_expr_simple.ipynb:2 within `ab`
define i64 @julia_ab_2973(i64 signext %0) #0 {
top:
; @ func_expr_simple.ipynb:14 within `ab`
; ┌ @ func_expr_simple.ipynb:11 within `b`
; │┌ @ func_expr_simple.ipynb:7 within `a`
; ││┌ @ int.jl:88 within `*`
     %1 = shl i64 %0, 1
     %2 = add i64 %1, 2
; └└└
  ret i64 %2
}

```

How can I get an Expr where the unused variables (y, t, v) are gone, the functions (a, b) are inlined etc?

---

<div class="post-metadata">

**Author:** ![Keno](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/keno/32/285_2.png) [@Keno](https://discourse.julialang.org/u/Keno)\
**Post date:** [March 17, 2023, 6:14pm UTC](https://discourse.julialang.org/t/compiler-optimization-inside-metaprogramming-precompile-expression/96256/2 "2023-03-17T18:14:46Z")

</div>

`@code_typed ab(5)` will give you a post-inlined code-info, that in theory you could build an AST from, but you can’t directly get an AST for the optimized code, because it doesn’t exist in AST form.

---

<div class="post-metadata">

**Author:** ![FireCrumb](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/firecrumb/32/35370_2.png) [@FireCrumb](https://discourse.julialang.org/u/FireCrumb)\
**Post date:** [March 17, 2023, 6:16pm UTC](https://discourse.julialang.org/t/compiler-optimization-inside-metaprogramming-precompile-expression/96256/3 "2023-03-17T18:16:09Z")

</div>

Is there a way to get the AST of optimized code with functions inlined, unused variables removed etc?

---

<div class="post-metadata">

**Author:** ![Keno](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/keno/32/285_2.png) [@Keno](https://discourse.julialang.org/u/Keno)\
**Post date:** [March 17, 2023, 6:20pm UTC](https://discourse.julialang.org/t/compiler-optimization-inside-metaprogramming-precompile-expression/96256/4 "2023-03-17T18:20:00Z")

</div>

No, definitionally, because it’s not a syntax tree anymore at that point.

---

<div class="post-metadata">

**Author:** ![FireCrumb](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/firecrumb/32/35370_2.png) [@FireCrumb](https://discourse.julialang.org/u/FireCrumb)\
**Post date:** [March 17, 2023, 6:46pm UTC](https://discourse.julialang.org/t/compiler-optimization-inside-metaprogramming-precompile-expression/96256/5 "2023-03-17T18:46:51Z")

</div>

What’s the latest stage when it is still a AST and how can I pull the structure from it?

---

<div class="post-metadata">

**Author:** ![simeonschaub](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/simeonschaub/32/216566_2.png) [@simeonschaub](https://discourse.julialang.org/u/simeonschaub)\
**Post date:** [March 17, 2023, 7:00pm UTC](https://discourse.julialang.org/t/compiler-optimization-inside-metaprogramming-precompile-expression/96256/6 "2023-03-17T19:00:12Z")

</div>

Lowering to IR form is the first step in the compilation pipeline, so we never run any optimizations over the AST representation
