https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84660

Jim Wilson <wilson at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2018-03-03
                 CC|                            |wilson at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #1 from Jim Wilson <wilson at gcc dot gnu.org> ---
The shift count is either 0x2e or 0x2f depending on input.  It gets anded with
0xf, and used in an SImode shift, which shift-truncates, so the and is
optimized away as unnecessary.  The SImode shift later gets converted to a
DImode shift, and the code is wrong at that point, because shift by 0x2e/0x2f
gives different results in SImode and DImode.

The bad conversion happens in force_int_to_mode, case ASHIFT.  There is code to
check for shift counts outside the range of mode, however, it is comparing
against the target mode, which is the wider mode.  This code was added by

commit 129e53549ca138dbffd64aa11c5b94688010127b
Author: kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Fri Apr 9 01:39:46 1993 +0000

    (force_to_mode, case xSHIFT): Don't narrow the mode unless we can be
    sure that the shift count is smaller than the size of the mode.

    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@4050
138bc75d-0d04-0410-961\
f-82ee72b054a4

so this was clearly for the narrowing case.  We are missing a test for the
widening case, which is only necessary for targets that truncate shift counts.

Since the narrowing test is trivially true when widening, and the widening test
is trivially true when narrowing, I don't think we need to check for that, we
can just do both tests.

Reply via email to