diff options
author | Michael Matz <matz@suse.de> | 2010-03-18 12:20:50 +0000 |
---|---|---|
committer | Michael Matz <matz@gcc.gnu.org> | 2010-03-18 12:20:50 +0000 |
commit | eb45755f642d26039a0422bfbc457b08c6a3fcde (patch) | |
tree | a7e63774db500194c99a26efe5321f3fdbbffe5d | |
parent | 8269067b2c125976c2f728ef04d99bdb6ee31267 (diff) | |
download | gcc-eb45755f642d26039a0422bfbc457b08c6a3fcde.zip gcc-eb45755f642d26039a0422bfbc457b08c6a3fcde.tar.gz gcc-eb45755f642d26039a0422bfbc457b08c6a3fcde.tar.bz2 |
re PR tree-optimization/43402 (dom1 miscompiles binary search)
PR tree-optimization/43402
* tree-cfgcleanup.c (cleanup_control_expr_graph): Don't follow
PHI chains of ssa names registered for update.
testsuite/
* gcc.dg/pr43402.c: New testcase.
From-SVN: r157538
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr43402.c | 58 | ||||
-rw-r--r-- | gcc/tree-cfgcleanup.c | 16 |
4 files changed, 81 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 69edc12..0e9101d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-03-18 Michael Matz <matz@suse.de> + + PR tree-optimization/43402 + * tree-cfgcleanup.c (cleanup_control_expr_graph): Don't follow + PHI chains of ssa names registered for update. + 2010-03-17 Peter Bergner <bergner@vnet.ibm.com> PR target/42427 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5797626..bc56c91 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-03-18 Michael Matz <matz@suse.de> + + PR tree-optimization/43402 + * gcc.dg/pr43402.c: New testcase. + 2010-03-17 Peter Bergner <bergner@vnet.ibm.com> PR target/42427 diff --git a/gcc/testsuite/gcc.dg/pr43402.c b/gcc/testsuite/gcc.dg/pr43402.c new file mode 100644 index 0000000..82234c7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr43402.c @@ -0,0 +1,58 @@ +/* { dg-do run } */ +/* { dg-options "-O1 -fno-inline" } */ +extern void abort (void); + +static int something; + +static int * converterData[2]={ + &something, &something, +}; + +static struct { + const char *name; + int type; +} const cnvNameType[] = { + { "bocu1", 1 }, + { "utf7", 1 }, + { "utf8", 1 } +}; + + +const int * getAlgorithmicTypeFromName(const char *realName); +const int * +getAlgorithmicTypeFromName(const char *realName) +{ + unsigned mid, start, limit; + unsigned lastMid; + int result; + start = 0; + limit = sizeof(cnvNameType)/sizeof(cnvNameType[0]); + mid = limit; + lastMid = 0xffffffff; + + for (;;) { + mid = (start + limit) / 2; + if (lastMid == mid) { /* Have we moved? */ + break; /* We haven't moved, and it wasn't found. */ + } + lastMid = mid; + result = __builtin_strcmp(realName, cnvNameType[mid].name); + + if (result < 0) { + limit = mid; + } else if (result > 0) { + start = mid; + } else { + return converterData[cnvNameType[mid].type]; + } + } + + return 0; +} + +int main (void) +{ + if (!getAlgorithmicTypeFromName ("utf8")) + abort (); + return 0; +} diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index eae0c84..326bf80 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -103,20 +103,28 @@ cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi) /* For conditions try harder and lookup single-argument PHI nodes. Only do so from the same basic-block though as other basic-blocks may be dead already. */ - if (TREE_CODE (lhs) == SSA_NAME) + if (TREE_CODE (lhs) == SSA_NAME + && !name_registered_for_update_p (lhs)) { gimple def_stmt = SSA_NAME_DEF_STMT (lhs); if (gimple_code (def_stmt) == GIMPLE_PHI && gimple_phi_num_args (def_stmt) == 1 - && gimple_bb (def_stmt) == gimple_bb (stmt)) + && gimple_bb (def_stmt) == gimple_bb (stmt) + && (TREE_CODE (PHI_ARG_DEF (def_stmt, 0)) != SSA_NAME + || !name_registered_for_update_p (PHI_ARG_DEF (def_stmt, + 0)))) lhs = PHI_ARG_DEF (def_stmt, 0); } - if (TREE_CODE (rhs) == SSA_NAME) + if (TREE_CODE (rhs) == SSA_NAME + && !name_registered_for_update_p (rhs)) { gimple def_stmt = SSA_NAME_DEF_STMT (rhs); if (gimple_code (def_stmt) == GIMPLE_PHI && gimple_phi_num_args (def_stmt) == 1 - && gimple_bb (def_stmt) == gimple_bb (stmt)) + && gimple_bb (def_stmt) == gimple_bb (stmt) + && (TREE_CODE (PHI_ARG_DEF (def_stmt, 0)) != SSA_NAME + || !name_registered_for_update_p (PHI_ARG_DEF (def_stmt, + 0)))) rhs = PHI_ARG_DEF (def_stmt, 0); } val = fold_binary_loc (loc, gimple_cond_code (stmt), |