From 6a30d8c0a687baae0cea91ca6b3adbed32e84471 Mon Sep 17 00:00:00 2001 From: Jozef Lawrynowicz Date: Tue, 18 Dec 2018 10:29:42 +0000 Subject: [PATCH] combine.c (update_rsp_from_reg_equal): Only look for the nonzero bits of src in nonzero_bits_mode if... 2018-12-18 Jozef Lawrynowicz * 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 | 7 +++++++ gcc/combine.c | 9 +++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6801995021e..e24bb94baa0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-12-18 Jozef Lawrynowicz + + * 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 * config/i386/driver-i386.c (host_detect_local_cpu): Detect cascadelake. diff --git a/gcc/combine.c b/gcc/combine.c index 220c3a45631..a1d6e2dfc99 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -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, /* 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. */ -- 2.30.2