From f7a0790f3ccdf71e47e8cb79af7820539361f9d2 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 14 Feb 2015 00:20:31 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gcc.c-torture/execute/pr65053-1.c | 32 +++++++++++++++++++++++++ gcc/testsuite/gcc.c-torture/execute/pr65053-2.c | 27 +++++++++++++++++++++ gcc/tree-ssa-phiopt.c | 25 +++++++++++++++++++ 5 files changed, 96 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr65053-1.c create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr65053-2.c 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 + + 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 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 + + 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 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 ; + else + goto ; + + : + # RANGE [0, 4294967294] + u_6 = n_5 + 4294967295; + + : + # u_3 = PHI */ + 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); -- 2.7.4