From: dnovillo Date: Mon, 20 Dec 2004 18:18:37 +0000 (+0000) Subject: PR tree-optimization/19080 X-Git-Tag: upstream/4.9.2~64946 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0cf506c886ca609627c8a38b1b44f4309a68f552;p=platform%2Fupstream%2Flinaro-gcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92423 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 + + 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 * 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 + + PR tree-optimization/19080 + * gcc.c-torture/compile/pr19080.c: New test. + 2004-12-20 Steven Bosscher * 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. */