diff --git a/hercules_cg/src/rt.rs b/hercules_cg/src/rt.rs
index 884129c712863a49d535d23f46893d8ed246c56b..ddfa9503765924cd972a2fc85be737fe9932da97 100644
--- a/hercules_cg/src/rt.rs
+++ b/hercules_cg/src/rt.rs
@@ -529,7 +529,7 @@ impl<'a> RTContext<'a> {
                 write!(block, "{} = ", self.get_value(id, bb, true))?;
                 let mut size_and_device = None;
                 match self.module.constants[cons_id.idx()] {
-                    Constant::Boolean(val) => write!(block, "{}bool", val)?,
+                    Constant::Boolean(val) => write!(block, "{}", val)?,
                     Constant::Integer8(val) => write!(block, "{}i8", val)?,
                     Constant::Integer16(val) => write!(block, "{}i16", val)?,
                     Constant::Integer32(val) => write!(block, "{}i32", val)?,
diff --git a/juno_samples/edge_detection/src/cpu.sch b/juno_samples/edge_detection/src/cpu.sch
index 8f715c39807dabc05f4ff9c54a894136a4cc9e95..a1974d0592f44938dc7d7d98305c57ecdeb48577 100644
--- a/juno_samples/edge_detection/src/cpu.sch
+++ b/juno_samples/edge_detection/src/cpu.sch
@@ -40,6 +40,14 @@ fixpoint {
   fork-coalesce(laplacian_estimate);
 }
 simpl!(laplacian_estimate);
+let par = laplacian_estimate@image_loop \ laplacian_estimate@filter_loop;
+fork-tile[4, 1, false, false](par);
+fork-tile[4, 0, false, false](par);
+fork-interchange[1, 2](par);
+let split = fork-split(par);
+let laplacian_estimate_body = outline(split._1_laplacian_estimate.fj2);
+fork-coalesce(laplacian_estimate, laplacian_estimate_body);
+simpl!(laplacian_estimate, laplacian_estimate_body);
 
 no-memset(zero_crossings@res, zero_crossings@shr1, zero_crossings@shr2);
 fixpoint {
@@ -48,6 +56,14 @@ fixpoint {
   fork-coalesce(zero_crossings);
 }
 simpl!(zero_crossings);
+let par = zero_crossings@image_loop \ zero_crossings@filter_loop;
+fork-tile[4, 1, false, false](par);
+fork-tile[4, 0, false, false](par);
+fork-interchange[1, 2](par);
+let split = fork-split(par);
+let zero_crossings_body = outline(split._2_zero_crossings.fj2);
+fork-coalesce(zero_crossings, zero_crossings_body);
+simpl!(zero_crossings, zero_crossings_body);
 
 no-memset(gradient@res);
 fixpoint {
@@ -89,8 +105,8 @@ simpl!(reject_zero_crossings);
 
 async-call(edge_detection@le, edge_detection@zc);
 
-fork-split(gaussian_smoothing_body, laplacian_estimate, zero_crossings, gradient, reject_zero_crossings);
-unforkify(gaussian_smoothing_body, laplacian_estimate, zero_crossings, gradient, reject_zero_crossings);
+fork-split(gaussian_smoothing_body, laplacian_estimate, laplacian_estimate_body, zero_crossings, zero_crossings_body, gradient, reject_zero_crossings);
+unforkify(gaussian_smoothing_body, laplacian_estimate, laplacian_estimate_body, zero_crossings, zero_crossings_body, gradient, reject_zero_crossings);
 
 simpl!(*);
 
diff --git a/juno_samples/edge_detection/src/edge_detection.jn b/juno_samples/edge_detection/src/edge_detection.jn
index 0b8e71da5b079a0828120dd347af20564271d39c..58f364dc1cea77b27c83ba2340bfbd11fde07f31 100644
--- a/juno_samples/edge_detection/src/edge_detection.jn
+++ b/juno_samples/edge_detection/src/edge_detection.jn
@@ -47,11 +47,11 @@ fn laplacian_estimate<n, m, sz: usize>(
       @shr1 let imageArea : f32[sz, sz];
       @filter_loop for i = 0 to sz {
         for j = 0 to sz {
-          imageArea[i, j] = if row + i < r              then MIN_BR
-                            else if row + i - r > n - 1 then MIN_BR
-                            else if col + j < r         then MIN_BR
-                            else if col + j - r > m - 1 then MIN_BR
-                                 else input[row + i - r, col + j - r];
+          imageArea[i, j] = if row + i < r
+	                       || row + i - r > n - 1
+			       || col + j < r
+			       || col + j - r > m - 1 then MIN_BR
+			    else input[row + i - r, col + j - r];
         }
       }
 
@@ -67,11 +67,11 @@ fn laplacian_estimate<n, m, sz: usize>(
       @shr2 let imageArea : f32[sz, sz];
       @filter_loop for i = 0 to sz {
         for j = 0 to sz {
-          imageArea[i, j] = if row + i < r              then MAX_BR
-                            else if row + i - r > n - 1 then MAX_BR
-                            else if col + j < r         then MAX_BR
-                            else if col + j - r > m - 1 then MAX_BR
-                                 else input[row + i - r, col + j - r];
+          imageArea[i, j] = if row + i < r
+	                       || row + i - r > n - 1
+			       || col + j < r
+			       || col + j - r > m - 1 then MAX_BR
+			    else input[row + i - r, col + j - r];
         }
       }
 
@@ -105,12 +105,11 @@ fn zero_crossings<n, m, sz: usize>(
       @shr1 let imageArea : f32[sz, sz];
       @filter_loop for i = 0 to sz {
         for j = 0 to sz {
-          imageArea[i, j] = if row + i < r              then MIN_BR
-                            else if row + i - r > n - 1 then MIN_BR
-                            else if col + j < r         then MIN_BR
-                            else if col + j - r > m - 1 then MIN_BR
-                            else if input[row + i - r, col + j - r] > MIN_BR
-                            then MAX_BR
+          imageArea[i, j] = if row + i < r
+                               || row + i - r > n - 1
+                               || col + j < r
+                               || col + j - r > m - 1 then MIN_BR
+                            else if input[row + i - r, col + j - r] > MIN_BR then MAX_BR
                             else MIN_BR;
         }
       }
@@ -127,12 +126,11 @@ fn zero_crossings<n, m, sz: usize>(
       @shr2 let imageArea : f32[sz, sz];
       @filter_loop for i = 0 to sz {
         for j = 0 to sz {
-          imageArea[i, j] = if row + i < r              then MAX_BR
-                            else if row + i - r > n - 1 then MAX_BR
-                            else if col + j < r         then MAX_BR
-                            else if col + j - r > m - 1 then MAX_BR
-                            else if input[row + i - r, col + j - r] > MIN_BR
-                            then MAX_BR
+          imageArea[i, j] = if row + i < r
+                               || row + i - r > n - 1
+                               || col + j < r
+                               || col + j - r > m - 1 then MAX_BR
+                            else if input[row + i - r, col + j - r] > MIN_BR then MAX_BR
                             else MIN_BR;
         }
       }
diff --git a/juno_samples/edge_detection/src/lib.rs b/juno_samples/edge_detection/src/lib.rs
index dab84cf6206c3cb9b816c88c53c8ddfbec102994..aa44e2e7e7215ee21560fefefc8c748610e183ce 100644
--- a/juno_samples/edge_detection/src/lib.rs
+++ b/juno_samples/edge_detection/src/lib.rs
@@ -234,7 +234,14 @@ pub fn edge_detection_harness(args: EdgeDetectionInputs) {
                 theta,
             );
 
-            assert_eq!(result, rust_result);
+            let mut all = true;
+            for idx in 0..rust_result.len() {
+                if result[idx] != rust_result[idx] {
+                    all = false;
+                    println!("Found mismatch in images at {}.", idx);
+                }
+            }
+            assert!(all);
             println!("Frames {} match", i);
 
             if display_verify {