`elemIndex` and `findIndex` still can't fuse
Ticket #14387 (closed) introduced a change to the implementation of listToMaybe
to allow:
findIndex p = listToMaybe . findIndices p
to fuse.
However, to take advantage of this, it looks like we also need findIndex
(and elemIndex
) to be marked inlinable (or some similar step).
As a concrete example, the module:
module Foo where
import Data.List (findIndex)
foo :: Maybe Int
foo = findIndex (==999999) [1..1000000]
compiled with GHC 8.4.3 using -O2
produces the following unfused core:
foo_go
= \ ds1_a2ws eta_a2wt ->
case ds1_a2ws of {
[] -> Nothing;
: y_a2wx ys_a2wy ->
case eqInteger# y_a2wx ds_r2we of {
__DEFAULT -> foo_go ys_a2wy (+# eta_a2wt 1#);
1# -> Just (I# eta_a2wt)
}
}
foo = foo_go (enumDeltaToInteger1 foo2 foo1) 0#
but if the definition of findIndex
from Data.OldList
is copied into the module or imported from another module with an INLINABLE
pragma, then it fuses fine:
foo_go
= \ x_a2Du eta_B1 ->
case gtInteger# x_a2Du lim_r2Ey of {
__DEFAULT ->
case eqInteger# x_a2Du ds_r2Cv of {
__DEFAULT -> foo_go (plusInteger x_a2Du foo1) (+# eta_B1 1#);
1# -> Just (I# eta_B1)
};
1# -> Nothing
}
foo = foo_go foo1 0#
Trac metadata
Trac field | Value |
---|---|
Version | 8.4.3 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | libraries/base |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |