public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/48812] New: optimizing integer power of 2
@ 2011-04-28 20:25 castet.matthieu at free dot fr
  2011-04-29  9:45 ` [Bug c/48812] " rguenth at gcc dot gnu.org
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: castet.matthieu at free dot fr @ 2011-04-28 20:25 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48812

           Summary: optimizing integer power of 2
           Product: gcc
           Version: 4.4.5
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: castet.matthieu@free.fr


gcc correctly optimize
int divu(uint a, uint b)
{
        return a / (1<<b);
}
to
divu:
        mov     r0, r0, lsr r1
        mov     pc, lr

but it fails to optimize
int divu3(uint a, uint b)
{
        return a / ((1U<<b) / 4);
}

gcc generate
(arm-linux-gnueabi-gcc -Os  p.c -march=armv4 -mno-thumb-interwork -S)
divu3:
        stmfd   sp!, {r3, lr}
        mov     r3, #1
        mov     r1, r3, asl r1
        mov     r1, r1, lsr #2
        bl      {{{__}}}aeabi_uidiv
        ldmfd   sp!, {r3, pc}
or
(gcc p.c -S -O3 -fomit-frame-pointer -mregparm=3)
divu3:
        pushl   %ebx
        movl    %edx, %ecx
        movl    $1, %ebx
        xorl    %edx, %edx
        sall    %cl, %ebx
        shrl    $2, %ebx
        divl    %ebx
        popl    %ebx
        ret

but ((1U<<b) / 4) is 0 or a power of 2. Div by 0 is undefined in C ( C99
6.5.5p5)

So why can we generate : 
        mov     r3, #1
        mov     r1, r3, asl r1
        mov     r1, r1, lsr #2
        mov     r0, r0, lsr r1

?

Note that gcc correctly optimize
int divu5(uint a, uint b)
{
        return a / ((1U<<b) * 4);
}


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug c/48812] optimizing integer power of 2
  2011-04-28 20:25 [Bug c/48812] New: optimizing integer power of 2 castet.matthieu at free dot fr
@ 2011-04-29  9:45 ` rguenth at gcc dot gnu.org
  2011-04-29 19:19 ` castet.matthieu at free dot fr
  2011-07-23 22:54 ` [Bug middle-end/48812] " pinskia at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: rguenth at gcc dot gnu.org @ 2011-04-29  9:45 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48812

--- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-04-29 09:43:16 UTC ---
We do not exploit the fact that shifts bigger than the width of the type
are undefined (in fact we even try to preserve the fact that some CPUs
truncate the shift count when constant folding ...).

We also have to make sure the shift count does not get negative, which
we can't in this case.  Thus (1U<<(b-2)) is not equivalent to
(1U<<b) / 4.


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug c/48812] optimizing integer power of 2
  2011-04-28 20:25 [Bug c/48812] New: optimizing integer power of 2 castet.matthieu at free dot fr
  2011-04-29  9:45 ` [Bug c/48812] " rguenth at gcc dot gnu.org
@ 2011-04-29 19:19 ` castet.matthieu at free dot fr
  2011-07-23 22:54 ` [Bug middle-end/48812] " pinskia at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: castet.matthieu at free dot fr @ 2011-04-29 19:19 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48812

--- Comment #2 from Matthieu CASTET <castet.matthieu at free dot fr> 2011-04-29 19:18:43 UTC ---
> We also have to make sure the shift count does not get negative, which
we can't in this case.  Thus (1U<<(b-2)) is not equivalent to
(1U<<b) / 4.

yes, but 
a / c is undefined for c = 0
if c = (1U<<b) / 4 is not 0, then (1U<<b) / 4 is equivalent to (1U<<(b-2))
Then a / ((1U<<b) / 4) is equivalent to a / (1U<<(b-2))
Then a / ((1U<<b) / 4) is equivalent to (a >> (b-2))

But I agree it is not trivial optimisation


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug middle-end/48812] optimizing integer power of 2
  2011-04-28 20:25 [Bug c/48812] New: optimizing integer power of 2 castet.matthieu at free dot fr
  2011-04-29  9:45 ` [Bug c/48812] " rguenth at gcc dot gnu.org
  2011-04-29 19:19 ` castet.matthieu at free dot fr
@ 2011-07-23 22:54 ` pinskia at gcc dot gnu.org
  2 siblings, 0 replies; 4+ messages in thread
From: pinskia at gcc dot gnu.org @ 2011-07-23 22:54 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48812

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2011.07.23 22:53:44
          Component|c                           |middle-end
     Ever Confirmed|0                           |1
           Severity|normal                      |enhancement

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> 2011-07-23 22:53:44 UTC ---
Confirmed.


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-07-23 22:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-28 20:25 [Bug c/48812] New: optimizing integer power of 2 castet.matthieu at free dot fr
2011-04-29  9:45 ` [Bug c/48812] " rguenth at gcc dot gnu.org
2011-04-29 19:19 ` castet.matthieu at free dot fr
2011-07-23 22:54 ` [Bug middle-end/48812] " pinskia at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).