mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-29 05:36:47 +00:00
gcc: add patches to fix GCC-60902, this should fix #3323
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
031e2ca65d
commit
3209febb3b
100
packages/lang/gcc/patches/gcc-4.9-PR60902-1.patch
Normal file
100
packages/lang/gcc/patches/gcc-4.9-PR60902-1.patch
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
From 0c5e8ed4943e302f6154e07368c0831e14c24187 Mon Sep 17 00:00:00 2001
|
||||||
|
From: law <law@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||||||
|
Date: Tue, 13 May 2014 20:26:30 +0000
|
||||||
|
Subject: [PATCH] PR tree-optimization/60902
|
||||||
|
* tree-ssa-threadedge.c
|
||||||
|
(record_temporary_equivalences_from_stmts_at_dest): Make sure to
|
||||||
|
invalidate outputs from statements that do not produce useful
|
||||||
|
outputs for threading.
|
||||||
|
|
||||||
|
PR tree-optimization/60902
|
||||||
|
* gcc.target/i386/pr60902.c: New test.
|
||||||
|
|
||||||
|
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@210398 138bc75d-0d04-0410-961f-82ee72b054a4
|
||||||
|
---
|
||||||
|
gcc/testsuite/gcc.target/i386/pr60902.c | 32 +++++++++++++++++++++++++++++++
|
||||||
|
gcc/tree-ssa-threadedge.c | 29 +++++++++++++++++++++++++++-
|
||||||
|
4 files changed, 79 insertions(+), 1 deletions(-)
|
||||||
|
create mode 100644 gcc/testsuite/gcc.target/i386/pr60902.c
|
||||||
|
|
||||||
|
diff --git a/gcc/testsuite/gcc.target/i386/pr60902.c b/gcc/testsuite/gcc.target/i386/pr60902.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..b81dcd7
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gcc.target/i386/pr60902.c
|
||||||
|
@@ -0,0 +1,32 @@
|
||||||
|
+/* { dg-do run } */
|
||||||
|
+/* { dg-options "-O2" } */
|
||||||
|
+extern void abort ();
|
||||||
|
+extern void exit (int);
|
||||||
|
+
|
||||||
|
+int x;
|
||||||
|
+
|
||||||
|
+foo()
|
||||||
|
+{
|
||||||
|
+ static int count;
|
||||||
|
+ count++;
|
||||||
|
+ if (count > 1)
|
||||||
|
+ abort ();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline int
|
||||||
|
+frob ()
|
||||||
|
+{
|
||||||
|
+ int a;
|
||||||
|
+ __asm__ ("mov %1, %0\n\t" : "=r" (a) : "m" (x));
|
||||||
|
+ x++;
|
||||||
|
+ return a;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+main ()
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ for (i = 0; i < 10 && frob () == 0; i++)
|
||||||
|
+ foo();
|
||||||
|
+ exit (0);
|
||||||
|
+}
|
||||||
|
diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
|
||||||
|
index c447b72..8a0103b 100644
|
||||||
|
--- a/gcc/tree-ssa-threadedge.c
|
||||||
|
+++ b/gcc/tree-ssa-threadedge.c
|
||||||
|
@@ -387,7 +387,34 @@ record_temporary_equivalences_from_stmts_at_dest (edge e,
|
||||||
|
&& (gimple_code (stmt) != GIMPLE_CALL
|
||||||
|
|| gimple_call_lhs (stmt) == NULL_TREE
|
||||||
|
|| TREE_CODE (gimple_call_lhs (stmt)) != SSA_NAME))
|
||||||
|
- continue;
|
||||||
|
+ {
|
||||||
|
+ /* STMT might still have DEFS and we need to invalidate any known
|
||||||
|
+ equivalences for them.
|
||||||
|
+
|
||||||
|
+ Consider if STMT is a GIMPLE_ASM with one or more outputs that
|
||||||
|
+ feeds a conditional inside a loop. We might derive an equivalence
|
||||||
|
+ due to the conditional. */
|
||||||
|
+ tree op;
|
||||||
|
+ ssa_op_iter iter;
|
||||||
|
+
|
||||||
|
+ if (backedge_seen)
|
||||||
|
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
|
||||||
|
+ {
|
||||||
|
+ /* This call only invalidates equivalences created by
|
||||||
|
+ PHI nodes. This is by design to keep the cost of
|
||||||
|
+ of invalidation reasonable. */
|
||||||
|
+ invalidate_equivalences (op, stack, src_map, dst_map);
|
||||||
|
+
|
||||||
|
+ /* However, conditionals can imply values for real
|
||||||
|
+ operands as well. And those won't be recorded in the
|
||||||
|
+ maps. In fact, those equivalences may be recorded totally
|
||||||
|
+ outside the threading code. We can just create a new
|
||||||
|
+ temporary NULL equivalence here. */
|
||||||
|
+ record_temporary_equivalence (op, NULL_TREE, stack);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* The result of __builtin_object_size depends on all the arguments
|
||||||
|
of a phi node. Temporarily using only one edge produces invalid
|
||||||
|
--
|
||||||
|
1.7.1
|
||||||
|
|
30
packages/lang/gcc/patches/gcc-4.9-PR60902-2.patch
Normal file
30
packages/lang/gcc/patches/gcc-4.9-PR60902-2.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
From 4de76fa443ab107e4542bbdba242f0ed467cfecf Mon Sep 17 00:00:00 2001
|
||||||
|
From: law <law@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||||||
|
Date: Tue, 13 May 2014 20:26:41 +0000
|
||||||
|
Subject: [PATCH] PR tree-optimization/60902
|
||||||
|
* tree-ssa-threadedge.c
|
||||||
|
(record_temporary_equivalences_from_stmts_at_dest): Only iterate
|
||||||
|
over real defs when invalidating outputs from statements that do not
|
||||||
|
produce useful outputs for threading.
|
||||||
|
|
||||||
|
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@210399 138bc75d-0d04-0410-961f-82ee72b054a4
|
||||||
|
---
|
||||||
|
gcc/tree-ssa-threadedge.c | 2 +-
|
||||||
|
2 files changed, 10 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
|
||||||
|
index 8a0103b..7621348 100644
|
||||||
|
--- a/gcc/tree-ssa-threadedge.c
|
||||||
|
+++ b/gcc/tree-ssa-threadedge.c
|
||||||
|
@@ -398,7 +398,7 @@ record_temporary_equivalences_from_stmts_at_dest (edge e,
|
||||||
|
ssa_op_iter iter;
|
||||||
|
|
||||||
|
if (backedge_seen)
|
||||||
|
- FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
|
||||||
|
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
|
||||||
|
{
|
||||||
|
/* This call only invalidates equivalences created by
|
||||||
|
PHI nodes. This is by design to keep the cost of
|
||||||
|
--
|
||||||
|
1.7.1
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user