This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/71976] insn-combiner deletes a live 64-bit shift
- From: "gjl at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 25 Jul 2016 09:33:52 +0000
- Subject: [Bug rtl-optimization/71976] insn-combiner deletes a live 64-bit shift
- Auto-submitted: auto-generated
- References: <bug-71976-4@http.gcc.gnu.org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71976
Georg-Johann Lay <gjl at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2016-07-25
Summary|[avr] insn-combiner deletes |insn-combiner deletes a
|a live 64-bit shift |live 64-bit shift
Ever confirmed|0 |1
--- Comment #6 from Georg-Johann Lay <gjl at gcc dot gnu.org> ---
This also happens on current trunk r238700 from today (2016-07-25).
After substitution from
(ashiftrt:DI (reg:DI 18 r18)
(reg:QI 16 r16))
to
(ashiftrt:DI (reg:DI 18 r18)
(const_int 40))
combine calls
simplify_shift_const_1 (code=ASHIFTRT, result_mode=DImode,
varop=0x7ffff734ee70, orig_count=40) at
../../../gcc.gnu.org/trunk/gcc/combine.c:10181
(gdb) p varop
$95 = (rtx) 0x7ffff734ee70
(gdb) pr
(reg:DI 18 r18)
And then there is this piece of code:
/* An arithmetic right shift of a quantity known to be -1 or 0
is a no-op. */
if (code == ASHIFTRT
&& (num_sign_bit_copies (varop, shift_mode)
== GET_MODE_PRECISION (shift_mode)))
{
count = 0;
break;
}
How can it conclude the quantity to be shifted (reg:DI 18) is always 0 or -1?
This is simply not the case.