     /// Shared memory type required by this thread block
     struct _TempStorage
     {
+        // Starting and ending global merge path coordinates for the tile
+        CoordinateT tile_coordinates[2];
+
         // Tile of merge items
         union MergeItem
         {
             OffsetT    row_end_offset;
             ValueT     nonzero;
 
-        } merge_items[TILE_ITEMS + 1];
-
-        // Starting and ending global merge path coordinates for the tile
-        CoordinateT tile_coordinates[2];
+        } merge_items[TILE_ITEMS + ITEMS_PER_THREAD];
+
 
         typename BlockScanT::TempStorage scan;
     };

            }
        }

        // Reduce value by key
        ItemOffsetPair<ValueT, OffsetT> block_aggregate;
        ItemOffsetPair<ValueT, OffsetT> identity;
        identity.offset     = -1;
        identity.value      = ValueT(0.0);

        ItemOffsetPair<ValueT, OffsetT> scanned_items[ITEMS_PER_THREAD];
        BlockScanT(temp_storage.scan).ExclusiveScan(merged_items, scanned_items, identity, ReduceByKeyOp(), block_aggregate);

        // Compact row partial sums to smem
        #pragma unroll
        for (int ITEM = 0; ITEM < ITEMS_PER_THREAD; ++ITEM)
        {
            if (merged_items[ITEM].offset >= 0)
            {
                tile_partial_sums[merged_items[ITEM].offset] = scanned_items[ITEM].value;
            }
        }

        __syncthreads();


            tile_num_nonzeros,
            thread_coordinate);

        OffsetT starting_row = thread_coordinate.x;

        __syncthreads();


        // Run merge and reduce value by key
        ItemOffsetPair<ValueT, OffsetT> merged_items[ITEMS_PER_THREAD];
