public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/54491] New: interval membership optimization
@ 2012-09-05 13:05 neleai at seznam dot cz
  2012-09-05 14:22 ` [Bug tree-optimization/54491] " rguenth at gcc dot gnu.org
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: neleai at seznam dot cz @ 2012-09-05 13:05 UTC (permalink / raw)
  To: gcc-bugs

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

             Bug #: 54491
           Summary: interval membership optimization
    Classification: Unclassified
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: neleai@seznam.cz


A common optimization to test range membership b \in [c,d] is to use integer
overflow as in function range below. 

gcc does this optimization when both c and d are constants. However inlining
disables this optimization. 

Same optimization can be automatically applied for c arbitrary expression and 
d=c+positive_constant 


unsigned int range(unsigned int b,unsigned int c){
  if (b-c<=42) return c;
  return b;
}
unsigned int foo(unsigned int b,unsigned int c){
  if (c<=b && b <=42+c) return c;
  return b;
}
unsigned int bar(unsigned int b){
  return foo(b,42);
}
unsigned int baz(unsigned int b){
  if (42<=b && b<=84) return 42;
  return b;
}

 .file "a.c"
  .text
  .p2align 4,,15
  .globl  range
  .type range, @function
range:
.LFB0:
  .cfi_startproc
  movl  %edi, %eax
  subl  %esi, %eax
  cmpl  $42, %eax
  movl  %esi, %eax
  cmova %edi, %eax
  ret
  .cfi_endproc
.LFE0:
  .size range, .-range
  .p2align 4,,15
  .globl  foo
  .type foo, @function
foo:
.LFB1:
  .cfi_startproc
  cmpl  %edi, %esi
  movl  %edi, %eax
  ja  .L5
  leal  42(%rsi), %edx
  cmpl  %edx, %edi
  cmovbe  %esi, %eax
.L5:
  rep; ret
  .cfi_endproc
.LFE1:
  .size foo, .-foo
  .p2align 4,,15
  .globl  bar
  .type bar, @function
bar:
.LFB2:
  .cfi_startproc
  cmpl  $41, %edi
  movl  %edi, %eax
  jbe .L10
  cmpl  $85, %edi
  movl  $42, %edx
  cmovb %edx, %eax
.L10:
  rep; ret

  .cfi_endproc
.LFE2:
  .size bar, .-bar
  .p2align 4,,15
  .globl  baz
  .type baz, @function
baz:
.LFB3:
  .cfi_startproc
  leal  -42(%rdi), %edx
  movl  $42, %eax
  cmpl  $42, %edx
  cmova %edi, %eax
  ret
  .cfi_endproc
.LFE3:
  .size baz, .-baz
  .ident  "GCC: (Debian 20120820-1) 4.8.0 20120820 (experimental) [trunk
revision 190537]"
  .section  .note.GNU-stack,"",@progbits


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

* [Bug tree-optimization/54491] interval membership optimization
  2012-09-05 13:05 [Bug c/54491] New: interval membership optimization neleai at seznam dot cz
@ 2012-09-05 14:22 ` rguenth at gcc dot gnu.org
  2012-09-05 14:55 ` jakub at gcc dot gnu.org
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: rguenth at gcc dot gnu.org @ 2012-09-05 14:22 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Guenther <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2012-09-05
          Component|c                           |tree-optimization
     Ever Confirmed|0                           |1

--- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-09-05 14:21:47 UTC ---
You are basically requesting 12 < a < 32 to be converted to
(unsigned) a - 12 < 20, something fold does but not forwprop or ifcombine.


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

* [Bug tree-optimization/54491] interval membership optimization
  2012-09-05 13:05 [Bug c/54491] New: interval membership optimization neleai at seznam dot cz
  2012-09-05 14:22 ` [Bug tree-optimization/54491] " rguenth at gcc dot gnu.org
@ 2012-09-05 14:55 ` jakub at gcc dot gnu.org
  2012-09-05 15:09 ` jakub at gcc dot gnu.org
  2012-09-05 17:53 ` pinskia at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: jakub at gcc dot gnu.org @ 2012-09-05 14:55 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-09-05 14:54:50 UTC ---
I'm suprised PR46309 doesn't handle this.  Will look at it.


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

* [Bug tree-optimization/54491] interval membership optimization
  2012-09-05 13:05 [Bug c/54491] New: interval membership optimization neleai at seznam dot cz
  2012-09-05 14:22 ` [Bug tree-optimization/54491] " rguenth at gcc dot gnu.org
  2012-09-05 14:55 ` jakub at gcc dot gnu.org
@ 2012-09-05 15:09 ` jakub at gcc dot gnu.org
  2012-09-05 17:53 ` pinskia at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: jakub at gcc dot gnu.org @ 2012-09-05 15:09 UTC (permalink / raw)
  To: gcc-bugs

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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-09-05 15:09:18 UTC ---
Ah, right, the #c7 from that PR applies here.  If you use
if ((c<=b) & (b <=42+c)) return c; 
in foo instead, bar will be optimized by the reassoc pass.


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

* [Bug tree-optimization/54491] interval membership optimization
  2012-09-05 13:05 [Bug c/54491] New: interval membership optimization neleai at seznam dot cz
                   ` (2 preceding siblings ...)
  2012-09-05 15:09 ` jakub at gcc dot gnu.org
@ 2012-09-05 17:53 ` pinskia at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: pinskia at gcc dot gnu.org @ 2012-09-05 17:53 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> 2012-09-05 17:52:53 UTC ---
> integer overflow 

Note there is never any integer overflow with unsigned types but always
wrapping.


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

end of thread, other threads:[~2012-09-05 17:53 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-05 13:05 [Bug c/54491] New: interval membership optimization neleai at seznam dot cz
2012-09-05 14:22 ` [Bug tree-optimization/54491] " rguenth at gcc dot gnu.org
2012-09-05 14:55 ` jakub at gcc dot gnu.org
2012-09-05 15:09 ` jakub at gcc dot gnu.org
2012-09-05 17:53 ` 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).