combine.c (sign_extend_short_imm): New.
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Mon, 27 Apr 2015 11:02:34 +0000 (11:02 +0000)
committerThomas Preud'homme <thopre01@gcc.gnu.org>
Mon, 27 Apr 2015 11:02:34 +0000 (11:02 +0000)
2015-04-27  Thomas Preud'homme  <thomas.preudhomme@arm.com>

    * combine.c (sign_extend_short_imm): New.
    (set_nonzero_bits_and_sign_copies): Use above new function for sign
    extension of src short immediate.
    (reg_nonzero_bits_for_combine): Likewise for tem.

From-SVN: r222457

gcc/ChangeLog
gcc/combine.c

index 3688fb459b117c3144de4c47c63c3f3ab21df1f6..ceb6dc361bdbc1a7a2cd48978d9dd6158cd4fb3c 100644 (file)
@@ -1,3 +1,10 @@
+2015-04-27  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       * combine.c (sign_extend_short_imm): New.
+       (set_nonzero_bits_and_sign_copies): Use above new function for sign
+       extension of src short immediate.
+       (reg_nonzero_bits_for_combine): Likewise for tem.
+
 2015-04-27  Eric Botcazou  <ebotcazou@adacore.com>
 
        * stor-layout.c (self_referential_component_ref_p): New predicate.
index 6cd55dd4432791c5e039df1c6f08f6d7613e8d1c..2b1ba24a7c39018698f056d4aa2895babacef2ba 100644 (file)
@@ -1646,6 +1646,28 @@ setup_incoming_promotions (rtx_insn *first)
     }
 }
 
+#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
+/* If MODE has a precision lower than PREC and SRC is a non-negative constant
+   that would appear negative in MODE, sign-extend SRC for use in nonzero_bits
+   because some machines (maybe most) will actually do the sign-extension and
+   this is the conservative approach.
+
+   ??? For 2.5, try to tighten up the MD files in this regard instead of this
+   kludge.  */
+
+static rtx
+sign_extend_short_imm (rtx src, machine_mode mode, unsigned int prec)
+{
+  if (GET_MODE_PRECISION (mode) < prec
+      && CONST_INT_P (src)
+      && INTVAL (src) > 0
+      && val_signbit_known_set_p (mode, INTVAL (src)))
+    src = GEN_INT (INTVAL (src) | ~GET_MODE_MASK (mode));
+
+  return src;
+}
+#endif
+
 /* Called via note_stores.  If X is a pseudo that is narrower than
    HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
 
@@ -1725,20 +1747,7 @@ set_nonzero_bits_and_sign_copies (rtx x, const_rtx set, void *data)
          rtx src = SET_SRC (set);
 
 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
-         /* If X is narrower than a word and SRC is a non-negative
-            constant that would appear negative in the mode of X,
-            sign-extend it for use in reg_stat[].nonzero_bits because some
-            machines (maybe most) will actually do the sign-extension
-            and this is the conservative approach.
-
-            ??? For 2.5, try to tighten up the MD files in this regard
-            instead of this kludge.  */
-
-         if (GET_MODE_PRECISION (GET_MODE (x)) < BITS_PER_WORD
-             && CONST_INT_P (src)
-             && INTVAL (src) > 0
-             && val_signbit_known_set_p (GET_MODE (x), INTVAL (src)))
-           src = GEN_INT (INTVAL (src) | ~GET_MODE_MASK (GET_MODE (x)));
+         src = sign_extend_short_imm (src, GET_MODE (x), BITS_PER_WORD);
 #endif
 
          /* Don't call nonzero_bits if it cannot change anything.  */
@@ -9788,20 +9797,8 @@ reg_nonzero_bits_for_combine (const_rtx x, machine_mode mode,
   if (tem)
     {
 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
-      /* If X is narrower than MODE and TEM is a non-negative
-        constant that would appear negative in the mode of X,
-        sign-extend it for use in reg_nonzero_bits because some
-        machines (maybe most) will actually do the sign-extension
-        and this is the conservative approach.
-
-        ??? For 2.5, try to tighten up the MD files in this regard
-        instead of this kludge.  */
-
-      if (GET_MODE_PRECISION (GET_MODE (x)) < GET_MODE_PRECISION (mode)
-         && CONST_INT_P (tem)
-         && INTVAL (tem) > 0
-         && val_signbit_known_set_p (GET_MODE (x), INTVAL (tem)))
-       tem = GEN_INT (INTVAL (tem) | ~GET_MODE_MASK (GET_MODE (x)));
+      tem = sign_extend_short_imm (tem, GET_MODE (x),
+                                  GET_MODE_PRECISION (mode));
 #endif
       return tem;
     }