aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDiego Novillo <dnovillo@redhat.com>2004-12-20 18:18:37 +0000
committerDiego Novillo <dnovillo@gcc.gnu.org>2004-12-20 13:18:37 -0500
commit90e34bd6374760bfdd0a8807e8323eaa50a749f1 (patch)
tree4f20301c6201fe9b132e07d84f5911f4816afa44 /gcc
parentc20a99d0c57237b78ceb267b6f42d20278b7b7ea (diff)
downloadgcc-90e34bd6374760bfdd0a8807e8323eaa50a749f1.zip
gcc-90e34bd6374760bfdd0a8807e8323eaa50a749f1.tar.gz
gcc-90e34bd6374760bfdd0a8807e8323eaa50a749f1.tar.bz2
re PR tree-optimization/19080 (ICE while compiling linux kernel)
PR tree-optimization/19080 Merge from tree-cleanup-branch * tree-flow-inline.h (clear_call_clobbered): New function. * tree-ssa-alias.c (init_alias_info): Call it. testsuite/ChangeLog PR tree-optimization/19080 * gcc.c-torture/compile/pr19080.c: New test. From-SVN: r92423
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr19080.c115
-rw-r--r--gcc/tree-flow-inline.h12
-rw-r--r--gcc/tree-ssa-alias.c26
5 files changed, 152 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8e3f21c..08bcedd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2004-12-20 Diego Novillo <dnovillo@redhat.com>
+
+ PR tree-optimization/19080
+
+ Merge from tree-cleanup-branch
+
+ * tree-flow-inline.h (clear_call_clobbered): New function.
+ * tree-ssa-alias.c (init_alias_info): Call it.
+
2004-12-20 Richard Henderson <rth@redhat.com>
* config/i386/i386.md (sse2_movsd): Remove ix86_binary_operator_ok
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c1c21c4..5dfec5c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-12-20 Diego Novillo <dnovillo@redhat.com>
+
+ PR tree-optimization/19080
+ * gcc.c-torture/compile/pr19080.c: New test.
+
2004-12-20 Steven Bosscher <stevenb@suse.de>
* gcc.dg/20041219-1.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr19080.c b/gcc/testsuite/gcc.c-torture/compile/pr19080.c
new file mode 100644
index 0000000..b5686b8
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr19080.c
@@ -0,0 +1,115 @@
+typedef union { int ioport; volatile char *maddr; } bus_space_handle_t;
+struct scb { unsigned short *hscb; };
+struct ahd_softc
+{
+ int tags[2];
+ bus_space_handle_t bshs[2];
+ int dst_mode;
+ int src_mode;
+ int flags;
+};
+void outb(int, int);
+
+int foo_inb(struct ahd_softc*);
+int foo_int_int (int, int);
+int ahd_inb(struct ahd_softc*);
+int ahd_scb_active_in_fifo (void);
+
+void ahd_flush_qoutfifo (struct ahd_softc *ahd, struct scb *scb)
+{
+ int src, dst, *a = &src, *b = &dst; *a = 1, *b = 1;
+ int bb, p;
+
+ if (ahd->src_mode == 1)
+ { int src, dst, *a = &src, *b = &dst; *a = 1, *b = 1;}
+ foo_int_int (ahd->src_mode, ahd->dst_mode);
+ p = 1;
+ if (ahd->src_mode == 2 && ahd->dst_mode == p)
+ {
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ }
+ ahd->src_mode = 1;
+ ahd->dst_mode = 2;
+ while ((ahd_inb (ahd) & 0x01) != 0)
+ {
+ p = 1;
+ if (ahd->src_mode == 2 && ahd->dst_mode == p)
+ {
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ }
+ ahd->src_mode = 1;
+ ahd->dst_mode = 2;
+ if (ahd_scb_active_in_fifo () == 0)
+ continue;
+ p = 1;
+ if (ahd->src_mode == 2 && ahd->dst_mode == p)
+ {
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ }
+ ahd->src_mode = 1;
+ ahd->dst_mode = 2;
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if ((ahd->flags & 1) != 0)
+ foo_inb (ahd);
+ if ((ahd->flags & 1) != 0)
+ foo_inb (ahd);
+ if ((ahd->flags & 1) != 0)
+ foo_inb (ahd);
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if ((ahd->flags & 1) != 0)
+ foo_inb (ahd);
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ bb = (*(scb->hscb));
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ bb = (*(scb->hscb));
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ }
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ p = 1;
+ if (ahd->src_mode == 2 && ahd->dst_mode == p)
+ {
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ }
+ ahd->src_mode = 1;
+ ahd->dst_mode = 2;
+ if (ahd->src_mode == 2 && ahd->dst_mode == dst)
+ {
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ if (ahd->tags[0] == 1) *(ahd->bshs[0].maddr);
+ outb (1, ahd->bshs[0].ioport );
+ }
+ ahd->src_mode = 1;
+ ahd->dst_mode = 2;
+ ahd->flags |= 1;
+}
diff --git a/gcc/tree-flow-inline.h b/gcc/tree-flow-inline.h
index fd31a76..b6bcb65 100644
--- a/gcc/tree-flow-inline.h
+++ b/gcc/tree-flow-inline.h
@@ -625,6 +625,18 @@ mark_call_clobbered (tree var)
ssa_ro_call_cache_valid = false;
}
+/* Clear the call-clobbered attribute from variable VAR. */
+static inline void
+clear_call_clobbered (tree var)
+{
+ var_ann_t ann = var_ann (var);
+ if (ann->mem_tag_kind != NOT_A_TAG)
+ DECL_EXTERNAL (var) = 0;
+ bitmap_clear_bit (call_clobbered_vars, ann->uid);
+ ssa_call_clobbered_cache_valid = false;
+ ssa_ro_call_cache_valid = false;
+}
+
/* Mark variable VAR as being non-addressable. */
static inline void
mark_non_addressable (tree var)
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index ecdd7f4..92a203c 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -437,7 +437,6 @@ init_alias_info (void)
if (aliases_computed_p)
{
unsigned i;
- bitmap_iterator bi;
basic_block bb;
/* Make sure that every statement has a valid set of operands.
@@ -453,19 +452,6 @@ init_alias_info (void)
get_stmt_operands (bsi_stmt (si));
}
- /* Clear the call-clobbered set. We are going to re-discover
- call-clobbered variables. */
- EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, bi)
- {
- tree var = referenced_var (i);
-
- /* Variables that are intrinsically call-clobbered (globals,
- local statics, etc) will not be marked by the aliasing
- code, so we can't remove them from CALL_CLOBBERED_VARS. */
- if (!is_call_clobbered (var))
- bitmap_clear_bit (call_clobbered_vars, var_ann (var)->uid);
- }
-
/* Similarly, clear the set of addressable variables. In this
case, we can just clear the set because addressability is
only computed here. */
@@ -474,9 +460,19 @@ init_alias_info (void)
/* Clear flow-insensitive alias information from each symbol. */
for (i = 0; i < num_referenced_vars; i++)
{
- var_ann_t ann = var_ann (referenced_var (i));
+ tree var = referenced_var (i);
+ var_ann_t ann = var_ann (var);
+
ann->is_alias_tag = 0;
ann->may_aliases = NULL;
+
+ /* Since we are about to re-discover call-clobbered
+ variables, clear the call-clobbered flag. Variables that
+ are intrinsically call-clobbered (globals, local statics,
+ etc) will not be marked by the aliasing code, so we can't
+ remove them from CALL_CLOBBERED_VARS. */
+ if (ann->mem_tag_kind != NOT_A_TAG || !is_global_var (var))
+ clear_call_clobbered (var);
}
/* Clear flow-sensitive points-to information from each SSA name. */