on master help sign in
Get TCE working en let-expressions
a4c4c4bEvan Czaplicki
compiler/src/Optimize/Expression.hs+10−3
@@ -361,13 +361,20 @@ optimizePotentialTailCall cycle name args expr =
361optimizeTail :: Cycle -> N.Name -> [N.Name] -> Can.Expr -> Names.Tracker Opt.Expr
361optimizeTail :: Cycle -> N.Name -> [N.Name] -> Can.Expr -> Names.Tracker Opt.Expr
362optimizeTail cycle rootName argNames locExpr@(A.At _ expression) =
362optimizeTail cycle rootName argNames locExpr@(A.At _ expression) =
363 case expression of
363 case expression of
364− Can.Call func@(A.At _ (Can.VarTopLevel _ name)) args ->
364+ Can.Call func args ->
365 do oargs <- traverse (optimize cycle) args
365 do oargs <- traverse (optimize cycle) args
366− if name == rootName
366+
367+ let isMatchingName =
368+ case A.toValue func of
369+ Can.VarLocal name -> rootName == name
370+ Can.VarTopLevel _ name -> rootName == name
371+ _ -> False
372+
373+ if isMatchingName
367 then
374 then
368 case Index.indexedZipWith (\_ a b -> (a,b)) argNames oargs of
375 case Index.indexedZipWith (\_ a b -> (a,b)) argNames oargs of
369 Index.LengthMatch pairs ->
376 Index.LengthMatch pairs ->
370− pure $ Opt.TailCall name pairs
377+ pure $ Opt.TailCall rootName pairs
371
378
372 Index.LengthMismatch _ _ ->
379 Index.LengthMismatch _ _ ->
373 do ofunc <- optimize cycle func
380 do ofunc <- optimize cycle func