aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>2004-09-14 09:49:04 +0200
committerZdenek Dvorak <rakdver@gcc.gnu.org>2004-09-14 07:49:04 +0000
commitd840495b15862ef5d62af317e76be37d71948540 (patch)
treea20a3b9b479fd8cd277dcc9ae9b4528ef2716a74 /gcc
parentc94583fe5577f83df48b156f86d9d36dcb218dbe (diff)
downloadgcc-d840495b15862ef5d62af317e76be37d71948540.zip
gcc-d840495b15862ef5d62af317e76be37d71948540.tar.gz
gcc-d840495b15862ef5d62af317e76be37d71948540.tar.bz2
tree-cfg.c (thread_jumps): Update dominators correctly in case destination of threaded edge dominates its...
* tree-cfg.c (thread_jumps): Update dominators correctly in case destination of threaded edge dominates its source. From-SVN: r87486
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20040914-1.c39
-rw-r--r--gcc/tree-cfg.c9
4 files changed, 54 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a6de746..b666c83 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2004-09-14 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
+ * tree-cfg.c (thread_jumps): Update dominators correctly in
+ case destination of threaded edge dominates its source.
+
+2004-09-14 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
+
* unroll.c: Removed.
* loop.h: Removed.
* Makefile.in (LOOP_H, unroll.o): Removed.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4e59e16..02953de 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2004-09-14 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
+
+ * gcc.c-torture/compile/20040914-1.c: New test.
+
2004-09-13 Mark Mitchell <mark@codesourcery.com>
PR c++/16162
diff --git a/gcc/testsuite/gcc.c-torture/compile/20040914-1.c b/gcc/testsuite/gcc.c-torture/compile/20040914-1.c
new file mode 100644
index 0000000..824664c
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20040914-1.c
@@ -0,0 +1,39 @@
+extern int clobber_k (int *);
+extern int barrier (void);
+int t, u;
+
+int
+process_second_stream(void)
+{
+ int k;
+ int i = 0, j = 0, result;
+
+ clobber_k (&k);
+
+ while(t)
+ ;
+
+ while(!j)
+ {
+ while(!j)
+ {
+ barrier ();
+ if (t == 0)
+ break;
+ else if(t == 1)
+ t = 2;
+ else
+ {
+ if(t < 0)
+ j=1;
+ if(u < 0)
+ k = i++;
+ }
+ }
+
+ if(!j && u)
+ j=1;
+ }
+
+ return 0;
+}
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 8e9e5af..6f21467 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -3970,9 +3970,11 @@ thread_jumps (void)
set_immediate_dominator (CDI_DOMINATORS, old_dest, bb);
/* Now proceed like if we forwarded just over one edge at a time.
- Algorithm for forwarding over edge A --> B then is
+ Algorithm for forwarding edge S --> A over edge A --> B then
+ is
- if (idom (B) == A)
+ if (idom (B) == A
+ && !dominated_by (S, B))
idom (B) = idom (A);
recount_idom (A); */
@@ -3980,7 +3982,8 @@ thread_jumps (void)
{
tmp = old_dest->succ->dest;
- if (get_immediate_dominator (CDI_DOMINATORS, tmp) == old_dest)
+ if (get_immediate_dominator (CDI_DOMINATORS, tmp) == old_dest
+ && !dominated_by_p (CDI_DOMINATORS, bb, tmp))
{
dom = get_immediate_dominator (CDI_DOMINATORS, old_dest);
set_immediate_dominator (CDI_DOMINATORS, tmp, dom);