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);

Reply via email to