From: Jakub Jelinek Date: Fri, 6 Dec 2013 21:00:49 +0000 (+0100) Subject: re PR tree-optimization/59388 (ICE on valid code at -O1 and above on x86_64-linux... X-Git-Tag: releases/gcc-4.9.0~2229 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5f07cbdb0dec26dfe8b3138dbe9d4aa1d7959cd1;p=thirdparty%2Fgcc.git re PR tree-optimization/59388 (ICE on valid code at -O1 and above on x86_64-linux-gnu) PR tree-optimization/59388 * tree-ssa-reassoc.c (update_range_test): If op == range->exp, gimplify tem after stmt rather than before it. * gcc.c-torture/execute/pr59388.c: New test. From-SVN: r205761 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e965f96f5cd2..cf50c90c4851 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2013-12-06 Jakub Jelinek + PR tree-optimization/59388 + * tree-ssa-reassoc.c (update_range_test): If op == range->exp, + gimplify tem after stmt rather than before it. + * tree-data-ref.c (struct data_ref_loc_d): Replace pos field with ref. (get_references_in_stmt): Don't record operand addresses, but operands themselves. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eaa7a54fc198..2d8d2eb60b41 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-12-06 Jakub Jelinek + + PR tree-optimization/59388 + * gcc.c-torture/execute/pr59388.c: New test. + 2013-12-06 Dominique d'Humieres PR testsuite/59043 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr59388.c b/gcc/testsuite/gcc.c-torture/execute/pr59388.c new file mode 100644 index 000000000000..de3648a003ed --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr59388.c @@ -0,0 +1,11 @@ +/* PR tree-optimization/59388 */ + +int a; +struct S { unsigned int f:1; } b; + +int +main () +{ + a = (0 < b.f) | b.f; + return a; +} diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 7145559d697b..ba6c3c720c60 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -2072,9 +2072,19 @@ update_range_test (struct range_entry *range, struct range_entry *otherrange, tem = fold_convert_loc (loc, optype, tem); gsi = gsi_for_stmt (stmt); - tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true, - GSI_SAME_STMT); - for (gsi_prev (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi)) + /* In rare cases range->exp can be equal to lhs of stmt. + In that case we have to insert after the stmt rather then before + it. */ + if (op == range->exp) + tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, false, + GSI_CONTINUE_LINKING); + else + { + tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true, + GSI_SAME_STMT); + gsi_prev (&gsi); + } + for (; !gsi_end_p (gsi); gsi_prev (&gsi)) if (gimple_uid (gsi_stmt (gsi))) break; else