combine.c (update_rsp_from_reg_equal): Only look for the nonzero bits of src in nonze...
authorJozef Lawrynowicz <jozef.l@mittosystems.com>
Tue, 18 Dec 2018 10:29:42 +0000 (10:29 +0000)
committerJozef Lawrynowicz <jozefl@gcc.gnu.org>
Tue, 18 Dec 2018 10:29:42 +0000 (10:29 +0000)
2018-12-18  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

* combine.c (update_rsp_from_reg_equal): Only look for the nonzero bits
of src in nonzero_bits_mode if the mode of src is MODE_INT and
HWI_COMPUTABLE.
(reg_nonzero_bits_for_combine): Add clarification to comment.

From-SVN: r267227

gcc/ChangeLog
gcc/combine.c

index 6801995021e40d7bd6b71392f3a684eb91251cb7..e24bb94baa0dc84a9f22c2b14bc2e2df35141d9f 100644 (file)
@@ -1,3 +1,10 @@
+2018-12-18  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
+
+       * combine.c (update_rsp_from_reg_equal): Only look for the nonzero bits
+       of src in nonzero_bits_mode if the mode of src is MODE_INT and
+       HWI_COMPUTABLE.
+       (reg_nonzero_bits_for_combine): Add clarification to comment.
+
 2018-12-18  Wei Xiao  <wei3.xiao@intel.com>
 
        * config/i386/driver-i386.c (host_detect_local_cpu): Detect cascadelake.
index 220c3a45631bf9b36aa409ba5c47d7229169ca23..a1d6e2dfc99920f647e7fc93719ae50938e1b49a 100644 (file)
@@ -1698,9 +1698,13 @@ update_rsp_from_reg_equal (reg_stat_type *rsp, rtx_insn *insn, const_rtx set,
   /* Don't call nonzero_bits if it cannot change anything.  */
   if (rsp->nonzero_bits != HOST_WIDE_INT_M1U)
     {
-      bits = nonzero_bits (src, nonzero_bits_mode);
+      machine_mode mode = GET_MODE (x);
+      if (GET_MODE_CLASS (mode) == MODE_INT
+         && HWI_COMPUTABLE_MODE_P (mode))
+       mode = nonzero_bits_mode;
+      bits = nonzero_bits (src, mode);
       if (reg_equal && bits)
-       bits &= nonzero_bits (reg_equal, nonzero_bits_mode);
+       bits &= nonzero_bits (reg_equal, mode);
       rsp->nonzero_bits |= bits;
     }
 
@@ -10225,6 +10229,7 @@ simplify_and_const_int (rtx x, scalar_int_mode mode, rtx varop,
 \f
 /* Given a REG X of mode XMODE, compute which bits in X can be nonzero.
    We don't care about bits outside of those defined in MODE.
+   We DO care about all the bits in MODE, even if XMODE is smaller than MODE.
 
    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
    a shift, AND, or zero_extract, we can do better.  */