Skip to content
Snippets Groups Projects
Commit 0519cfa9 authored by chrg's avatar chrg
Browse files

Many changes made

parent bbb72301
No related branches found
No related tags found
No related merge requests found
Showing
with 300 additions and 29 deletions
......@@ -185,10 +185,21 @@ reduceCFunDef
-> Context
-> m (C.CFunctionDef C.NodeInfo)
reduceCFunDef (C.CFunDef spc dec cdecls smt ni) ctx = do
let spc'' =
filter
( \case
C.CStorageSpec (C.CStatic _) -> False
_ow -> True
)
spc
spc' <-
if spc'' /= spc
then split ("remove static", C.posOf ni) (pure spc'') (pure spc)
else pure spc
smt' <- reduceCStatementOrEmptyBlock smt ctx'
pure $
C.CFunDef
(inlineTypeDefsSpecs spc ctx)
(inlineTypeDefsSpecs spc' ctx)
(inlineTypeDefsCDeclarator dec ctx)
(map (`inlineTypeDefsCDeclaration` ctx) cdecls)
smt'
......@@ -282,7 +293,8 @@ reduceCStatementOrEmptyBlock stmt ctx = do
ex
Nothing -> do
pure emptyBlock
where
emptyBlock :: C.CStatement C.NodeInfo
emptyBlock = C.CCompound [] [] C.undefNode
reduceCStatement
......@@ -328,12 +340,17 @@ reduceCStatement smt ctx = case smt of
maybeSplit ("remove else branch", C.posOf els') do
reduceCStatement els' ctx
Nothing -> pure Nothing
s' <- reduceCStatementOrEmptyBlock s ctx
case (e', els') of
(Nothing, Nothing) -> pure s'
(Just e'', Nothing) -> pure $ C.CIf e'' s' Nothing ni
(Nothing, Just x) -> pure $ C.CIf zeroExpr s' (Just x) ni
(Just e'', Just x) -> pure $ C.CIf e'' s' (Just x) ni
ms' <- maybeSplit ("remove if branch", C.posOf s) do
reduceCStatement s ctx
case (e', ms', els') of
(Nothing, Nothing, Nothing) -> pure emptyBlock
(Just e'', Just s', Nothing) -> pure $ C.CIf e'' s' Nothing ni
(Nothing, Just s', Just x) -> pure $ C.CIf zeroExpr s' (Just x) ni
(Just e'', Just s', Just x) -> pure $ C.CIf e'' s' (Just x) ni
(Just e'', Nothing, Nothing) -> pure $ C.CExpr (Just e'') C.undefNode
(Nothing, Nothing, Just x) -> pure x
(Just e'', Nothing, Just x) -> pure $ C.CIf e'' emptyBlock (Just x) ni
(Nothing, Just s', Nothing) -> pure s'
C.CFor e1 e2 e3 s ni -> Just $ do
(me1', ctx') <- case e1 of
C.CForDecl (C.CDecl rec decl ni') -> do
......@@ -429,7 +446,10 @@ reduceCExprOrZero :: (MonadReduce Lab m, HasCallStack) => C.CExpr -> Context ->
reduceCExprOrZero expr ctx = do
case reduceCExpr expr ctx of
Just ex -> do
split ("replace by zero", C.posOf expr) (pure zeroExpr) ex
r <- ex
if r == zeroExpr
then pure r
else split ("replace by zero", C.posOf expr) (pure zeroExpr) (pure r)
Nothing -> do
pure zeroExpr
{-# INLINE reduceCExprOrZero #-}
......@@ -480,11 +500,19 @@ reduceCExpr expr ctx = case expr of
e <- elhs'
pure $ C.CUnary o e ni
C.CCall e es ni -> do
re <- reduceCExpr e (addKeyword DisallowVariableInlining ctx)
Just $ do
e' <- re
es' <- traverse (`reduceCExprOrZero` ctx) es
pure $ C.CCall e' es' ni
let re = reduceCExpr e (addKeyword DisallowVariableInlining ctx)
res = map (`reduceCExpr` ctx) es
case (re, catMaybes res) of
(Nothing, []) -> Nothing
(Nothing, [r]) -> Just r
(_, _) -> Just do
e' <- maybeSplit ("do without function", C.posOf e) re
es' <- res & traverse (maybeSplit ("do without pram", C.posOf e))
case (e', catMaybes es') of
(Nothing, []) -> pure zeroExpr
(Nothing, [e'']) -> pure e''
(Nothing, es'') -> pure $ C.CComma es'' C.undefNode
(Just f, _) -> pure $ C.CCall f (map (fromMaybe zeroExpr) es') ni
C.CCond ec et ef ni -> do
-- TODO: More fine grained reduction is possible here.
Just $ do
......
int f(int a) {
}
static int g(int a) {
}
int main() {
return f(g(42));
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
// 0 do without function at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
......
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 0 do without function at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
......
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 0 do without function at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
......
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 0 do without function at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return a + b;
}
int main()
{
return 0;
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
// 0 do without function at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
......
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 0 do without function at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return a + b;
}
int main()
{
return 0;
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 0 do without function at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
......
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 0 do without function at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return a + b;
}
int main()
{
return 0;
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 1 do without function at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return a + b;
}
int main()
{
return (10, 23);
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 1 do without function at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return a + b;
}
int main()
{
return 0;
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 1 do without function at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return a + b;
}
int main()
{
return 10;
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 1 do without function at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return a + b;
}
int main()
{
return 0;
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 1 do without function at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return a + b;
}
int main()
{
return 23;
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 1 do without function at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return a + b;
}
int main()
{
return 0;
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 1 do without function at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
// 1 do without pram at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return a + b;
}
int main()
{
return 0;
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 0 replace by zero at ("test/cases/small/add.c": line 2)
// 1 remove statement at ("test/cases/small/add.c": line 6)
int add(int a, int b)
......
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 1 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 0 do without function at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 0 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return 0;
}
int main()
{
return add(10, 23);
}
// 0 remove function add at ("test/cases/small/add.c": line 1)
// 0 remove statement at ("test/cases/small/add.c": line 2)
// 0 reduce to left at ("test/cases/small/add.c": line 2)
// 0 reduce to right at ("test/cases/small/add.c": line 2)
// 1 replace by zero at ("test/cases/small/add.c": line 2)
// 0 remove statement at ("test/cases/small/add.c": line 6)
// 0 do without function at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 0 do without pram at ("test/cases/small/add.c": line 6)
// 1 replace by zero at ("test/cases/small/add.c": line 6)
int add(int a, int b)
{
return 0;
}
int main()
{
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment