Commit 5e19d437 by Bin Cheng Committed by Bin Cheng

tree.h (POINTER_TYPE_OVERFLOW_UNDEFINED): Delete.

	* tree.h (POINTER_TYPE_OVERFLOW_UNDEFINED): Delete.
	* fold-const.c (fold_comparison, fold_binary_loc): Delete use of
	above macro.
	* match.pd: Ditto in address comparison pattern.

	gcc/testsuite
	* gcc.dg/no-strict-overflow-7.c: Revise comment and test string.
	* gcc.dg/tree-ssa/pr81388-1.c: Ditto.

From-SVN: r250765
parent 7061cfc0
2017-08-01 Bin Cheng <bin.cheng@arm.com> 2017-08-01 Bin Cheng <bin.cheng@arm.com>
* tree.h (POINTER_TYPE_OVERFLOW_UNDEFINED): Delete.
* fold-const.c (fold_comparison, fold_binary_loc): Delete use of
above macro.
* match.pd: Ditto in address comparison pattern.
2017-08-01 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/81627 PR tree-optimization/81627
* tree-predcom.c (prepare_finalizers): Always rewrite into loop * tree-predcom.c (prepare_finalizers): Always rewrite into loop
closed ssa form for store-store chain. closed ssa form for store-store chain.
......
...@@ -8458,14 +8458,9 @@ fold_comparison (location_t loc, enum tree_code code, tree type, ...@@ -8458,14 +8458,9 @@ fold_comparison (location_t loc, enum tree_code code, tree type,
{ {
/* We can fold this expression to a constant if the non-constant /* We can fold this expression to a constant if the non-constant
offset parts are equal. */ offset parts are equal. */
if ((offset0 == offset1 if (offset0 == offset1
|| (offset0 && offset1 || (offset0 && offset1
&& operand_equal_p (offset0, offset1, 0))) && operand_equal_p (offset0, offset1, 0)))
&& (equality_code
|| (indirect_base0
&& (DECL_P (base0) || CONSTANT_CLASS_P (base0)))
|| POINTER_TYPE_OVERFLOW_UNDEFINED))
{ {
if (!equality_code if (!equality_code
&& bitpos0 != bitpos1 && bitpos0 != bitpos1
...@@ -8500,11 +8495,7 @@ fold_comparison (location_t loc, enum tree_code code, tree type, ...@@ -8500,11 +8495,7 @@ fold_comparison (location_t loc, enum tree_code code, tree type,
because pointer arithmetic is restricted to retain within an because pointer arithmetic is restricted to retain within an
object and overflow on pointer differences is undefined as of object and overflow on pointer differences is undefined as of
6.5.6/8 and /9 with respect to the signed ptrdiff_t. */ 6.5.6/8 and /9 with respect to the signed ptrdiff_t. */
else if (bitpos0 == bitpos1 else if (bitpos0 == bitpos1)
&& (equality_code
|| (indirect_base0
&& (DECL_P (base0) || CONSTANT_CLASS_P (base0)))
|| POINTER_TYPE_OVERFLOW_UNDEFINED))
{ {
/* By converting to signed sizetype we cover middle-end pointer /* By converting to signed sizetype we cover middle-end pointer
arithmetic which operates on unsigned pointer types of size arithmetic which operates on unsigned pointer types of size
...@@ -9590,7 +9581,7 @@ fold_binary_loc (location_t loc, ...@@ -9590,7 +9581,7 @@ fold_binary_loc (location_t loc,
/* With undefined overflow prefer doing association in a type /* With undefined overflow prefer doing association in a type
which wraps on overflow, if that is one of the operand types. */ which wraps on overflow, if that is one of the operand types. */
if ((POINTER_TYPE_P (type) && POINTER_TYPE_OVERFLOW_UNDEFINED) if (POINTER_TYPE_P (type)
|| (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type))) || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
{ {
if (INTEGRAL_TYPE_P (TREE_TYPE (arg0)) if (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
...@@ -9604,7 +9595,7 @@ fold_binary_loc (location_t loc, ...@@ -9604,7 +9595,7 @@ fold_binary_loc (location_t loc,
/* With undefined overflow we can only associate constants with one /* With undefined overflow we can only associate constants with one
variable, and constants whose association doesn't overflow. */ variable, and constants whose association doesn't overflow. */
if ((POINTER_TYPE_P (atype) && POINTER_TYPE_OVERFLOW_UNDEFINED) if (POINTER_TYPE_P (atype)
|| (INTEGRAL_TYPE_P (atype) && !TYPE_OVERFLOW_WRAPS (atype))) || (INTEGRAL_TYPE_P (atype) && !TYPE_OVERFLOW_WRAPS (atype)))
{ {
if (var0 && var1) if (var0 && var1)
......
...@@ -3223,14 +3223,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) ...@@ -3223,14 +3223,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
|| TREE_CODE (base1) == STRING_CST)) || TREE_CODE (base1) == STRING_CST))
equal = (base0 == base1); equal = (base0 == base1);
} }
(if (equal == 1 (if (equal == 1)
&& (cmp == EQ_EXPR || cmp == NE_EXPR
/* If the offsets are equal we can ignore overflow. */
|| off0 == off1
|| POINTER_TYPE_OVERFLOW_UNDEFINED
/* Or if we compare using pointers to decls or strings. */
|| (POINTER_TYPE_P (TREE_TYPE (@2))
&& (DECL_P (base0) || TREE_CODE (base0) == STRING_CST))))
(switch (switch
(if (cmp == EQ_EXPR) (if (cmp == EQ_EXPR)
{ constant_boolean_node (off0 == off1, type); }) { constant_boolean_node (off0 == off1, type); })
......
2017-08-01 Bin Cheng <bin.cheng@arm.com> 2017-08-01 Bin Cheng <bin.cheng@arm.com>
* gcc.dg/no-strict-overflow-7.c: Revise comment and test string.
* gcc.dg/tree-ssa/pr81388-1.c: Ditto.
2017-08-01 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/81627 PR tree-optimization/81627
* gcc.dg/tree-ssa/pr81627.c: New. * gcc.dg/tree-ssa/pr81627.c: New.
......
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
/* Source: Ian Lance Taylor. Dual of strict-overflow-6.c. */ /* Source: Ian Lance Taylor. Dual of strict-overflow-6.c. */
/* We can only simplify the conditional when using strict overflow /* We can simplify the conditional because pointer overflow always has
semantics. */ undefined semantics. */
int int
foo (char* p) foo (char* p)
...@@ -12,4 +12,4 @@ foo (char* p) ...@@ -12,4 +12,4 @@ foo (char* p)
return p + 1000 < p; return p + 1000 < p;
} }
/* { dg-final { scan-tree-dump "\[+\]\[ \]*1000" "optimized" } } */ /* { dg-final { scan-tree-dump "return 0" "optimized" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fno-strict-overflow -fdump-tree-ivcanon-details" } */ /* { dg-options "-O2 -fno-strict-overflow -fdump-tree-tailc-details" } */
void bar(); void bar();
void foo(char *dst) void foo(char *dst)
...@@ -11,4 +11,6 @@ void foo(char *dst) ...@@ -11,4 +11,6 @@ void foo(char *dst)
} while (dst < end); } while (dst < end);
} }
/* { dg-final { scan-tree-dump-times " zero if " 1 "ivcanon" } } */ /* The loop only iterates once because pointer overflow always has undefined
semantics. As a result, call to bar becomes tail call. */
/* { dg-final { scan-tree-dump-times "Found tail call " 1 "tailc" } } */
...@@ -859,9 +859,6 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, ...@@ -859,9 +859,6 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
&& !TYPE_OVERFLOW_WRAPS (TYPE) \ && !TYPE_OVERFLOW_WRAPS (TYPE) \
&& (flag_sanitize & SANITIZE_SI_OVERFLOW)) && (flag_sanitize & SANITIZE_SI_OVERFLOW))
/* True if pointer types have undefined overflow. */
#define POINTER_TYPE_OVERFLOW_UNDEFINED (!flag_wrapv)
/* Nonzero in a VAR_DECL or STRING_CST means assembler code has been written. /* Nonzero in a VAR_DECL or STRING_CST means assembler code has been written.
Nonzero in a FUNCTION_DECL means that the function has been compiled. Nonzero in a FUNCTION_DECL means that the function has been compiled.
This is interesting in an inline function, since it might not need This is interesting in an inline function, since it might not need
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment