         StatusWord      &status,
         T               &value)
     {
-        TileDescriptor tile_descriptor;
-        do {
-
-            TxnWord alias   = ThreadLoad<LOAD_CG>(reinterpret_cast<TxnWord*>(d_tile_status + TILE_STATUS_PADDING + tile_idx));
+        TxnWord         alias           = ThreadLoad<LOAD_CG>(reinterpret_cast<TxnWord*>(d_tile_status + TILE_STATUS_PADDING + tile_idx));
+        TileDescriptor  tile_descriptor = reinterpret_cast<TileDescriptor&>(alias);
+
+        while (tile_descriptor.status == SCAN_TILE_INVALID)
+        {
+            __threadfence_block(); // prevent hoisting loads from loop
+
+            alias           = ThreadLoad<LOAD_CG>(reinterpret_cast<TxnWord*>(d_tile_status + TILE_STATUS_PADDING + tile_idx));
             tile_descriptor = reinterpret_cast<TileDescriptor&>(alias);
-
-        } while (tile_descriptor.status == SCAN_TILE_INVALID);
+        }
 
         status = tile_descriptor.status;
         value = tile_descriptor.value;

        StatusWord              &status,
        KeyValuePairT           &value)
    {
        TileDescriptor tile_descriptor;
        do {

            TxnWord alias   = ThreadLoad<LOAD_CG>(reinterpret_cast<TxnWord*>(d_tile_status + TILE_STATUS_PADDING + tile_idx));
            tile_descriptor = reinterpret_cast<TileDescriptor&>(alias);

        } while (tile_descriptor.status == SCAN_TILE_INVALID);

        status      = tile_descriptor.status;
        value.value = tile_descriptor.value;

    {
        do {
            status = ThreadLoad<LOAD_CG>(d_tile_status + TILE_STATUS_PADDING + tile_idx);

            __threadfence();    // prevent hoisting loads from loop or loads below above this one

        } while (status == SCAN_TILE_INVALID);

        if (status == StatusWord(SCAN_TILE_PARTIAL)) 
            value = ThreadLoad<LOAD_CG>(d_tile_partial + TILE_STATUS_PADDING + tile_idx);
