leanprover / leanprover/lean4

Compiler fails to optimize out irrelevant comparison

Open
#9,875 1 comment 0 reactions 1 assignee View on GitHub

@zwarich is already working on this.

Since Aug 12, 2025.

bug code-generator P-medium
Dominant language
Lean
Stars
9.2k
Forks
990
Avg merge
1d 17h
Merged PRs (30d)
175

Description

Prerequisites

Please put an X between the brackets as you perform the following steps:

Description
set_option trace.compiler.ir.result true in
@[inline]
def foo (b : UInt8) : Option UInt8 :=
  if 0xd8 ≤ b ∧ b ≤ 0xdf then
    none
  else
    some b

set_option trace.compiler.ir.result true in
def foo' (b) (h : (foo b).isSome) : UInt8 :=
  (foo b).get h

Here we get the IR

    def foo'._redArg (x_1 : u8) : u8 :=
      let x_2 : u8 := 216;
      let x_3 : u8 := UInt8.decLe x_2 x_1;
      case x_3 : u8 of
      Bool.false →
        ret x_1
      Bool.true →
        ret x_1

which is clearly suboptimal.

Expected behavior: Compiler should generate IR ret x_1 for foo'.redArg

Actual behavior: See above

Versions

Lean 4.23.0-nightly-2025-08-12 on live.lean-lang.org

Impact

Add 👍 to issues you consider important. If others are impacted by this issue, please ask them to add 👍 to it.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.