From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 495 invoked by alias); 2 Nov 2012 10:07:46 -0000 Received: (qmail 387 invoked by uid 48); 2 Nov 2012 10:07:27 -0000 From: "olegendo at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/55162] Loop ivopts cuts off top bits of loop counter Date: Fri, 02 Nov 2012 10:07:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: tree-optimization X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: olegendo at gcc dot gnu.org X-Bugzilla-Status: RESOLVED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Changed-Fields: CC Message-ID: In-Reply-To: References: X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated Content-Type: text/plain; charset="UTF-8" MIME-Version: 1.0 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2012-11/txt/msg00126.txt.bz2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55162 Oleg Endo changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |pinskia at gcc dot gnu.org --- Comment #3 from Oleg Endo 2012-11-02 10:07:26 UTC --- (In reply to comment #2) > >For example, passing a virtual address 0x00001000 and c = 0x80000000 to the > function should actually run over the address range 0x00001000 .. 0x80001000, > > > No it runs over the address range 0x00001000 .. -1 and more as 0x80000000 * 4 > wraps/overflows. If x was char* then I would say there is a bug but this is > int* which has a size of 4. Ugh, sorry for the mess up. Of course you're right. I guess that the pointer wrap-around would fall into "undefined behavior" category. If so, then the loop counter adjustment could be left out entirely, couldn't it? My point is that the loop counter adjustment can become quite bloaty on SH: struct X { int a, b, c, d, e; }; int test (X* x, unsigned int c) { int s = 0; unsigned int i; for (i = 0; i < c; ++i) s += x[i].b; return s; } results in: tst r5,r5 bt/s .L4 mov r5,r1 shll2 r1 add r5,r1 mov.l .L9,r2 shll2 r1 add #-20,r1 shlr2 r1 mul.l r2,r1 mov.l .L10,r2 add #4,r4 mov #0,r0 sts macl,r1 and r2,r1 add #1,r1 .L3: mov.l @r4,r2 dt r1 add #20,r4 bf/s .L3 add r2,r0 rts nop .L4: rts mov #0,r0 .L11: .align 2 .L9: .long 214748365 .L10: .long 1073741823