diff --git a/juno_samples/cava/src/cava.jn b/juno_samples/cava/src/cava.jn
index bb8afded47a255da9a2c5cdb33482b819d374e89..a06c8d7b03ca2cb962bb7c5c31e87cd3b3a7e502 100644
--- a/juno_samples/cava/src/cava.jn
+++ b/juno_samples/cava/src/cava.jn
@@ -207,8 +207,8 @@ fn cava<r, c, num_ctrl_pts : usize>(
   coefs : f32[4, CHAN],
   tonemap : f32[256, CHAN],
 ) -> u8[CHAN, r, c] {
-  let scaled = scale::<r, c>(input);
-  let demosc = demosaic::<r, c>(scaled);
+  @fuse1 let scaled = scale::<r, c>(input);
+  @fuse1 let demosc = demosaic::<r, c>(scaled);
   let denosd = denoise::<r, c>(demosc);
   let transf = transform::<r, c>(denosd, TsTw);
   let gamutd = gamut::<r, c, num_ctrl_pts>(transf, ctrl_pts, weights, coefs);
diff --git a/juno_samples/cava/src/cpu.sch b/juno_samples/cava/src/cpu.sch
index 0913d4b3738a91a659702a767fb4e429dc94afa3..f090eab35861e1a3977744a7dad8754e1ba9714e 100644
--- a/juno_samples/cava/src/cpu.sch
+++ b/juno_samples/cava/src/cpu.sch
@@ -1,5 +1,6 @@
 macro simpl!(X) {
   ccp(X);
+  simplify-cfg(X);
   gvn(X);
   phi-elim(X);
   dce(X);
@@ -8,33 +9,27 @@ macro simpl!(X) {
 
 simpl!(*);
 
+let fuse1 = outline(cava@fuse1);
+inline(fuse1);
+
 inline(denoise);
-cpu(scale, demosaic, denoise, transform, gamut, tone_map, descale);
+cpu(denoise, transform, gamut, tone_map, descale);
 
 ip-sroa(*);
 sroa(*);
 simpl!(*);
 
-no-memset(scale@const);
+no-memset(fuse1@const);
 fixpoint {
-  forkify(scale);
-  fork-guard-elim(scale);
-  fork-coalesce(scale);
+  forkify(fuse1);
+  fork-guard-elim(fuse1);
+  fork-coalesce(fuse1);
 }
-simpl!(*);
-fork-dim-merge(scale);
-simpl!(*);
-fork-tile[2048, 0, false](scale);
-simpl!(*);
-let out = fork-split(scale);
-simpl!(*);
-let out = outline(out._0_scale.fj1);
-ip-sroa(*);
-sroa(*);
-simpl!(*);
-host(scale);
-unforkify(out);
-xdot[true](scale, out);
+simpl!(fuse1);
+array-slf(fuse1);
+simpl!(fuse1);
+xdot[true](fuse1);
+unforkify(fuse1);
 
 gcm(*);
 fixpoint {