* expmed.c (extract_bit_field_1): Avoid clobbering a
authordj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 30 May 2015 06:05:54 +0000 (06:05 +0000)
committerdj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 30 May 2015 06:05:54 +0000 (06:05 +0000)
yet-to-be-used base/index register.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@223885 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expmed.c

index 76992ee..2f3fcae 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-28  DJ Delorie  <dj@redhat.com>
+
+       * expmed.c (extract_bit_field_1): Avoid clobbering a
+       yet-to-be-used base/index register.
+
 2015-05-30  Jan Hubicka  <hubicka@ucw.cz>
 
        * alias.c (alias_set_entry_d): Add is_pointer and has_pointer.
index fa13f8c..4b2b026 100644 (file)
@@ -1616,6 +1616,11 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
       if (target == 0 || !REG_P (target) || !valid_multiword_target_p (target))
        target = gen_reg_rtx (mode);
 
+      /* In case we're about to clobber a base register or something 
+        (see gcc.c-torture/execute/20040625-1.c).   */
+      if (reg_mentioned_p (target, str_rtx))
+       target = gen_reg_rtx (mode);
+
       /* Indicate for flow that the entire target reg is being set.  */
       emit_clobber (target);