diff options
author | Jakub Jelinek <jakub@redhat.com> | 2015-02-14 00:20:31 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2015-02-14 00:20:31 +0100 |
commit | f7a0790f3ccdf71e47e8cb79af7820539361f9d2 (patch) | |
tree | f6170a20c73ac9690afa1cf444ae8238f2e77498 /gcc | |
parent | e5d9235ba945870c20a70499d5565edfb2bd4264 (diff) | |
download | gcc-f7a0790f3ccdf71e47e8cb79af7820539361f9d2.zip gcc-f7a0790f3ccdf71e47e8cb79af7820539361f9d2.tar.gz gcc-f7a0790f3ccdf71e47e8cb79af7820539361f9d2.tar.bz2 |
re PR tree-optimization/65053 (PostgreSQL miscompilation)
PR tree-optimization/65053
* tree-ssa-phiopt.c (value_replacement): When moving assign before
cond, either reset VR on lhs or set it to phi result VR.
* gcc.c-torture/execute/pr65053-1.c: New test.
* gcc.c-torture/execute/pr65053-2.c: New test.
From-SVN: r220700
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr65053-1.c | 32 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr65053-2.c | 27 | ||||
-rw-r--r-- | gcc/tree-ssa-phiopt.c | 25 |
5 files changed, 96 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a574c2b..0795bc6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-02-13 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/65053 + * tree-ssa-phiopt.c (value_replacement): When moving assign before + cond, either reset VR on lhs or set it to phi result VR. + 2015-02-13 Jeff Law <law@redhat.com> PR tree-optimization/64823 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 78026a1..f25e959 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-02-13 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/65053 + * gcc.c-torture/execute/pr65053-1.c: New test. + * gcc.c-torture/execute/pr65053-2.c: New test. + 2015-02-13 Marek Polacek <polacek@redhat.com> PR c/65050 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr65053-1.c b/gcc/testsuite/gcc.c-torture/execute/pr65053-1.c new file mode 100644 index 0000000..edcf41d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr65053-1.c @@ -0,0 +1,32 @@ +/* PR tree-optimization/65053 */ + +int i; + +__attribute__ ((noinline, noclone)) +unsigned int foo (void) +{ + return 0; +} + +int +main () +{ + unsigned int u = -1; + if (u == -1) + { + unsigned int n = foo (); + if (n > 0) + u = n - 1; + } + + while (u != -1) + { + asm ("" : "+g" (u)); + u = -1; + i = 1; + } + + if (i) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr65053-2.c b/gcc/testsuite/gcc.c-torture/execute/pr65053-2.c new file mode 100644 index 0000000..2a0f4e4 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr65053-2.c @@ -0,0 +1,27 @@ +/* PR tree-optimization/65053 */ + +int i; +unsigned int x; + +int +main () +{ + asm volatile ("" : "+g" (x)); + unsigned int n = x; + unsigned int u = 32; + if (n >= 32) + __builtin_abort (); + if (n != 0) + u = n + 32; + + while (u != 32) + { + asm ("" : : "g" (u)); + u = 32; + i = 1; + } + + if (i) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index bad546d..c7fb073 100644 --- a/gcc/tree-ssa-phiopt.c +++ b/gcc/tree-ssa-phiopt.c @@ -917,6 +917,31 @@ value_replacement (basic_block cond_bb, basic_block middle_bb, && absorbing_element_p (code_def, cond_rhs)))) { gsi = gsi_for_stmt (cond); + if (INTEGRAL_TYPE_P (TREE_TYPE (lhs))) + { + /* Moving ASSIGN might change VR of lhs, e.g. when moving u_6 + def-stmt in: + if (n_5 != 0) + goto <bb 3>; + else + goto <bb 4>; + + <bb 3>: + # RANGE [0, 4294967294] + u_6 = n_5 + 4294967295; + + <bb 4>: + # u_3 = PHI <u_6(3), 4294967295(2)> */ + SSA_NAME_RANGE_INFO (lhs) = NULL; + SSA_NAME_ANTI_RANGE_P (lhs) = 0; + /* If available, we can use VR of phi result at least. */ + tree phires = gimple_phi_result (phi); + struct range_info_def *phires_range_info + = SSA_NAME_RANGE_INFO (phires); + if (phires_range_info) + duplicate_ssa_name_range_info (lhs, SSA_NAME_RANGE_TYPE (phires), + phires_range_info); + } gimple_stmt_iterator gsi_from = gsi_for_stmt (assign); gsi_move_before (&gsi_from, &gsi); replace_phi_edge_with_variable (cond_bb, e1, phi, lhs); |