------- Comment #5 from roger at eyesopen dot com 2006-01-25 01:05 ------- I'm testing the following patch...
Index: combine.c =================================================================== *** combine.c (revision 109912) --- combine.c (working copy) *************** try_combine (rtx i3, rtx i2, rtx i1, int *** 1967,1972 **** --- 1967,1983 ---- if (BITS_BIG_ENDIAN) offset = GET_MODE_BITSIZE (GET_MODE (XEXP (dest, 0))) - width - offset; + + /* If this is the low part, we're done. */ + if (subreg_lowpart_p (XEXP (dest, 0))) + ; + /* Handle the case where inner is twice the size of outer. */ + else if (GET_MODE_BITSIZE (GET_MODE (SET_DEST (temp))) + == 2 * GET_MODE_BITSIZE (GET_MODE (XEXP (dest, 0)))) + offset += GET_MODE_BITSIZE (GET_MODE (XEXP (dest, 0))); + /* Otherwise give up for now. */ + else + offset = -1; } } else if (subreg_lowpart_p (dest)) My apologies for any inconvenience. -- roger at eyesopen dot com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |roger at eyesopen dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25703