diff options
author | Richard Guenther <rguenther@suse.de> | 2007-11-20 15:16:25 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2007-11-20 15:16:25 +0000 |
commit | 8ef62eeb746043239772dd99ad2cff5176735713 (patch) | |
tree | 59272568e1491b41aa8b2b5d380b8dabbdf8eec2 /gcc | |
parent | f22aa574dc04c5a06f068b1793fc092071661a18 (diff) | |
download | gcc-8ef62eeb746043239772dd99ad2cff5176735713.zip gcc-8ef62eeb746043239772dd99ad2cff5176735713.tar.gz gcc-8ef62eeb746043239772dd99ad2cff5176735713.tar.bz2 |
tree-ssa-operands.c (add_virtual_operand): Consistently prune accesses.
2007-11-20 Richard Guenther <rguenther@suse.de>
* tree-ssa-operands.c (add_virtual_operand): Consistently prune
accesses.
* gcc.c-torture/execute/20071120-1.c: New testcase.
From-SVN: r130315
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20071120-1.c | 81 | ||||
-rw-r--r-- | gcc/tree-ssa-operands.c | 1 |
4 files changed, 90 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 03027c1..beb2370 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-11-20 Richard Guenther <rguenther@suse.de> + + * tree-ssa-operands.c (add_virtual_operand): Consistently prune + accesses. + 2007-11-20 Thiemo Seufer <ths@mips.com> * config/mips/mips.c (mips_file_start): Add support for diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c01f3ae..3ad61fd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-11-20 Richard Guenther <rguenther@suse.de> + + * gcc.c-torture/execute/20071120-1.c: New testcase. + 2007-11-20 Jakub Jelinek <jakub@redhat.com> PR c/34146 diff --git a/gcc/testsuite/gcc.c-torture/execute/20071120-1.c b/gcc/testsuite/gcc.c-torture/execute/20071120-1.c new file mode 100644 index 0000000..ffe51ae --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20071120-1.c @@ -0,0 +1,81 @@ +extern void abort (void); + +void __attribute__((noinline,noreturn)) +vec_assert_fail (void) +{ + abort (); +} + +struct ggc_root_tab { + void *base; +}; + +typedef struct deferred_access_check {} VEC_deferred_access_check_gc; + +typedef struct deferred_access { + VEC_deferred_access_check_gc* deferred_access_checks; + int deferring_access_checks_kind; +} deferred_access; + +typedef struct VEC_deferred_access_base { + unsigned num; + deferred_access vec[1]; +} VEC_deferred_access_base; + +static __inline__ deferred_access * +VEC_deferred_access_base_last (VEC_deferred_access_base *vec_) +{ + (void)((vec_ && vec_->num) ? 0 : (vec_assert_fail (), 0)); + return &vec_->vec[vec_->num - 1]; +} + +static __inline__ void +VEC_deferred_access_base_pop (VEC_deferred_access_base *vec_) +{ + (void)((vec_->num) ? 0 : (vec_assert_fail (), 0)); + --vec_->num; +} + +void __attribute__((noinline)) +perform_access_checks (VEC_deferred_access_check_gc* p) +{ + abort (); +} + +typedef struct VEC_deferred_access_gc { + VEC_deferred_access_base base; +} VEC_deferred_access_gc; + +static VEC_deferred_access_gc *deferred_access_stack; +static unsigned deferred_access_no_check; + +const struct ggc_root_tab gt_pch_rs_gt_cp_semantics_h[] = { + { + &deferred_access_no_check + } +}; + +void __attribute__((noinline)) pop_to_parent_deferring_access_checks (void) +{ + if (deferred_access_no_check) + deferred_access_no_check--; + else + { + VEC_deferred_access_check_gc *checks; + deferred_access *ptr; + checks = (VEC_deferred_access_base_last(deferred_access_stack ? &deferred_access_stack->base : 0))->deferred_access_checks; + VEC_deferred_access_base_pop(deferred_access_stack ? &deferred_access_stack->base : 0); + ptr = VEC_deferred_access_base_last(deferred_access_stack ? &deferred_access_stack->base : 0); + if (ptr->deferring_access_checks_kind == 0) + perform_access_checks (checks); + } +} + +int main() +{ + deferred_access_stack = __builtin_malloc (sizeof(VEC_deferred_access_gc) + sizeof(deferred_access) * 8); + deferred_access_stack->base.num = 2; + deferred_access_stack->base.vec[0].deferring_access_checks_kind = 1; + pop_to_parent_deferring_access_checks (); + return 0; +} diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index 1f491ca..36cf624 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -1531,7 +1531,6 @@ add_virtual_operand (tree var, stmt_ann_t s_ann, int flags, unspecified [0, -1], we cannot prune it. Otherwise try doing so using access_can_touch_variable. */ if (full_ref - && !(offset == 0 && size == -1) && !access_can_touch_variable (full_ref, al, offset, size)) continue; |