aboutsummaryrefslogtreecommitdiff
path: root/src/Analysis
diff options
context:
space:
mode:
authorTom Smeding <tom@tomsmeding.com>2025-10-28 11:56:40 +0100
committerTom Smeding <tom@tomsmeding.com>2025-10-28 11:56:40 +0100
commit955af83f664639701fdbee54718186e07b31d42f (patch)
tree30353d77c69b1dfdaf43797942dbf6e412a49450 /src/Analysis
parent765b80616583322226284266605ab3a916da01db (diff)
Better fold D{1,2} primitives
Diffstat (limited to 'src/Analysis')
-rw-r--r--src/Analysis/Identity.hs27
1 files changed, 14 insertions, 13 deletions
diff --git a/src/Analysis/Identity.hs b/src/Analysis/Identity.hs
index 2fa156d..9dc8811 100644
--- a/src/Analysis/Identity.hs
+++ b/src/Analysis/Identity.hs
@@ -255,20 +255,21 @@ idana env expr = case expr of
res <- VIPair <$> (VIArr <$> genId <*> pure sh) <*> (VIArr <$> genId <*> pure sh')
pure (res, EFold1InnerD1 res cm e1' e2' e3')
- EFold1InnerD2 _ cm t2 ef ep ezi ebog ed -> do
- let STArr _ (STPair t1 ttape) = typeOf ebog
- x1 <- genIds (fromSMTy t2)
- x2 <- genIds t1
- x3 <- genIds t1
- x4 <- genIds ttape
- (_, e1') <- idana (x1 `SCons` x2 `SCons` x3 `SCons` x4 `SCons` env) ef
- (v2, e2') <- idana env ep
- (_, e3') <- idana env ezi
- (_, e4') <- idana env ebog
+ EFold1InnerD2 _ cm ef ez eplus ebog ed -> do
+ let STArr _ tB = typeOf ebog
+ t2 = typeOf ez
+ xf1 <- genIds t2
+ xf2 <- genIds tB
+ (_, e1') <- idana (xf1 `SCons` xf2 `SCons` env) ef
+ (_, e2') <- idana env ez
+ xp1 <- genIds t2
+ xp2 <- genIds t2
+ (_, e3') <- idana (xp1 `SCons` xp2 `SCons` env) eplus
+ (v4, e4') <- idana env ebog
(_, e5') <- idana env ed
- let VIArr _ sh = v2
- res <- VIPair <$> genIds (fromSMTy t2) <*> (VIArr <$> genId <*> pure sh)
- pure (res, EFold1InnerD2 res cm t2 e1' e2' e3' e4' e5')
+ let VIArr _ sh = v4
+ res <- VIPair <$> genIds t2 <*> (VIArr <$> genId <*> pure sh)
+ pure (res, EFold1InnerD2 res cm e1' e2' e3' e4' e5')
EConst _ t val -> do
res <- VIScal <$> genId