aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr24135.c46
-rw-r--r--gcc/tree-nested.c30
3 files changed, 70 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 19dd74e..957ac6c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-10-03 Richard Henderson <rth@redhat.com>
+
+ PR 24135
+ * tree-nested.c (convert_nl_goto_reference): Lookup a translation
+ before creating a new one.
+
2005-10-03 David Edelsohn <edelsohn@gnu.org>
* config/rs6000/t-aix43 (LDFLAGS): New.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr24135.c b/gcc/testsuite/gcc.c-torture/execute/pr24135.c
new file mode 100644
index 0000000..fdeda16
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr24135.c
@@ -0,0 +1,46 @@
+#ifndef NO_TRAMPOLINES
+extern void abort (void);
+
+int x(int a, int b)
+{
+ __label__ xlab;
+ __label__ xlab2;
+
+ void y(int b)
+ {
+ switch (b)
+ {
+ case 1: goto xlab;
+ case 2: goto xlab;
+ }
+ }
+
+ a = a + 2;
+ y (b);
+
+ xlab:
+ return a;
+
+ xlab2:
+ a++;
+ return a;
+
+}
+
+int main ()
+{
+ int i, j;
+
+ for (j = 1; j <= 2; ++j)
+ for (i = 1; i <= 2; ++i)
+ {
+ int a = x (j, i);
+ if (a != 2 + j)
+ abort ();
+ }
+
+ return 0;
+}
+#else
+int main() { return 0; }
+#endif
diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
index d42c583..27819db 100644
--- a/gcc/tree-nested.c
+++ b/gcc/tree-nested.c
@@ -1089,7 +1089,7 @@ convert_nl_goto_reference (tree *tp, int *walk_subtrees, void *data)
struct walk_stmt_info *wi = data;
struct nesting_info *info = wi->info, *i;
tree t = *tp, label, new_label, target_context, x, arg, field;
- struct var_map_elt *elt;
+ struct var_map_elt *elt, dummy;
void **slot;
*walk_subtrees = 0;
@@ -1110,17 +1110,23 @@ convert_nl_goto_reference (tree *tp, int *walk_subtrees, void *data)
control transfer. This new label will be marked LABEL_NONLOCAL; this
mark will trigger proper behavior in the cfg, as well as cause the
(hairy target-specific) non-local goto receiver code to be generated
- when we expand rtl. */
- new_label = create_artificial_label ();
- DECL_NONLOCAL (new_label) = 1;
-
- /* Enter this association into var_map so that we can insert the new
- label into the IL during a second pass. */
- elt = ggc_alloc (sizeof (*elt));
- elt->old = label;
- elt->new = new_label;
- slot = htab_find_slot (i->var_map, elt, INSERT);
- *slot = elt;
+ when we expand rtl. Enter this association into var_map so that we
+ can insert the new label into the IL during a second pass. */
+ dummy.old = label;
+ slot = htab_find_slot (i->var_map, &dummy, INSERT);
+ elt = *slot;
+ if (elt == NULL)
+ {
+ new_label = create_artificial_label ();
+ DECL_NONLOCAL (new_label) = 1;
+
+ elt = ggc_alloc (sizeof (*elt));
+ elt->old = label;
+ elt->new = new_label;
+ *slot = elt;
+ }
+ else
+ new_label = elt->new;
/* Build: __builtin_nl_goto(new_label, &chain->nl_goto_field). */
field = get_nl_goto_field (i);