On Wed, Jul 27, 2016 at 09:14:27PM +0200, Georg-Johann Lay wrote: > >diff --git a/gcc/combine.c b/gcc/combine.c > >index 77e0d2b..dec6226 100644 > >--- a/gcc/combine.c > >+++ b/gcc/combine.c > >@@ -9977,6 +9977,9 @@ reg_num_sign_bit_copies_for_combine (const_rtx x, > >machine_mode mode, > > return NULL; > > } > > > >+ if (GET_MODE_PRECISION (rsp->last_set_mode) != GET_MODE_PRECISION > >(mode)) > >+ return NULL; > >+ > > tem = get_last_value (x); > > if (tem != 0) > > return tem; > > But the problem is inside get_last_value. You'd have to add such a > check at /all/ call sites of that function. Using a value for a hard > reg that's been set in a smaller mode than the mode of get_last_value is > just wrong.
Things like nonzero_bits explicitly deal with it. For MODE_INT values at least; the code looks a bit shaky. > For example combine tracks bits which are known to be zero, and if > get_last_value is used in a similar situation, then the conclusion about > zero-bits is also wrong. How so? I don't see it. > Would be interesting to patch get_last_value so that it issues some > diagnostic if > > if (regno < FIRST_PSEUDO_REGISTER > && (GET_MODE_PRECISION (rsp->last_set_mode) > < GET_MODE_PRECISION (GET_MODE (x)))) > > and then run the testsuite against that compiler. I would expect that > the condition doesn't even trigger on x86. Why restrict this to hard regs at all? Yes I know it isn't supposed to happen for pseudos, but that also means you do not need to check? Segher