Bug 21082

Summary: &a[b] - &a[c] is not folded to b - c
Product: gcc Reporter: Andrew Pinski <pinskia>
Component: middle-endAssignee: Richard Biener <rguenth>
Status: RESOLVED FIXED    
Severity: enhancement CC: gcc-bugs
Priority: P2 Keywords: missed-optimization, patch, TREE
Version: 4.1.0   
Target Milestone: 4.1.0   
URL: http://gcc.gnu.org/ml/gcc-patches/2005-04/msg02499.html
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2005-04-23 21:05:50
Bug Depends on:    
Bug Blocks: 19986, 19987, 19807    

Description Andrew Pinski 2005-04-18 03:06:10 UTC
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.
Comment 1 Andrew Pinski 2005-04-18 03:19:54 UTC
This should improve mgrid and IV selection.
Comment 2 Andrew Pinski 2005-04-18 04:06:45 UTC
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.
Comment 3 James A. Morrison 2005-04-19 14:57:38 UTC
 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);

}
Comment 4 Richard Biener 2005-04-23 14:31:20 UTC
PR19807 is related.
Comment 5 Andrew Pinski 2005-04-23 16:24:43 UTC
Zdenek was complaining about this in:
 <http://gcc.gnu.org/ml/gcc-patches/2005-04/msg02411.html>.
Comment 6 Richard Biener 2005-04-23 21:05:50 UTC
Patch at
http://gcc.gnu.org/ml/gcc-patches/2005-04/msg02499.html
Comment 7 GCC Commits 2005-04-23 21:34:56 UTC
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

Comment 8 Richard Biener 2005-04-23 21:36:53 UTC
Fixed.