Commit 22deefcb by Richard Biener Committed by Richard Biener

re PR tree-optimization/56415 (Performance regression after fix for 56273)

2013-02-21  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/56415
	Revert
	2013-02-11  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/56273
	* tree-vrp.c (simplify_cond_using_ranges): Disable for the
	first VRP run.

	* g++.dg/warn/Warray-bounds-6.C: New testcase.
	* gcc.dg/tree-ssa/pr21559.c: Adjust.
	* gcc.dg/tree-ssa/vrp17.c: Likewise.
	* gcc.dg/tree-ssa/vrp18.c: Likewise.
	* gcc.dg/tree-ssa/vrp23.c: Likewise.
	* gcc.dg/tree-ssa/vrp24.c: Likewise.

From-SVN: r196200
parent 267499fa
2013-02-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/56415
Revert
2013-02-11 Richard Biener <rguenther@suse.de>
PR tree-optimization/56273
* tree-vrp.c (simplify_cond_using_ranges): Disable for the
first VRP run.
2013-02-21 Jakub Jelinek <jakub@redhat.com> 2013-02-21 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/56258 PR bootstrap/56258
......
2013-02-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/56415
Revert
2013-02-11 Richard Biener <rguenther@suse.de>
PR tree-optimization/56273
* g++.dg/warn/Warray-bounds-6.C: New testcase.
* gcc.dg/tree-ssa/pr21559.c: Adjust.
* gcc.dg/tree-ssa/vrp17.c: Likewise.
* gcc.dg/tree-ssa/vrp18.c: Likewise.
* gcc.dg/tree-ssa/vrp23.c: Likewise.
* gcc.dg/tree-ssa/vrp24.c: Likewise.
2013-02-21 Marek Polacek <polacek@redhat.com> 2013-02-21 Marek Polacek <polacek@redhat.com>
PR tree-optimization/56398 PR tree-optimization/56398
......
// { dg-do compile }
// { dg-options "-O3 -Warray-bounds" }
struct type {
bool a, b;
bool get_b() { return b; }
};
type stuff[9u];
void bar();
void foo() {
for(unsigned i = 0u; i < 9u; i++) {
if(!stuff[i].a) {
continue;
}
bar();
for(unsigned j = i + 1u; j < 9u; j++) {
if(stuff[j].a && stuff[j].get_b()) { // { dg-bogus "array bounds" }
return;
}
}
}
}
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp-details" } */ /* { dg-options "-O2 -fdump-tree-vrp1-details" } */
static int blocksize = 4096; static int blocksize = 4096;
...@@ -32,7 +32,7 @@ void foo (void) ...@@ -32,7 +32,7 @@ void foo (void)
/* First, we should simplify the bits < 0 test within the loop. */ /* First, we should simplify the bits < 0 test within the loop. */
/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp2" } } */ /* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
/* Second, we should thread the edge out of the loop via the break /* Second, we should thread the edge out of the loop via the break
statement. We also realize that the final bytes == 0 test is useless, statement. We also realize that the final bytes == 0 test is useless,
...@@ -40,4 +40,4 @@ void foo (void) ...@@ -40,4 +40,4 @@ void foo (void)
/* { dg-final { scan-tree-dump-times "Threaded jump" 3 "vrp1" } } */ /* { dg-final { scan-tree-dump-times "Threaded jump" 3 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp1" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp2" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-tail-merge -fdump-tree-vrp2" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
extern void abort (void) __attribute__ ((__noreturn__)); extern void abort (void) __attribute__ ((__noreturn__));
union tree_node; union tree_node;
...@@ -27,5 +27,6 @@ gimplify_for_stmt (tree stmt) ...@@ -27,5 +27,6 @@ gimplify_for_stmt (tree stmt)
abort (); abort ();
} }
/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp2" } } */ /* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp2" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp2" } */ /* { dg-options "-O2 -fdump-tree-vrp1" } */
static int blocksize = 4096; static int blocksize = 4096;
...@@ -30,5 +30,5 @@ void foo (void) ...@@ -30,5 +30,5 @@ void foo (void)
eof_reached = 1; eof_reached = 1;
} }
/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp2" } } */ /* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp2" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp2-details" } */ /* { dg-options "-O2 -fdump-tree-vrp1-details" } */
blah (int code1, int code2) blah (int code1, int code2)
{ {
...@@ -40,5 +40,6 @@ L8: ...@@ -40,5 +40,6 @@ L8:
/* The n_sets > 0 test can be simplified into n_sets == 1 since the /* The n_sets > 0 test can be simplified into n_sets == 1 since the
only way to reach the test is when n_sets <= 1, and the only value only way to reach the test is when n_sets <= 1, and the only value
which satisfies both conditions is n_sets == 1. */ which satisfies both conditions is n_sets == 1. */
/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp2" } } */ /* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp2" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp2-details" } */ /* { dg-options "-O2 -fdump-tree-vrp1-details" } */
struct rtx_def; struct rtx_def;
typedef struct rtx_def *rtx; typedef struct rtx_def *rtx;
...@@ -85,5 +86,6 @@ L7: ...@@ -85,5 +86,6 @@ L7:
The second n_sets > 0 test can also be simplified into n_sets == 1 The second n_sets > 0 test can also be simplified into n_sets == 1
as the only way to reach the tests is when n_sets <= 1 and the only as the only way to reach the tests is when n_sets <= 1 and the only
value which satisfies both conditions is n_sets == 1. */ value which satisfies both conditions is n_sets == 1. */
/* { dg-final { scan-tree-dump-times "Simplified relational" 2 "vrp2" } } */ /* { dg-final { scan-tree-dump-times "Simplified relational" 2 "vrp1" } } */
/* { dg-final { cleanup-tree-dump "vrp2" } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */
...@@ -8503,8 +8503,9 @@ test_for_singularity (enum tree_code cond_code, tree op0, ...@@ -8503,8 +8503,9 @@ test_for_singularity (enum tree_code cond_code, tree op0,
return NULL; return NULL;
} }
/* Simplify the conditional stmt STMT using final range information. /* Simplify a conditional using a relational operator to an equality
Return true if we simplified the statement. */ test if the range information indicates only one value can satisfy
the original conditional. */
static bool static bool
simplify_cond_using_ranges (gimple stmt) simplify_cond_using_ranges (gimple stmt)
...@@ -8513,13 +8514,7 @@ simplify_cond_using_ranges (gimple stmt) ...@@ -8513,13 +8514,7 @@ simplify_cond_using_ranges (gimple stmt)
tree op1 = gimple_cond_rhs (stmt); tree op1 = gimple_cond_rhs (stmt);
enum tree_code cond_code = gimple_cond_code (stmt); enum tree_code cond_code = gimple_cond_code (stmt);
/* Simplify a conditional using a relational operator to an equality if (cond_code != NE_EXPR
test if the range information indicates only one value can satisfy
the original conditional.
Do that only in the second VRP pass as otherwise assertions derived
from this predicate are weakened. */
if (!first_pass_instance
&& cond_code != NE_EXPR
&& cond_code != EQ_EXPR && cond_code != EQ_EXPR
&& TREE_CODE (op0) == SSA_NAME && TREE_CODE (op0) == SSA_NAME
&& INTEGRAL_TYPE_P (TREE_TYPE (op0)) && INTEGRAL_TYPE_P (TREE_TYPE (op0))
......
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