The following C++ code is not fully as optimizated as the C version: typedef __SIZE_TYPE__ size_t; size_t a[100]; size_t f(size_t b, size_t c) { return &a[b] - &a[c]; } Found this while looking into the tree dump for mgrid.
This should improve mgrid and IV selection.
The code in comment #0 should produce no multiply/divides/shifts but does currently (again with the C++ front-end). Take the following code: typedef __SIZE_TYPE__ size_t; size_t a[100]; size_t f(size_t b, size_t c) { return (&a[b] - &a[c])*sizeof(*a); } We get the good code but only after combine so this blocks both the generic one and the RTL based missed fold optimizators and we can add the TREE keyword too for the above testcase.
Yup, the dumps from the c++ front end is: ;; Function size_t f(size_t, size_t) (_Z1fjj) size_t f(size_t, size_t) (b, c) { <bb 0>: return (size_t) (((int) &a[b] - (int) &a[c]) /[ex] 4); } and the C front-end dump is: ;; Function f (f) f (b, c) { <bb 0>: return (size_t) (b - c); }
PR19807 is related.
Zdenek was complaining about this in: <http://gcc.gnu.org/ml/gcc-patches/2005-04/msg02411.html>.
Patch at http://gcc.gnu.org/ml/gcc-patches/2005-04/msg02499.html
Subject: Bug 21082 CVSROOT: /cvs/gcc Module name: gcc Changes by: rguenth@gcc.gnu.org 2005-04-23 21:34:42 Modified files: gcc : ChangeLog fold-const.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/tree-ssa: pr21082.C Log message: 2005-04-23 Richard Guenther <rguenth@gcc.gnu.org> PR middle-end/21082 * fold-const.c: Fold &a[i]-&a[j] to i-j. * g++.dg/tree-ssa/pr21082.C: New testcase. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.8430&r2=2.8431 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fold-const.c.diff?cvsroot=gcc&r1=1.569&r2=1.570 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.5388&r2=1.5389 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/tree-ssa/pr21082.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
Fixed.