From f8981d1c08b02802f3b20a656b6a8d1fc46a6f1a Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Mon, 16 Nov 2009 20:18:33 +0000 Subject: [PATCH] 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) : Create the decl label for the new dest block on demand. Require a fallthrough edge if no asm labels were redirected. From-SVN: r154213 --- gcc/ChangeLog | 6 ++++++ gcc/tree-cfg.c | 13 +++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bcfe5a96aff..aba806ec812 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-11-16 Alexandre Oliva + + * tree-cfg.c (gimple_redirect_edge_and_branch) : + 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 * config/i386/i386.md (cbranchsi4): Use nonimmediate_operand for diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 4de3dea4ea4..b3b71b9abba 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;