Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in / Register
GHC
GHC
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 4,388
    • Issues 4,388
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
    • Iterations
  • Merge Requests 377
    • Merge Requests 377
  • Requirements
    • Requirements
    • List
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Operations
    • Operations
    • Incidents
    • Environments
  • Analytics
    • Analytics
    • CI / CD
    • Code Review
    • Insights
    • Issue
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Glasgow Haskell Compiler
  • GHCGHC
  • Issues
  • #19176

Closed
Open
Opened Jan 05, 2021 by Neo@nmichael44

Linear search when compiling case expression on Integers

When compiling a function like the following:

h' :: Integer -> Integer 
h' 7 = 1
h' 6 = 10
h' 5 = 100
h' 4 = 1000
h' 3 = 10000
h' 2 = 100000
h' 1 = 1000000
h' 0 = 10000000
h' _ = 2

we generate the following core:

h'
  = \ (ds_d7A1 :: Integer) ->
      case integer-gmp-1.0.2.0:GHC.Integer.Type.eqInteger#
             ds_d7A1 Magic2.h'6
      of {
        __DEFAULT ->
          case integer-gmp-1.0.2.0:GHC.Integer.Type.eqInteger#
                 ds_d7A1 Magic2.h'5
          of {
            __DEFAULT ->
              case integer-gmp-1.0.2.0:GHC.Integer.Type.eqInteger#
                     ds_d7A1 Magic2.h'4
              of {
                __DEFAULT ->
                  case integer-gmp-1.0.2.0:GHC.Integer.Type.eqInteger#
                         ds_d7A1 Magic2.h'3
                  of {
                    __DEFAULT ->
                      case integer-gmp-1.0.2.0:GHC.Integer.Type.eqInteger#
                             ds_d7A1 Magic2.h'2
                      of {
                        __DEFAULT ->
                          case integer-gmp-1.0.2.0:GHC.Integer.Type.eqInteger#
                                 ds_d7A1 Magic2.h9
                          of {
                            __DEFAULT ->
                              case integer-gmp-1.0.2.0:GHC.Integer.Type.eqInteger#
                                     ds_d7A1 Magic2.h1
                              of {
                                __DEFAULT ->
                                  case integer-gmp-1.0.2.0:GHC.Integer.Type.eqInteger#
                                         ds_d7A1 Magic2.h'1
                                  of {
                                    __DEFAULT -> Magic2.h9;
                                    1# -> Magic2.h8
                                  };
                                1# -> Magic2.h7
                              };
                            1# -> Magic2.h6
                          };
                        1# -> Magic2.h5
                      };
                    1# -> Magic2.h4
                  };
                1# -> Magic2.h3
              };
            1# -> Magic2.h2
          };
        1# -> Magic2.h1
      }

So we linearly go through the list of integers. There is really no good reason why we couldn't do binary search here (like we do if Integer is changed to Int).

Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking
None
Due date
None
Reference: ghc/ghc#19176