aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2015-02-14 00:20:31 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2015-02-14 00:20:31 +0100
commitf7a0790f3ccdf71e47e8cb79af7820539361f9d2 (patch)
treef6170a20c73ac9690afa1cf444ae8238f2e77498 /gcc
parente5d9235ba945870c20a70499d5565edfb2bd4264 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr65053-1.c32
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr65053-2.c27
-rw-r--r--gcc/tree-ssa-phiopt.c25
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);