diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2009-11-16 20:18:33 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2009-11-16 20:18:33 +0000 |
commit | f8981d1c08b02802f3b20a656b6a8d1fc46a6f1a (patch) | |
tree | 0ef81fd54f54010bdbafa2f630380ac7e91165cf | |
parent | a81f2330a313bcba17be25819ba4c3ad9ffd03c7 (diff) | |
download | gcc-f8981d1c08b02802f3b20a656b6a8d1fc46a6f1a.zip gcc-f8981d1c08b02802f3b20a656b6a8d1fc46a6f1a.tar.gz gcc-f8981d1c08b02802f3b20a656b6a8d1fc46a6f1a.tar.bz2 |
tree-cfg.c (gimple_redirect_edge_and_branch): Create the decl label for the new dest block on demand.
* tree-cfg.c (gimple_redirect_edge_and_branch) <case GIMPLE_ASM>:
Create the decl label for the new dest block on demand. Require
a fallthrough edge if no asm labels were redirected.
From-SVN: r154213
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 13 |
2 files changed, 17 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bcfe5a9..aba806e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-11-16 Alexandre Oliva <aoliva@redhat.com> + + * tree-cfg.c (gimple_redirect_edge_and_branch) <case GIMPLE_ASM>: + Create the decl label for the new dest block on demand. Require + a fallthrough edge if no asm labels were redirected. + 2009-11-16 Uros Bizjak <ubizjak@gmail.com> * config/i386/i386.md (cbranchsi4): Use nonimmediate_operand for diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 4de3dea..b3b71b9 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -4666,14 +4666,23 @@ gimple_redirect_edge_and_branch (edge e, basic_block dest) case GIMPLE_ASM: { int i, n = gimple_asm_nlabels (stmt); - tree label = gimple_block_label (dest); + tree label = NULL; for (i = 0; i < n; ++i) { tree cons = gimple_asm_label_op (stmt, i); if (label_to_block (TREE_VALUE (cons)) == e->dest) - TREE_VALUE (cons) = label; + { + if (!label) + label = gimple_block_label (dest); + TREE_VALUE (cons) = label; + } } + + /* If we didn't find any label matching the former edge in the + asm labels, we must be redirecting the fallthrough + edge. */ + gcc_assert (label || (e->flags & EDGE_FALLTHRU)); } break; |