From e06548f106b09ee243ce80f39e06ef0c95c7e93e Mon Sep 17 00:00:00 2001
From: Christian Gram Kalhauge <chrg@dtu.dk>
Date: Thu, 22 Feb 2024 09:38:12 +0100
Subject: [PATCH] Work in progress

---
 rtree-c/src/ReduceC.hs                        | 78 +++++++++++++++----
 rtree-c/test/cases/constant.c                 |  6 ++
 rtree-c/test/expected/constant/main.c         |  6 ++
 .../test/expected/constant/reduction/r000.c   |  6 ++
 .../expected/constant/reduction/r000.choices  |  3 +
 .../test/expected/constant/reduction/r001.c   |  5 ++
 .../expected/constant/reduction/r001.choices  |  3 +
 .../test/expected/constant/reduction/r010.c   |  5 ++
 .../expected/constant/reduction/r010.choices  |  3 +
 .../r1.c => constant/reduction/r011.c}        |  2 +-
 .../expected/constant/reduction/r011.choices  |  3 +
 .../test/expected/constant/reduction/r100.c   |  5 ++
 .../expected/constant/reduction/r100.choices  |  3 +
 .../test/expected/constant/reduction/r101.c   |  4 +
 .../expected/constant/reduction/r101.choices  |  3 +
 .../test/expected/constant/reduction/r110.c   |  4 +
 .../expected/constant/reduction/r110.choices  |  3 +
 .../test/expected/constant/reduction/r111.c   |  3 +
 .../expected/constant/reduction/r111.choices  |  3 +
 .../typedef/reduction/{r000.c => r0000.c}     |  0
 .../reduction/{r000.choices => r0000.choices} |  1 +
 .../typedef/reduction/{r001.c => r0001.c}     |  0
 .../reduction/{r001.choices => r0001.choices} |  1 +
 .../test/expected/typedef/reduction/r0010.c   |  8 ++
 .../expected/typedef/reduction/r0010.choices  |  4 +
 .../test/expected/typedef/reduction/r0011.c   |  7 ++
 .../expected/typedef/reduction/r0011.choices  |  4 +
 .../typedef/reduction/{r010.c => r0100.c}     |  0
 .../reduction/{r010.choices => r0100.choices} |  1 +
 .../typedef/reduction/{r011.c => r0101.c}     |  0
 .../reduction/{r011.choices => r0101.choices} |  1 +
 .../test/expected/typedef/reduction/r0110.c   |  5 ++
 .../expected/typedef/reduction/r0110.choices  |  4 +
 .../test/expected/typedef/reduction/r0111.c   |  4 +
 .../expected/typedef/reduction/r0111.choices  |  4 +
 .../typedef/reduction/{r100.c => r1000.c}     |  0
 .../reduction/{r100.choices => r1000.choices} |  1 +
 .../typedef/reduction/{r101.c => r1001.c}     |  0
 .../reduction/{r101.choices => r1001.choices} |  1 +
 .../test/expected/typedef/reduction/r1010.c   |  7 ++
 .../expected/typedef/reduction/r1010.choices  |  4 +
 .../test/expected/typedef/reduction/r1011.c   |  6 ++
 .../expected/typedef/reduction/r1011.choices  |  4 +
 .../typedef/reduction/{r110.c => r1100.c}     |  0
 .../reduction/{r110.choices => r1100.choices} |  1 +
 .../typedef/reduction/{r111.c => r1101.c}     |  0
 .../reduction/{r111.choices => r1101.choices} |  1 +
 .../test/expected/typedef/reduction/r1110.c   |  4 +
 .../expected/typedef/reduction/r1110.choices  |  4 +
 .../test/expected/typedef/reduction/r1111.c   |  3 +
 .../expected/typedef/reduction/r1111.choices  |  4 +
 .../while-loops/reduction/{r00.c => r000.c}   |  0
 .../reduction/{r00.choices => r000.choices}   |  1 +
 .../expected/while-loops/reduction/r001.c     |  7 ++
 .../while-loops/reduction/r001.choices        |  3 +
 .../test/expected/while-loops/reduction/r01.c |  3 -
 .../while-loops/reduction/r01.choices         |  4 +-
 .../expected/while-loops/reduction/r1.choices |  1 -
 .../expected/while-loops/reduction/r100.c     |  7 ++
 .../while-loops/reduction/r100.choices        |  3 +
 .../expected/while-loops/reduction/r101.c     |  6 ++
 .../while-loops/reduction/r101.choices        |  3 +
 .../test/expected/while-loops/reduction/r11.c |  3 +
 .../while-loops/reduction/r11.choices         |  2 +
 64 files changed, 253 insertions(+), 22 deletions(-)
 create mode 100644 rtree-c/test/cases/constant.c
 create mode 100644 rtree-c/test/expected/constant/main.c
 create mode 100644 rtree-c/test/expected/constant/reduction/r000.c
 create mode 100644 rtree-c/test/expected/constant/reduction/r000.choices
 create mode 100644 rtree-c/test/expected/constant/reduction/r001.c
 create mode 100644 rtree-c/test/expected/constant/reduction/r001.choices
 create mode 100644 rtree-c/test/expected/constant/reduction/r010.c
 create mode 100644 rtree-c/test/expected/constant/reduction/r010.choices
 rename rtree-c/test/expected/{while-loops/reduction/r1.c => constant/reduction/r011.c} (50%)
 create mode 100644 rtree-c/test/expected/constant/reduction/r011.choices
 create mode 100644 rtree-c/test/expected/constant/reduction/r100.c
 create mode 100644 rtree-c/test/expected/constant/reduction/r100.choices
 create mode 100644 rtree-c/test/expected/constant/reduction/r101.c
 create mode 100644 rtree-c/test/expected/constant/reduction/r101.choices
 create mode 100644 rtree-c/test/expected/constant/reduction/r110.c
 create mode 100644 rtree-c/test/expected/constant/reduction/r110.choices
 create mode 100644 rtree-c/test/expected/constant/reduction/r111.c
 create mode 100644 rtree-c/test/expected/constant/reduction/r111.choices
 rename rtree-c/test/expected/typedef/reduction/{r000.c => r0000.c} (100%)
 rename rtree-c/test/expected/typedef/reduction/{r000.choices => r0000.choices} (75%)
 rename rtree-c/test/expected/typedef/reduction/{r001.c => r0001.c} (100%)
 rename rtree-c/test/expected/typedef/reduction/{r001.choices => r0001.choices} (75%)
 create mode 100644 rtree-c/test/expected/typedef/reduction/r0010.c
 create mode 100644 rtree-c/test/expected/typedef/reduction/r0010.choices
 create mode 100644 rtree-c/test/expected/typedef/reduction/r0011.c
 create mode 100644 rtree-c/test/expected/typedef/reduction/r0011.choices
 rename rtree-c/test/expected/typedef/reduction/{r010.c => r0100.c} (100%)
 rename rtree-c/test/expected/typedef/reduction/{r010.choices => r0100.choices} (75%)
 rename rtree-c/test/expected/typedef/reduction/{r011.c => r0101.c} (100%)
 rename rtree-c/test/expected/typedef/reduction/{r011.choices => r0101.choices} (75%)
 create mode 100644 rtree-c/test/expected/typedef/reduction/r0110.c
 create mode 100644 rtree-c/test/expected/typedef/reduction/r0110.choices
 create mode 100644 rtree-c/test/expected/typedef/reduction/r0111.c
 create mode 100644 rtree-c/test/expected/typedef/reduction/r0111.choices
 rename rtree-c/test/expected/typedef/reduction/{r100.c => r1000.c} (100%)
 rename rtree-c/test/expected/typedef/reduction/{r100.choices => r1000.choices} (75%)
 rename rtree-c/test/expected/typedef/reduction/{r101.c => r1001.c} (100%)
 rename rtree-c/test/expected/typedef/reduction/{r101.choices => r1001.choices} (75%)
 create mode 100644 rtree-c/test/expected/typedef/reduction/r1010.c
 create mode 100644 rtree-c/test/expected/typedef/reduction/r1010.choices
 create mode 100644 rtree-c/test/expected/typedef/reduction/r1011.c
 create mode 100644 rtree-c/test/expected/typedef/reduction/r1011.choices
 rename rtree-c/test/expected/typedef/reduction/{r110.c => r1100.c} (100%)
 rename rtree-c/test/expected/typedef/reduction/{r110.choices => r1100.choices} (75%)
 rename rtree-c/test/expected/typedef/reduction/{r111.c => r1101.c} (100%)
 rename rtree-c/test/expected/typedef/reduction/{r111.choices => r1101.choices} (75%)
 create mode 100644 rtree-c/test/expected/typedef/reduction/r1110.c
 create mode 100644 rtree-c/test/expected/typedef/reduction/r1110.choices
 create mode 100644 rtree-c/test/expected/typedef/reduction/r1111.c
 create mode 100644 rtree-c/test/expected/typedef/reduction/r1111.choices
 rename rtree-c/test/expected/while-loops/reduction/{r00.c => r000.c} (100%)
 rename rtree-c/test/expected/while-loops/reduction/{r00.choices => r000.choices} (66%)
 create mode 100644 rtree-c/test/expected/while-loops/reduction/r001.c
 create mode 100644 rtree-c/test/expected/while-loops/reduction/r001.choices
 delete mode 100644 rtree-c/test/expected/while-loops/reduction/r1.choices
 create mode 100644 rtree-c/test/expected/while-loops/reduction/r100.c
 create mode 100644 rtree-c/test/expected/while-loops/reduction/r100.choices
 create mode 100644 rtree-c/test/expected/while-loops/reduction/r101.c
 create mode 100644 rtree-c/test/expected/while-loops/reduction/r101.choices
 create mode 100644 rtree-c/test/expected/while-loops/reduction/r11.c
 create mode 100644 rtree-c/test/expected/while-loops/reduction/r11.choices

diff --git a/rtree-c/src/ReduceC.hs b/rtree-c/src/ReduceC.hs
index 1190e21..b6c5c38 100644
--- a/rtree-c/src/ReduceC.hs
+++ b/rtree-c/src/ReduceC.hs
@@ -28,12 +28,14 @@ import qualified Language.C.Data.Ident as C
 data Context = Context
   { keywords :: !(Set.Set Keyword)
   , typeDefs :: !(Map.Map C.Ident [C.CDeclarationSpecifier C.NodeInfo])
+  , inlineExprs :: !(Map.Map C.Ident C.CExpr)
   }
 
 data Keyword
   = KeepMain
   | DoNoops
   | NoSemantics
+  | AllowEmptyDeclarations
   deriving (Show, Read, Enum, Eq, Ord)
 
 type CM m = (MonadReduce (String, C.Position) m, MonadReader Context m, MonadFail m)
@@ -49,11 +51,19 @@ addTypeDefs ids cs Context{..} =
     , ..
     }
 
+addInlineExpr :: C.Ident -> C.CExpr -> Context -> Context
+addInlineExpr i e Context{..} =
+  Context
+    { inlineExprs = Map.insert i e inlineExprs
+    , ..
+    }
+
 defaultContext :: Context
 defaultContext =
   Context
     { keywords = Set.fromList [KeepMain]
     , typeDefs = Map.empty
+    , inlineExprs = Map.empty
     }
 
 keyword :: (MonadReader Context m) => Keyword -> m Bool
@@ -87,9 +97,37 @@ instance CReducible C.CTranslUnit where
                 ("inline typedef " <> C.identToString ids, C.posOf r)
                 (local (addTypeDefs [ids] rst) cont)
                 ((r :) <$> local (addTypeDefs [ids] [C.CTypeSpec (C.CTypeDef ids n)]) cont)
+            -- A const
+            C.CDecl rec decl ni' -> do
+              (decl', cont') <- foldr reduceCDeclarationItem (pure ([], cont)) decl
+              allow <- keyword AllowEmptyDeclarations
+              case decl' of
+                []
+                  | allow ->
+                      split ("remove empty declaration", C.posOf r) cont' do
+                        (C.CDeclExt (C.CDecl rec decl' ni') :) <$> cont'
+                  | otherwise -> cont'
+                _ow -> (C.CDeclExt (C.CDecl rec decl' ni') :) <$> cont'
             a -> don'tHandle a
         _r -> don'tHandle r
 
+reduceCDeclarationItem
+  :: (CM m)
+  => C.CDeclarationItem C.NodeInfo
+  -> m ([C.CDeclarationItem C.NodeInfo], m a)
+  -> m ([C.CDeclarationItem C.NodeInfo], m a)
+reduceCDeclarationItem d ma = case d of
+  C.CDeclarationItem
+    (C.CDeclr (Just i) [] Nothing [] ni)
+    (Just (C.CInitExpr c _))
+    Nothing -> do
+      (ds, cont) <- ma
+      split
+        ("inline variable " <> C.identToString i, C.posOf ni)
+        (pure (ds, local (addInlineExpr i c) cont))
+        (pure (d : ds, local (addInlineExpr i (C.CVar i ni)) cont))
+  a -> don'tHandle a
+
 prettyIdent :: C.Identifier C.NodeInfo -> [Char]
 prettyIdent (C.Ident s _ a) = s ++ " at " ++ show (C.posOfNode a)
 
@@ -109,10 +147,18 @@ reduceCCompoundBlockItem r cont = case r of
     split ("remove statement", C.posOf r) cont do
       smt' <- reduceC smt
       (C.CBlockStmt smt' :) <$> cont
-  C.CBlockDecl decl -> do
-    case decl of
-      C.CDecl{} -> do
-        (r :) <$> cont
+  C.CBlockDecl declr -> do
+    case declr of
+      C.CDecl rec decl ni' -> do
+        (decl', cont') <- foldr reduceCDeclarationItem (pure ([], cont)) decl
+        allow <- keyword AllowEmptyDeclarations
+        case decl' of
+          []
+            | allow ->
+                split ("remove empty declaration", C.posOf r) cont' do
+                  (C.CBlockDecl (C.CDecl rec decl' ni') :) <$> cont'
+            | otherwise -> cont'
+          _ow -> (C.CBlockDecl (C.CDecl rec decl' ni') :) <$> cont'
       d -> don'tHandle d
   a -> don'tHandle a
 
@@ -142,15 +188,6 @@ instance CReducible (C.CStatement C.NodeInfo) where
           pure $ C.CReturn Nothing ni
     a -> don'tHandle a
 
-splitIf :: (MonadReduce l m) => Bool -> l -> m a -> m a -> m a
-splitIf True s a b = split s a b
-splitIf False _ _ b = b
-
-splitOn :: (MonadReduce l m, MonadReader Context m) => Keyword -> l -> m a -> m a -> m a
-splitOn k s a b = do
-  con <- keyword k
-  splitIf con s a b
-
 --     C.CCompound is cbi ni -> do
 --       cbi' <- collect (reduce @C.CCompoundBlockItem) cbi
 --       pure $ C.CCompound is cbi' ni
@@ -214,8 +251,10 @@ instance CReducible C.CExpr where
           elhs' <- reduceC elhs
           erhs' <- reduceC erhs
           pure $ C.CBinary o elhs' erhs' ni
-    C.CVar i ni -> do
-      pure $ C.CVar i ni
+    C.CVar i _ -> do
+      asks (Map.lookup i . inlineExprs) >>= \case
+        Just mx -> pure mx
+        Nothing -> fail ("Could not find " <> show i)
     C.CConst x -> do
       pure $ C.CConst x
     C.CUnary o elhs ni -> do
@@ -264,6 +303,15 @@ instance CReducible C.CExpr where
 --    where
 --     onBothExpr elhs erhs = onBoth (reduce elhs) (reduce erhs)
 
+splitIf :: (MonadReduce l m) => Bool -> l -> m a -> m a -> m a
+splitIf True s a b = split s a b
+splitIf False _ _ b = b
+
+splitOn :: (MonadReduce l m, MonadReader Context m) => Keyword -> l -> m a -> m a -> m a
+splitOn k s a b = do
+  con <- keyword k
+  splitIf con s a b
+
 inlineTypeDefs :: forall d m. (Data d, MonadFail m, MonadReader Context m) => d -> m d
 inlineTypeDefs r = do
   case eqT @d @[C.CDeclarationSpecifier C.NodeInfo] of
diff --git a/rtree-c/test/cases/constant.c b/rtree-c/test/cases/constant.c
new file mode 100644
index 0000000..1c591ba
--- /dev/null
+++ b/rtree-c/test/cases/constant.c
@@ -0,0 +1,6 @@
+int x = 10;
+
+int main () { 
+  int y = 25;
+  return x + y;
+}
diff --git a/rtree-c/test/expected/constant/main.c b/rtree-c/test/expected/constant/main.c
new file mode 100644
index 0000000..2d97bcf
--- /dev/null
+++ b/rtree-c/test/expected/constant/main.c
@@ -0,0 +1,6 @@
+int x = 10;
+int main()
+{
+    int y = 25;
+    return x + y;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r000.c b/rtree-c/test/expected/constant/reduction/r000.c
new file mode 100644
index 0000000..2d97bcf
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r000.c
@@ -0,0 +1,6 @@
+int x = 10;
+int main()
+{
+    int y = 25;
+    return x + y;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r000.choices b/rtree-c/test/expected/constant/reduction/r000.choices
new file mode 100644
index 0000000..805d1e4
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r000.choices
@@ -0,0 +1,3 @@
+0 remove statement at ("test/cases/constant.c": line 5)
+0 inline variable y at ("test/cases/constant.c": line 4)
+0 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r001.c b/rtree-c/test/expected/constant/reduction/r001.c
new file mode 100644
index 0000000..ce017c7
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r001.c
@@ -0,0 +1,5 @@
+int x = 10;
+int main()
+{
+    int y = 25;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r001.choices b/rtree-c/test/expected/constant/reduction/r001.choices
new file mode 100644
index 0000000..ac41d35
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r001.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/constant.c": line 5)
+0 inline variable y at ("test/cases/constant.c": line 4)
+0 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r010.c b/rtree-c/test/expected/constant/reduction/r010.c
new file mode 100644
index 0000000..c9d30b9
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r010.c
@@ -0,0 +1,5 @@
+int x = 10;
+int main()
+{
+    return x + 25;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r010.choices b/rtree-c/test/expected/constant/reduction/r010.choices
new file mode 100644
index 0000000..f19a549
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r010.choices
@@ -0,0 +1,3 @@
+0 remove statement at ("test/cases/constant.c": line 5)
+1 inline variable y at ("test/cases/constant.c": line 4)
+0 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/while-loops/reduction/r1.c b/rtree-c/test/expected/constant/reduction/r011.c
similarity index 50%
rename from rtree-c/test/expected/while-loops/reduction/r1.c
rename to rtree-c/test/expected/constant/reduction/r011.c
index 28c5719..78bfe21 100644
--- a/rtree-c/test/expected/while-loops/reduction/r1.c
+++ b/rtree-c/test/expected/constant/reduction/r011.c
@@ -1,4 +1,4 @@
+int x = 10;
 int main()
 {
-    int i = 0;
 }
diff --git a/rtree-c/test/expected/constant/reduction/r011.choices b/rtree-c/test/expected/constant/reduction/r011.choices
new file mode 100644
index 0000000..22358a3
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r011.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/constant.c": line 5)
+1 inline variable y at ("test/cases/constant.c": line 4)
+0 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r100.c b/rtree-c/test/expected/constant/reduction/r100.c
new file mode 100644
index 0000000..1c93710
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r100.c
@@ -0,0 +1,5 @@
+int main()
+{
+    int y = 25;
+    return 10 + y;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r100.choices b/rtree-c/test/expected/constant/reduction/r100.choices
new file mode 100644
index 0000000..2bc5629
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r100.choices
@@ -0,0 +1,3 @@
+0 remove statement at ("test/cases/constant.c": line 5)
+0 inline variable y at ("test/cases/constant.c": line 4)
+1 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r101.c b/rtree-c/test/expected/constant/reduction/r101.c
new file mode 100644
index 0000000..b673765
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r101.c
@@ -0,0 +1,4 @@
+int main()
+{
+    int y = 25;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r101.choices b/rtree-c/test/expected/constant/reduction/r101.choices
new file mode 100644
index 0000000..e49e1e4
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r101.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/constant.c": line 5)
+0 inline variable y at ("test/cases/constant.c": line 4)
+1 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r110.c b/rtree-c/test/expected/constant/reduction/r110.c
new file mode 100644
index 0000000..fd039c7
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r110.c
@@ -0,0 +1,4 @@
+int main()
+{
+    return 10 + 25;
+}
diff --git a/rtree-c/test/expected/constant/reduction/r110.choices b/rtree-c/test/expected/constant/reduction/r110.choices
new file mode 100644
index 0000000..f84f675
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r110.choices
@@ -0,0 +1,3 @@
+0 remove statement at ("test/cases/constant.c": line 5)
+1 inline variable y at ("test/cases/constant.c": line 4)
+1 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/constant/reduction/r111.c b/rtree-c/test/expected/constant/reduction/r111.c
new file mode 100644
index 0000000..5047a34
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r111.c
@@ -0,0 +1,3 @@
+int main()
+{
+}
diff --git a/rtree-c/test/expected/constant/reduction/r111.choices b/rtree-c/test/expected/constant/reduction/r111.choices
new file mode 100644
index 0000000..e0fb7c2
--- /dev/null
+++ b/rtree-c/test/expected/constant/reduction/r111.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/constant.c": line 5)
+1 inline variable y at ("test/cases/constant.c": line 4)
+1 inline variable x at ("test/cases/constant.c": line 1)
diff --git a/rtree-c/test/expected/typedef/reduction/r000.c b/rtree-c/test/expected/typedef/reduction/r0000.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r000.c
rename to rtree-c/test/expected/typedef/reduction/r0000.c
diff --git a/rtree-c/test/expected/typedef/reduction/r000.choices b/rtree-c/test/expected/typedef/reduction/r0000.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r000.choices
rename to rtree-c/test/expected/typedef/reduction/r0000.choices
index b281d1c..fa1b06c 100644
--- a/rtree-c/test/expected/typedef/reduction/r000.choices
+++ b/rtree-c/test/expected/typedef/reduction/r0000.choices
@@ -1,3 +1,4 @@
 0 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 0 remove function f at ("test/cases/typedef.c": line 4)
 0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r001.c b/rtree-c/test/expected/typedef/reduction/r0001.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r001.c
rename to rtree-c/test/expected/typedef/reduction/r0001.c
diff --git a/rtree-c/test/expected/typedef/reduction/r001.choices b/rtree-c/test/expected/typedef/reduction/r0001.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r001.choices
rename to rtree-c/test/expected/typedef/reduction/r0001.choices
index a44e5d5..9c6d7a2 100644
--- a/rtree-c/test/expected/typedef/reduction/r001.choices
+++ b/rtree-c/test/expected/typedef/reduction/r0001.choices
@@ -1,3 +1,4 @@
 1 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 0 remove function f at ("test/cases/typedef.c": line 4)
 0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r0010.c b/rtree-c/test/expected/typedef/reduction/r0010.c
new file mode 100644
index 0000000..d13fa76
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0010.c
@@ -0,0 +1,8 @@
+typedef int uint64;
+void f(uint64 a)
+{
+}
+int main()
+{
+    return 1;
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r0010.choices b/rtree-c/test/expected/typedef/reduction/r0010.choices
new file mode 100644
index 0000000..986dac1
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0010.choices
@@ -0,0 +1,4 @@
+0 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+0 remove function f at ("test/cases/typedef.c": line 4)
+0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r0011.c b/rtree-c/test/expected/typedef/reduction/r0011.c
new file mode 100644
index 0000000..1ce0a1b
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0011.c
@@ -0,0 +1,7 @@
+typedef int uint64;
+void f(uint64 a)
+{
+}
+int main()
+{
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r0011.choices b/rtree-c/test/expected/typedef/reduction/r0011.choices
new file mode 100644
index 0000000..81989ef
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0011.choices
@@ -0,0 +1,4 @@
+1 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+0 remove function f at ("test/cases/typedef.c": line 4)
+0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r010.c b/rtree-c/test/expected/typedef/reduction/r0100.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r010.c
rename to rtree-c/test/expected/typedef/reduction/r0100.c
diff --git a/rtree-c/test/expected/typedef/reduction/r010.choices b/rtree-c/test/expected/typedef/reduction/r0100.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r010.choices
rename to rtree-c/test/expected/typedef/reduction/r0100.choices
index dbaeb2c..145e4f8 100644
--- a/rtree-c/test/expected/typedef/reduction/r010.choices
+++ b/rtree-c/test/expected/typedef/reduction/r0100.choices
@@ -1,3 +1,4 @@
 0 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 1 remove function f at ("test/cases/typedef.c": line 4)
 0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r011.c b/rtree-c/test/expected/typedef/reduction/r0101.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r011.c
rename to rtree-c/test/expected/typedef/reduction/r0101.c
diff --git a/rtree-c/test/expected/typedef/reduction/r011.choices b/rtree-c/test/expected/typedef/reduction/r0101.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r011.choices
rename to rtree-c/test/expected/typedef/reduction/r0101.choices
index 92fc7ae..0bda8fb 100644
--- a/rtree-c/test/expected/typedef/reduction/r011.choices
+++ b/rtree-c/test/expected/typedef/reduction/r0101.choices
@@ -1,3 +1,4 @@
 1 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 1 remove function f at ("test/cases/typedef.c": line 4)
 0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r0110.c b/rtree-c/test/expected/typedef/reduction/r0110.c
new file mode 100644
index 0000000..239f38d
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0110.c
@@ -0,0 +1,5 @@
+typedef int uint64;
+int main()
+{
+    return 1;
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r0110.choices b/rtree-c/test/expected/typedef/reduction/r0110.choices
new file mode 100644
index 0000000..8f09241
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0110.choices
@@ -0,0 +1,4 @@
+0 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+1 remove function f at ("test/cases/typedef.c": line 4)
+0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r0111.c b/rtree-c/test/expected/typedef/reduction/r0111.c
new file mode 100644
index 0000000..17825b9
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0111.c
@@ -0,0 +1,4 @@
+typedef int uint64;
+int main()
+{
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r0111.choices b/rtree-c/test/expected/typedef/reduction/r0111.choices
new file mode 100644
index 0000000..291f387
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r0111.choices
@@ -0,0 +1,4 @@
+1 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+1 remove function f at ("test/cases/typedef.c": line 4)
+0 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r100.c b/rtree-c/test/expected/typedef/reduction/r1000.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r100.c
rename to rtree-c/test/expected/typedef/reduction/r1000.c
diff --git a/rtree-c/test/expected/typedef/reduction/r100.choices b/rtree-c/test/expected/typedef/reduction/r1000.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r100.choices
rename to rtree-c/test/expected/typedef/reduction/r1000.choices
index 48c32e1..a7a7a50 100644
--- a/rtree-c/test/expected/typedef/reduction/r100.choices
+++ b/rtree-c/test/expected/typedef/reduction/r1000.choices
@@ -1,3 +1,4 @@
 0 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 0 remove function f at ("test/cases/typedef.c": line 4)
 1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r101.c b/rtree-c/test/expected/typedef/reduction/r1001.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r101.c
rename to rtree-c/test/expected/typedef/reduction/r1001.c
diff --git a/rtree-c/test/expected/typedef/reduction/r101.choices b/rtree-c/test/expected/typedef/reduction/r1001.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r101.choices
rename to rtree-c/test/expected/typedef/reduction/r1001.choices
index 76ba083..d8280cc 100644
--- a/rtree-c/test/expected/typedef/reduction/r101.choices
+++ b/rtree-c/test/expected/typedef/reduction/r1001.choices
@@ -1,3 +1,4 @@
 1 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 0 remove function f at ("test/cases/typedef.c": line 4)
 1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r1010.c b/rtree-c/test/expected/typedef/reduction/r1010.c
new file mode 100644
index 0000000..e11fc7d
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1010.c
@@ -0,0 +1,7 @@
+void f(int a)
+{
+}
+int main()
+{
+    return 1;
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r1010.choices b/rtree-c/test/expected/typedef/reduction/r1010.choices
new file mode 100644
index 0000000..4b158a3
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1010.choices
@@ -0,0 +1,4 @@
+0 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+0 remove function f at ("test/cases/typedef.c": line 4)
+1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r1011.c b/rtree-c/test/expected/typedef/reduction/r1011.c
new file mode 100644
index 0000000..3fa6be1
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1011.c
@@ -0,0 +1,6 @@
+void f(int a)
+{
+}
+int main()
+{
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r1011.choices b/rtree-c/test/expected/typedef/reduction/r1011.choices
new file mode 100644
index 0000000..76cb6f2
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1011.choices
@@ -0,0 +1,4 @@
+1 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+0 remove function f at ("test/cases/typedef.c": line 4)
+1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r110.c b/rtree-c/test/expected/typedef/reduction/r1100.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r110.c
rename to rtree-c/test/expected/typedef/reduction/r1100.c
diff --git a/rtree-c/test/expected/typedef/reduction/r110.choices b/rtree-c/test/expected/typedef/reduction/r1100.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r110.choices
rename to rtree-c/test/expected/typedef/reduction/r1100.choices
index e70ee97..9ee0fbd 100644
--- a/rtree-c/test/expected/typedef/reduction/r110.choices
+++ b/rtree-c/test/expected/typedef/reduction/r1100.choices
@@ -1,3 +1,4 @@
 0 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 1 remove function f at ("test/cases/typedef.c": line 4)
 1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r111.c b/rtree-c/test/expected/typedef/reduction/r1101.c
similarity index 100%
rename from rtree-c/test/expected/typedef/reduction/r111.c
rename to rtree-c/test/expected/typedef/reduction/r1101.c
diff --git a/rtree-c/test/expected/typedef/reduction/r111.choices b/rtree-c/test/expected/typedef/reduction/r1101.choices
similarity index 75%
rename from rtree-c/test/expected/typedef/reduction/r111.choices
rename to rtree-c/test/expected/typedef/reduction/r1101.choices
index bceac89..1e5ebac 100644
--- a/rtree-c/test/expected/typedef/reduction/r111.choices
+++ b/rtree-c/test/expected/typedef/reduction/r1101.choices
@@ -1,3 +1,4 @@
 1 remove statement at ("test/cases/typedef.c": line 9)
+0 inline variable x at ("test/cases/typedef.c": line 8)
 1 remove function f at ("test/cases/typedef.c": line 4)
 1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r1110.c b/rtree-c/test/expected/typedef/reduction/r1110.c
new file mode 100644
index 0000000..2227c3a
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1110.c
@@ -0,0 +1,4 @@
+int main()
+{
+    return 1;
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r1110.choices b/rtree-c/test/expected/typedef/reduction/r1110.choices
new file mode 100644
index 0000000..2b83126
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1110.choices
@@ -0,0 +1,4 @@
+0 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+1 remove function f at ("test/cases/typedef.c": line 4)
+1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/typedef/reduction/r1111.c b/rtree-c/test/expected/typedef/reduction/r1111.c
new file mode 100644
index 0000000..5047a34
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1111.c
@@ -0,0 +1,3 @@
+int main()
+{
+}
diff --git a/rtree-c/test/expected/typedef/reduction/r1111.choices b/rtree-c/test/expected/typedef/reduction/r1111.choices
new file mode 100644
index 0000000..6c02b12
--- /dev/null
+++ b/rtree-c/test/expected/typedef/reduction/r1111.choices
@@ -0,0 +1,4 @@
+1 remove statement at ("test/cases/typedef.c": line 9)
+1 inline variable x at ("test/cases/typedef.c": line 8)
+1 remove function f at ("test/cases/typedef.c": line 4)
+1 inline typedef uint64 at ("test/cases/typedef.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r00.c b/rtree-c/test/expected/while-loops/reduction/r000.c
similarity index 100%
rename from rtree-c/test/expected/while-loops/reduction/r00.c
rename to rtree-c/test/expected/while-loops/reduction/r000.c
diff --git a/rtree-c/test/expected/while-loops/reduction/r00.choices b/rtree-c/test/expected/while-loops/reduction/r000.choices
similarity index 66%
rename from rtree-c/test/expected/while-loops/reduction/r00.choices
rename to rtree-c/test/expected/while-loops/reduction/r000.choices
index 4fee46c..7712d43 100644
--- a/rtree-c/test/expected/while-loops/reduction/r00.choices
+++ b/rtree-c/test/expected/while-loops/reduction/r000.choices
@@ -1,2 +1,3 @@
 0 remove statement at ("test/cases/while-loops.c": line 4)
 0 remove statement at ("test/cases/while-loops.c": line 3)
+0 inline variable i at ("test/cases/while-loops.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r001.c b/rtree-c/test/expected/while-loops/reduction/r001.c
new file mode 100644
index 0000000..714143b
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r001.c
@@ -0,0 +1,7 @@
+int main()
+{
+    int i = 0;
+    while (i < 10)
+    {
+    }
+}
diff --git a/rtree-c/test/expected/while-loops/reduction/r001.choices b/rtree-c/test/expected/while-loops/reduction/r001.choices
new file mode 100644
index 0000000..f04eb97
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r001.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/while-loops.c": line 4)
+0 remove statement at ("test/cases/while-loops.c": line 3)
+0 inline variable i at ("test/cases/while-loops.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r01.c b/rtree-c/test/expected/while-loops/reduction/r01.c
index 714143b..28c5719 100644
--- a/rtree-c/test/expected/while-loops/reduction/r01.c
+++ b/rtree-c/test/expected/while-loops/reduction/r01.c
@@ -1,7 +1,4 @@
 int main()
 {
     int i = 0;
-    while (i < 10)
-    {
-    }
 }
diff --git a/rtree-c/test/expected/while-loops/reduction/r01.choices b/rtree-c/test/expected/while-loops/reduction/r01.choices
index 69ec6af..a891b77 100644
--- a/rtree-c/test/expected/while-loops/reduction/r01.choices
+++ b/rtree-c/test/expected/while-loops/reduction/r01.choices
@@ -1,2 +1,2 @@
-1 remove statement at ("test/cases/while-loops.c": line 4)
-0 remove statement at ("test/cases/while-loops.c": line 3)
+1 remove statement at ("test/cases/while-loops.c": line 3)
+0 inline variable i at ("test/cases/while-loops.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r1.choices b/rtree-c/test/expected/while-loops/reduction/r1.choices
deleted file mode 100644
index efbb594..0000000
--- a/rtree-c/test/expected/while-loops/reduction/r1.choices
+++ /dev/null
@@ -1 +0,0 @@
-1 remove statement at ("test/cases/while-loops.c": line 3)
diff --git a/rtree-c/test/expected/while-loops/reduction/r100.c b/rtree-c/test/expected/while-loops/reduction/r100.c
new file mode 100644
index 0000000..45b4b7d
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r100.c
@@ -0,0 +1,7 @@
+int main()
+{
+    while (0 < 10)
+    {
+        0++;
+    }
+}
diff --git a/rtree-c/test/expected/while-loops/reduction/r100.choices b/rtree-c/test/expected/while-loops/reduction/r100.choices
new file mode 100644
index 0000000..cdd24cf
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r100.choices
@@ -0,0 +1,3 @@
+0 remove statement at ("test/cases/while-loops.c": line 4)
+0 remove statement at ("test/cases/while-loops.c": line 3)
+1 inline variable i at ("test/cases/while-loops.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r101.c b/rtree-c/test/expected/while-loops/reduction/r101.c
new file mode 100644
index 0000000..db783f8
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r101.c
@@ -0,0 +1,6 @@
+int main()
+{
+    while (0 < 10)
+    {
+    }
+}
diff --git a/rtree-c/test/expected/while-loops/reduction/r101.choices b/rtree-c/test/expected/while-loops/reduction/r101.choices
new file mode 100644
index 0000000..c054f9b
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r101.choices
@@ -0,0 +1,3 @@
+1 remove statement at ("test/cases/while-loops.c": line 4)
+0 remove statement at ("test/cases/while-loops.c": line 3)
+1 inline variable i at ("test/cases/while-loops.c": line 2)
diff --git a/rtree-c/test/expected/while-loops/reduction/r11.c b/rtree-c/test/expected/while-loops/reduction/r11.c
new file mode 100644
index 0000000..5047a34
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r11.c
@@ -0,0 +1,3 @@
+int main()
+{
+}
diff --git a/rtree-c/test/expected/while-loops/reduction/r11.choices b/rtree-c/test/expected/while-loops/reduction/r11.choices
new file mode 100644
index 0000000..7ad5e3f
--- /dev/null
+++ b/rtree-c/test/expected/while-loops/reduction/r11.choices
@@ -0,0 +1,2 @@
+1 remove statement at ("test/cases/while-loops.c": line 3)
+1 inline variable i at ("test/cases/while-loops.c": line 2)
-- 
GitLab