LOAD_EXTEND_OP is about extending a subword value to a word. The final wide_int should therefore be word_mode rather than GET_MODE (src).
Tested on powerpc64-linux-gnu and by rerunning the assembly comparison. OK to install? Thanks, Richard Index: gcc/postreload.c =================================================================== --- gcc/postreload.c 2013-11-09 09:39:16.947734730 +0000 +++ gcc/postreload.c 2013-11-09 09:39:29.721821066 +0000 @@ -303,21 +303,19 @@ reload_cse_simplify_set (rtx set, rtx in switch (extend_op) { case ZERO_EXTEND: - result = wide_int (std::make_pair (this_rtx, GET_MODE (src))); - if (GET_MODE_PRECISION (GET_MODE (src)) - > GET_MODE_PRECISION (word_mode)) - result = wi::zext (result, GET_MODE_PRECISION (word_mode)); + result = wide_int::from (std::make_pair (this_rtx, + GET_MODE (src)), + BITS_PER_WORD, UNSIGNED); break; case SIGN_EXTEND: - result = wide_int (std::make_pair (this_rtx, GET_MODE (src))); - if (GET_MODE_PRECISION (GET_MODE (src)) - > GET_MODE_PRECISION (word_mode)) - result = wi::sext (result, GET_MODE_PRECISION (word_mode)); + result = wide_int::from (std::make_pair (this_rtx, + GET_MODE (src)), + BITS_PER_WORD, SIGNED); break; default: gcc_unreachable (); } - this_rtx = immed_wide_int_const (result, GET_MODE (src)); + this_rtx = immed_wide_int_const (result, word_mode); } #endif this_cost = set_src_cost (this_rtx, speed);