Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

loopbreaker test suite failure on ghc 8.8, doesn't break recursion in let/where bindings? #10

Open
DanBurton opened this issue Nov 20, 2019 · 0 comments

Comments

@DanBurton
Copy link

I was able to reproduce this locally like so:

stack unpack loopbreaker-0.1.1.1 && cd loopbreaker-0.1.1.1
echo 'resolver: nightly-2019-11-20' > stack.yaml
stack build --test --bench --no-run-benchmarks --fast

Here's the log output

DisableFlag
  plugin
    should respect disable flag
InlineRecCalls
  plugin
    should explicitly break recursion in global bindings
    should explicitly break recursion in where bindings FAILED [1]
    should explicitly break recursion in let bindings FAILED [2]
PragmaDetection
  plugin
    should respect INLINE pragma

Failures:

  test/TestUtils.hs:14:56:
  1) InlineRecCalls.plugin should explicitly break recursion in where bindings
       uncaught exception: ErrorCall
       test/InlineRecCallsSpec.hs:20:21: localRecursiveWhere === localMutual failed:
           LHS:
               localRecursiveWhere :: Int -> Int
               [LclIdX,
                Arity=1,
                Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 30 60}]
               localRecursiveWhere = local @ Int $fEqInt $fNumInt

               lvl_saou :: Integer
               [LclId,
                Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 100 0}]
               lvl_saou = 1

               lvl_saos :: Integer
               [LclId,
                Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 100 0}]
               lvl_saos = 0

               local [InlPrag=INLINE (sat-args=1)]
                 :: forall p. (Eq p, Num p) => p -> p
               [LclId,
                Arity=3,
                Str=<S(C(C(S))L),U(C(C1(U)),A)><L,U(A,C(C1(U)),C(C1(U)),A,A,A,C(U))><L,U>,
                Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True,
                        Guidance=ALWAYS_IF(arity=3,unsat_ok=False,boring_ok=False)
                        Tmpl= \ (@ p)
                                ($dEq_a9Yo [Occ=OnceL] :: Eq p)
                                ($dNum_a9Yp :: Num p) ->
                                letrec {
                                  local [Occ=LoopBreaker] :: p -> p
                                  [LclId,
                                   Arity=1,
                                   Unf=Unf{Src=<vanilla>, TopLvl=False, Value=True, ConLike=True,
                                           WorkFree=True, Expandable=True, Guidance=IF_ARGS [0] 550 0}]
                                  local
                                    = \ (ds_dajc :: p) ->
                                        case == @ p $dEq_a9Yo ds_dajc (fromInteger @ p $dNum_a9Yp 0) of {
                                          False ->
                                            * @ p
                                              $dNum_a9Yp
                                              ds_dajc
                                              (local
                                                 (- @ p
                                                    $dNum_a9Yp
                                                    ds_dajc
                                                    (fromInteger @ p $dNum_a9Yp 1)));
                                          True -> fromInteger @ p $dNum_a9Yp 1
                                        }; } in
                                local}]
               local
                 = \ (@ p)
                     ($dEq_a9Yo [Dmd=<S(C(C(S))L),U(C(C1(U)),A)>] :: Eq p)
                     ($dNum_a9Yp [Dmd=<L,U(A,C(C1(U)),C(C1(U)),A,A,A,C(U))>] :: Num p)
                     (eta_B1 :: p) ->
                     let {
                       lvl_saoD :: p
                       [LclId,
                        Unf=Unf{Src=<vanilla>, TopLvl=False, Value=False, ConLike=False,
                                WorkFree=False, Expandable=False, Guidance=IF_ARGS [] 30 0}]
                       lvl_saoD = fromInteger @ p $dNum_a9Yp lvl_saou } in
                     let {
                       lvl_saoz :: p
                       [LclId,
                        Unf=Unf{Src=<vanilla>, TopLvl=False, Value=False, ConLike=False,
                                WorkFree=False, Expandable=False, Guidance=IF_ARGS [] 30 0}]
                       lvl_saoz = fromInteger @ p $dNum_a9Yp lvl_saos } in
                     letrec {
                       local [Occ=LoopBreaker] :: p -> p
                       [LclId,
                        Arity=1,
                        Str=<L,U> {a9Yo-><S(C(C(S))L),U(C(C1(U)),A)>},
                        Unf=Unf{Src=<vanilla>, TopLvl=False, Value=True, ConLike=True,
                                WorkFree=True, Expandable=True, Guidance=IF_ARGS [0] 160 0}]
                       local
                         = \ (ds_dajc :: p) ->
                             case == @ p $dEq_a9Yo ds_dajc lvl_saoz of {
                               False ->
                                 * @ p
                                   $dNum_a9Yp
                                   ds_dajc
                                   (local (- @ p $dNum_a9Yp ds_dajc lvl_saoD));
                               True -> lvl_saoD
                             }; } in
                     local eta_B1

           RHS:
               localMutual [InlPrag=INLINE (sat-args=1)] :: Int -> Int
               [LclIdX,
                Arity=1,
                Str=<S(S),1*U(1*U)>,
                Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True,
                        Guidance=ALWAYS_IF(arity=1,unsat_ok=False,boring_ok=True)
                        Tmpl= local}]
               localMutual = local

               lvl_saol :: Int
               [LclId,
                Str=m,
                Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 10 20}]
               lvl_saol = I# 1#

               $wlocal [InlPrag=NOUSERINLINE[2], Occ=LoopBreaker] :: Int# -> Int
               [LclId,
                Arity=1,
                Str=<S,1*U>,
                Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True, Guidance=IF_ARGS [30] 150 0}]
               $wlocal
                 = \ (ww_sar7 [Dmd=<S,1*U>] :: Int#) ->
                     case ww_sar7 of ds_Xajd {
                       __DEFAULT ->
                         let {
                           wild_Xo :: Int
                           [LclId,
                            Unf=Unf{Src=<vanilla>, TopLvl=False, Value=True, ConLike=True,
                                    WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 10 20}]
                           wild_Xo = I# ds_Xajd } in
                         * @ Int
                           $fNumInt
                           wild_Xo
                           (case - @ Int $fNumInt wild_Xo lvl_saol of
                            { I# ww_Xash [Dmd=<S,1*U>] ->
                            $wlocal ww_Xash
                            });
                       0# -> lvl_saol
                     }

               local [InlPrag=NOUSERINLINE[2]] :: Int -> Int
               [LclId,
                Arity=1,
                Str=<S(S),1*U(1*U)>,
                Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True,
                        Guidance=ALWAYS_IF(arity=1,unsat_ok=True,boring_ok=False)
                        Tmpl= \ (w_sar4 [Occ=Once!] :: Int) ->
                                case w_sar4 of { I# ww_sar7 [Occ=Once, Dmd=<S,U>] ->
                                $wlocal ww_sar7
                                }}]
               local
                 = \ (w_sar4 [Dmd=<S(S),1*U(1*U)>] :: Int) ->
                     case w_sar4 of { I# ww_sar7 [Dmd=<S,1*U>] -> $wlocal ww_sar7 }

       CallStack (from HasCallStack):
         error, called at test/TestUtils.hs:14:56 in main:TestUtils

  To rerun use: --match "/InlineRecCalls/plugin/should explicitly break recursion in where bindings/"

  test/TestUtils.hs:14:56:
  2) InlineRecCalls.plugin should explicitly break recursion in let bindings
       uncaught exception: ErrorCall
       test/InlineRecCallsSpec.hs:22:21: localRecursiveLet === localMutual failed:
           LHS:
               localRecursiveLet :: Int -> Int
               [LclIdX,
                Arity=1,
                Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 30 60}]
               localRecursiveLet = local @ Int $fEqInt $fNumInt

               lvl_saou :: Integer
               [LclId,
                Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 100 0}]
               lvl_saou = 1

               lvl_saos :: Integer
               [LclId,
                Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 100 0}]
               lvl_saos = 0

               local [InlPrag=INLINE (sat-args=1)]
                 :: forall p. (Eq p, Num p) => p -> p
               [LclId,
                Arity=3,
                Str=<S(C(C(S))L),U(C(C1(U)),A)><L,U(A,C(C1(U)),C(C1(U)),A,A,A,C(U))><L,U>,
                Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True,
                        Guidance=ALWAYS_IF(arity=3,unsat_ok=False,boring_ok=False)
                        Tmpl= \ (@ p)
                                ($dEq_a9XA [Occ=OnceL] :: Eq p)
                                ($dNum_a9XB :: Num p) ->
                                letrec {
                                  local [Occ=LoopBreaker] :: p -> p
                                  [LclId,
                                   Arity=1,
                                   Unf=Unf{Src=<vanilla>, TopLvl=False, Value=True, ConLike=True,
                                           WorkFree=True, Expandable=True, Guidance=IF_ARGS [0] 550 0}]
                                  local
                                    = \ (ds_daj6 :: p) ->
                                        case == @ p $dEq_a9XA ds_daj6 (fromInteger @ p $dNum_a9XB 0) of {
                                          False ->
                                            * @ p
                                              $dNum_a9XB
                                              ds_daj6
                                              (local
                                                 (- @ p
                                                    $dNum_a9XB
                                                    ds_daj6
                                                    (fromInteger @ p $dNum_a9XB 1)));
                                          True -> fromInteger @ p $dNum_a9XB 1
                                        }; } in
                                local}]
               local
                 = \ (@ p)
                     ($dEq_a9XA [Dmd=<S(C(C(S))L),U(C(C1(U)),A)>] :: Eq p)
                     ($dNum_a9XB [Dmd=<L,U(A,C(C1(U)),C(C1(U)),A,A,A,C(U))>] :: Num p)
                     (eta_B1 :: p) ->
                     let {
                       lvl_saox :: p
                       [LclId,
                        Unf=Unf{Src=<vanilla>, TopLvl=False, Value=False, ConLike=False,
                                WorkFree=False, Expandable=False, Guidance=IF_ARGS [] 30 0}]
                       lvl_saox = fromInteger @ p $dNum_a9XB lvl_saou } in
                     let {
                       lvl_saot :: p
                       [LclId,
                        Unf=Unf{Src=<vanilla>, TopLvl=False, Value=False, ConLike=False,
                                WorkFree=False, Expandable=False, Guidance=IF_ARGS [] 30 0}]
                       lvl_saot = fromInteger @ p $dNum_a9XB lvl_saos } in
                     letrec {
                       local [Occ=LoopBreaker] :: p -> p
                       [LclId,
                        Arity=1,
                        Str=<L,U> {a9XA-><S(C(C(S))L),U(C(C1(U)),A)>},
                        Unf=Unf{Src=<vanilla>, TopLvl=False, Value=True, ConLike=True,
                                WorkFree=True, Expandable=True, Guidance=IF_ARGS [0] 160 0}]
                       local
                         = \ (ds_daj6 :: p) ->
                             case == @ p $dEq_a9XA ds_daj6 lvl_saot of {
                               False ->
                                 * @ p
                                   $dNum_a9XB
                                   ds_daj6
                                   (local (- @ p $dNum_a9XB ds_daj6 lvl_saox));
                               True -> lvl_saox
                             }; } in
                     local eta_B1

           RHS:
               localMutual [InlPrag=INLINE (sat-args=1)] :: Int -> Int
               [LclIdX,
                Arity=1,
                Str=<S(S),1*U(1*U)>,
                Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True,
                        Guidance=ALWAYS_IF(arity=1,unsat_ok=False,boring_ok=True)
                        Tmpl= local}]
               localMutual = local

               lvl_saol :: Int
               [LclId,
                Str=m,
                Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 10 20}]
               lvl_saol = I# 1#

               $wlocal [InlPrag=NOUSERINLINE[2], Occ=LoopBreaker] :: Int# -> Int
               [LclId,
                Arity=1,
                Str=<S,1*U>,
                Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True, Guidance=IF_ARGS [30] 150 0}]
               $wlocal
                 = \ (ww_sar7 [Dmd=<S,1*U>] :: Int#) ->
                     case ww_sar7 of ds_Xajd {
                       __DEFAULT ->
                         let {
                           wild_Xo :: Int
                           [LclId,
                            Unf=Unf{Src=<vanilla>, TopLvl=False, Value=True, ConLike=True,
                                    WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 10 20}]
                           wild_Xo = I# ds_Xajd } in
                         * @ Int
                           $fNumInt
                           wild_Xo
                           (case - @ Int $fNumInt wild_Xo lvl_saol of
                            { I# ww_Xash [Dmd=<S,1*U>] ->
                            $wlocal ww_Xash
                            });
                       0# -> lvl_saol
                     }

               local [InlPrag=NOUSERINLINE[2]] :: Int -> Int
               [LclId,
                Arity=1,
                Str=<S(S),1*U(1*U)>,
                Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
                        WorkFree=True, Expandable=True,
                        Guidance=ALWAYS_IF(arity=1,unsat_ok=True,boring_ok=False)
                        Tmpl= \ (w_sar4 [Occ=Once!] :: Int) ->
                                case w_sar4 of { I# ww_sar7 [Occ=Once, Dmd=<S,U>] ->
                                $wlocal ww_sar7
                                }}]
               local
                 = \ (w_sar4 [Dmd=<S(S),1*U(1*U)>] :: Int) ->
                     case w_sar4 of { I# ww_sar7 [Dmd=<S,1*U>] -> $wlocal ww_sar7 }

       CallStack (from HasCallStack):
         error, called at test/TestUtils.hs:14:56 in main:TestUtils

  To rerun use: --match "/InlineRecCalls/plugin/should explicitly break recursion in let bindings/"

Randomized with seed 1398579975

Finished in 0.0139 seconds
5 examples, 2 failures
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant