[PATCH] Remove bogus PLUS_EXPR -> POINTER_PLUS_EXPR folding

Richard Guenther rguenther@suse.de
Fri Jan 16 19:25:00 GMT 2009


On 2009年1月16日, Andrew Haley wrote:
> OK.
>> Andrew.

Thanks. This is what I applied.
Richard.
2009年01月16日 Richard Guenther <rguenther@suse.de>
	PR tree-optimization/38835
	PR middle-end/36227
	* fold-const.c (fold_binary): Remove PTR + INT -> (INT)(PTR p+ INT)
	and INT + PTR -> (INT)(PTR p+ INT) folding.
	* tree-ssa-address.c (create_mem_ref): Properly use POINTER_PLUS_EXPR.
	java/
	* builtins.c (build_addr_sum): Use POINTER_PLUS_EXPR.
	* gcc.c-torture/execute/pr36227.c: New testcase.
	* gcc.dg/tree-ssa/foldaddr-1.c: XFAIL.
	* g++.dg/init/const7.C: Likewise.
Index: gcc/fold-const.c
===================================================================
*** gcc/fold-const.c.orig	2009年01月16日 18:07:26.000000000 +0100
--- gcc/fold-const.c	2009年01月16日 20:11:49.000000000 +0100
*************** fold_binary (enum tree_code code, tree t
*** 9864,9883 ****
 return NULL_TREE;
 
 case PLUS_EXPR:
- /* PTR + INT -> (INT)(PTR p+ INT) */
- if (POINTER_TYPE_P (TREE_TYPE (arg0))
- 	 && INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
- 	return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
- 						TREE_TYPE (arg0),
- 						arg0,
- 						fold_convert (sizetype, arg1)));
- /* INT + PTR -> (INT)(PTR p+ INT) */
- if (POINTER_TYPE_P (TREE_TYPE (arg1))
- 	 && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
- 	return fold_convert (type, fold_build2 (POINTER_PLUS_EXPR,
- 						TREE_TYPE (arg1),
- 						arg1,
- 						fold_convert (sizetype, arg0)));
 /* A + (-B) -> A - B */
 if (TREE_CODE (arg1) == NEGATE_EXPR)
 	return fold_build2 (MINUS_EXPR, type,
--- 9864,9869 ----
Index: gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c.orig	2009年01月16日 18:06:51.000000000 +0100
--- gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c	2009年01月16日 20:11:49.000000000 +0100
*************** int foo(char *b)
*** 11,16 ****
 /* Folding should have determined that the two addresses were
 not identical and thus collapsed the function into a trivial
 "return 0". */
! /* { dg-final { scan-tree-dump-times "return 0" 1 "original"} } */
 /* { dg-final { cleanup-tree-dump "original" } } */
 
--- 11,16 ----
 /* Folding should have determined that the two addresses were
 not identical and thus collapsed the function into a trivial
 "return 0". */
! /* { dg-final { scan-tree-dump-times "return 0" 1 "original" { xfail *-*-* } } */
 /* { dg-final { cleanup-tree-dump "original" } } */
 
Index: gcc/tree-ssa-address.c
===================================================================
*** gcc/tree-ssa-address.c.orig	2009年01月16日 18:06:51.000000000 +0100
--- gcc/tree-ssa-address.c	2009年01月16日 20:11:49.000000000 +0100
*************** create_mem_ref (gimple_stmt_iterator *gs
*** 619,627 ****
 	 {
 	 atype = TREE_TYPE (tmp);
 	 parts.base = force_gimple_operand_gsi (gsi,
! 			fold_build2 (PLUS_EXPR, atype,
! 				 fold_convert (atype, parts.base),
! 				 tmp),
 			true, NULL_TREE, true, GSI_SAME_STMT);
 	 }
 	 else
--- 619,627 ----
 	 {
 	 atype = TREE_TYPE (tmp);
 	 parts.base = force_gimple_operand_gsi (gsi,
! 			fold_build2 (POINTER_PLUS_EXPR, atype,
! 				 tmp,
! 				 fold_convert (sizetype, parts.base)),
 			true, NULL_TREE, true, GSI_SAME_STMT);
 	 }
 	 else
Index: gcc/java/builtins.c
===================================================================
*** gcc/java/builtins.c.orig	2009年01月16日 18:06:51.000000000 +0100
--- gcc/java/builtins.c	2009年01月16日 20:11:49.000000000 +0100
*************** 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. */
Index: gcc/testsuite/g++.dg/init/const7.C
===================================================================
*** gcc/testsuite/g++.dg/init/const7.C.orig	2009年01月16日 18:06:51.000000000 +0100
--- gcc/testsuite/g++.dg/init/const7.C	2009年01月16日 20:11:49.000000000 +0100
*************** short offsets[1] = {
*** 9,13 ****
 // This ensures that we get a dump whether or not the bug is present.
 void fn() { }
 
! // { dg-final { scan-tree-dump-not "initialization" "gimple" } }
 // { dg-final { cleanup-tree-dump "gimple" } }
--- 9,13 ----
 // This ensures that we get a dump whether or not the bug is present.
 void fn() { }
 
! // { dg-final { scan-tree-dump-not "initialization" "gimple" { xfail *-*-* } } }
 // { dg-final { cleanup-tree-dump "gimple" } }
Index: gcc/testsuite/gcc.c-torture/execute/pr36227.c
===================================================================
*** /dev/null	1970年01月01日 00:00:00.000000000 +0000
--- gcc/testsuite/gcc.c-torture/execute/pr36227.c	2009年01月16日 20:12:24.000000000 +0100
***************
*** 0 ****
--- 1,15 ----
+ #include <stdint.h>
+ extern void abort (void);
+ int main()
+ {
+ int i = 1;
+ int *p = &i;
+ uintptr_t iptr;
+ 
+ iptr = (uintptr_t)p - (uintptr_t)&iptr;
+ p = (int *)((uintptr_t)&iptr + iptr);
+ if (*p != 1)
+ abort ();
+ return 0;
+ }
+ 


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /