X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=c%CE%BBash%2FCLasH%2FNormalize.hs;h=f0f2de2fccba3187092c4958bc1e3382cc0c0682;hb=ac348492299cb46ea04e15a9cecf01b4c80a3f1c;hp=4743824bf2ba85313b3bb4bf1241f00e0f47e2d2;hpb=3fc90df84f37ade227d663a21852a3c4e4d0a727;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git "a/c\316\273ash/CLasH/Normalize.hs" "b/c\316\273ash/CLasH/Normalize.hs" index 4743824..f0f2de2 100644 --- "a/c\316\273ash/CLasH/Normalize.hs" +++ "b/c\316\273ash/CLasH/Normalize.hs" @@ -402,7 +402,7 @@ scrutbndrremove, scrutbndrremovetop :: Transform -- all occurences of the binder with the scrutinee variable. scrutbndrremove (Case (Var scrut) bndr ty alts) | bndr_used = do alts' <- mapM subs_bndr alts - return $ Case (Var scrut) wild ty alts' + change $ Case (Var scrut) wild ty alts' where is_used (_, _, expr) = expr_uses_binders [bndr] expr bndr_used = or $ map is_used alts @@ -616,6 +616,11 @@ argprop expr@(App _ _) | is_var fexpr = do let free_vars = VarSet.varSetElems $ CoreFVs.exprSomeFreeVars interesting arg -- Mark the current expression as changed setChanged + -- TODO: Clone the free_vars (and update references in arg), since + -- this might cause conflicts if two arguments that are propagated + -- share a free variable. Also, we are now introducing new variables + -- into a function that are not fresh, which violates the binder + -- uniqueness invariant. return (map Var free_vars, free_vars, arg) else do -- Representable types will not be propagated, and arguments with free