                     // Save off the first partial product that this thread block will scatter
                     if (segment_idx == first_segment_idx)
                     {
-                        temp_storage.first_partial = partial;
+                        temp_storage.first_partial.partial = partial;
                     }
                 }
             }
 
-            // Barrier for smem reuse and coherence
+            // Barrier for smem reuse
             __syncthreads();
 
             block_diagonal += TILE_ITEMS;

        SizeT next_block_segment_idx,
        SizeT next_block_value_idx)
    {
        if (threadIdx.x == 0)
        {
            temp_storage.first_partial = identity;
        }

        SizeT first_segment_idx = block_segment_idx;

        // Have the thread block iterate over the region
        while (block_diagonal < next_block_diagonal)

                    tail_flags[ITEM] = 1;
                    thread_segment_idx++;

                    if ((valid_segment = (thread_segment_idx < next_thread_segment_idx)))
                        segment_end_offset = d_segment_end_offsets[thread_segment_idx];
                }
                else if (valid_value && !prefer_segment)
                {
