Re: [PATCH] Remove bogus PLUS_EXPR -> POINTER_PLUS_EXPR folding

Richard Guenther <[email protected]>
Newsgroups gmane.comp.gcc.java.devel,gmane.comp.gcc.patches
Message-ID <[email protected]>
On Fri, 16 Jan 2009, Richard Guenther wrote:

> 
> This removes a bogus folding that causes miscompiles of libstdc++
> testcases with the ext_pointer class (PR38835) and non-field-sensitive 
> PTA (field-sensitive PTA is too dumb).  I probably anticipated the
> problem in PR36227 which should be fixed with that patch as well.
> 
> Fold changes
> 
>    return <retval> = (const struct _Fwd_list_node_base *) ((long unsigned int) this + (long unsigned int) ((const struct _Relative_pointer_impl *) this)->_M_diff);
> 
> to
> 
>    (const struct _Fwd_list_node_base *) this p+ (long unsigned int) ((const struct _Relative_pointer_impl *) this)->_M_diff
> 
> which makes PTA correctly conclude that 'this' and the result of the
> POINTER_PLUS_EXPR point to the same object.  Which they do not - the source
> used addition in (long unsigned int) to avoid this issue and the resulting
> pointer points somewhere else.
> 
> Fixed by removing the folding.  This also fixes -Wsystem-header warnings
> and miscompiles for the libstdc++ testsuite.
> 
> Bootstrap and regtest on x86_64-unknown-linux-gnu ongoing.

Needs one extra hunk in the Java frontend.  Bootstrapped and tested
on x86_64-unknown-linux-gnu, is that ok for trunk?

Also needs one C++ testcase XFAILed, the FE passes
(long int) &16B->y - 16 into fold and expects us to perform offsetof
magic.  I will try to address both XFAILs later.

Thanks,
Richard.

2009-01-16  Richard Guenther  <[email protected]>

	PR tree-optimization/38835
	PR middle-end/36227

	java/
	* builtins.c (build_addr_sum): Use POINTER_PLUS_EXPR.

Index: gcc/java/builtins.c
===================================================================
*** gcc/java/builtins.c	(revision 143429)
--- gcc/java/builtins.c	(working copy)
*************** static tree
*** 265,273 ****
  build_addr_sum (tree type, tree addr, tree offset)
  {
    tree ptr_type = build_pointer_type (type);
!   return  fold_build2 (PLUS_EXPR, 
! 		       ptr_type, 
! 		       fold_convert (ptr_type, addr), offset);
  }
  
  /* Make sure that this-arg is non-NULL.  This is a security check.  */
--- 265,274 ----
  build_addr_sum (tree type, tree addr, tree offset)
  {
    tree ptr_type = build_pointer_type (type);
!   return fold_build2 (POINTER_PLUS_EXPR,
! 		      ptr_type,
! 		      fold_convert (ptr_type, addr),
! 		      fold_convert (sizetype, offset));
  }
  
  /* Make sure that this-arg is non-NULL.  This is a security check.  */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.