Ok, you removed ignore_address_wrap_around, so we're almost there.

On 07/28/2011 07:59 PM, H.J. Lu wrote:
@@ -712,7 +715,16 @@ convert_modes (enum machine_mode mode, enum machine_mode 
oldmode, rtx x, int uns
    if (GET_CODE (x) == SUBREG&&  SUBREG_PROMOTED_VAR_P (x)
        &&  GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))>= GET_MODE_SIZE (mode)
        &&  SUBREG_PROMOTED_UNSIGNED_P (x) == unsignedp)
-    x = gen_lowpart (mode, x);
+    {
+      temp = rtl_hooks.gen_lowpart_no_emit (mode, x);
+      if (temp)
+       x = temp;
+      else
+       {
+         gcc_assert (!no_emit);
+         x = gen_lowpart (mode, x);
+       }
+    }

+    {
+       /* gen_lowpart_no_emit should always succeed here.  */
+       x = rtl_hooks.gen_lowpart_no_emit (mode, x);
+    }


    if (GET_MODE (x) != VOIDmode)
      oldmode = GET_MODE (x);
@@ -776,6 +788,10 @@ convert_modes (enum machine_mode mode, enum machine_mode 
oldmode, rtx x, int uns
          return gen_int_mode (val, mode);
        }

+      temp = rtl_hooks.gen_lowpart_no_emit (mode, x);
+      if (temp)
+       return temp;
+      gcc_assert (!no_emit);
        return gen_lowpart (mode, x);

Right now, gen_lowpart_no_emit will never return NULL, so these tests in convert_modes are dead. Instead, please include in your patch mine at http://permalink.gmane.org/gmane.comp.gcc.patches/242085 and adjust as follows.

+      temp = rtl_hooks.gen_lowpart_no_emit (mode, x);
+      if (no_emit)
+        return rtl_hooks.gen_lowpart_no_emit (mode, x);
+      else
+        return gen_lowpart (mode, x);

      }

If it does not work, PLEASE say why instead of posting another "updated patch".

Paolo

Reply via email to