         OffsetT         num_tile_segments_prefix,
         OffsetT         num_segments)
     {
-        // Scatter first key of first tile (we unflagged it after scan)
-        if (IS_FIRST_TILE && (threadIdx.x == 0))
-        {
-            d_unique_out[0] = keys[0];
-        }
-
         // Do a one-phase scatter if (a) two-phase is disabled or (b) the average number of selected items per thread is less than one
         if (TWO_PHASE_SCATTER && (num_tile_segments > BLOCK_THREADS))
         {

        {
            if (segment_flags[ITEM])
            {
                OffsetT scatter_offset = segment_indices[ITEM] - num_tile_segments_prefix - ((IS_FIRST_TILE ? 1 : 0));
                temp_storage.raw_exchange_values.Alias()[scatter_offset] = values[ITEM];
            }
        }

        __syncthreads();

        for (int item = threadIdx.x; item < num_tile_segments + ((IS_LAST_TILE ? 1 : 0)); item += BLOCK_THREADS)
        {
            OffsetT scatter_offset = num_tile_segments_prefix + item - ((IS_FIRST_TILE ? 0 : 1));
            d_aggregates_out[scatter_offset] = temp_storage.raw_exchange_values.Alias()[item];
        }
    }



        __syncthreads();

        for (int item = threadIdx.x; item < num_tile_segments; item += BLOCK_THREADS)
        {
            d_unique_out[num_tile_segments_prefix + item] = temp_storage.raw_exchange_keys.Alias()[item];
        }
