diff options
author | Martin Jambor <mjambor@suse.cz> | 2010-04-23 16:43:10 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2010-04-23 16:43:10 +0200 |
commit | 5c20baf14a210ac2df9f81b5a6f90b8ae8455d6d (patch) | |
tree | 877c9b1e53e9bd1e4c18139beb404f631304f477 /gcc | |
parent | c67f69a3f3977669094ed9a815116d2b97ac09d1 (diff) | |
download | gcc-5c20baf14a210ac2df9f81b5a6f90b8ae8455d6d.zip gcc-5c20baf14a210ac2df9f81b5a6f90b8ae8455d6d.tar.gz gcc-5c20baf14a210ac2df9f81b5a6f90b8ae8455d6d.tar.bz2 |
re PR middle-end/43835 (IPA-SRA doesn't rewrite attributes)
2010-04-23 Martin Jambor <mjambor@suse.cz>
PR middle-end/43835
* tree-sra.c (ipa_sra_preliminary_function_checks): Check that the
function does not have type attributes.
* testsuite/gcc.c-torture/execute/pr43835.c: New test.
From-SVN: r158667
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr43835.c | 51 | ||||
-rw-r--r-- | gcc/tree-sra.c | 3 |
4 files changed, 65 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d81d2eb..1d45422 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-04-23 Martin Jambor <mjambor@suse.cz> + + PR middle-end/43835 + * tree-sra.c (ipa_sra_preliminary_function_checks): Check that the + function does not have type attributes. + 2010-04-23 Richard Guenther <rguenther@suse.de> PR lto/42653 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5dfed40..5558134 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-04-23 Martin Jambor <mjambor@suse.cz> + + PR middle-end/43835 + * gcc.c-torture/execute/pr43835.c: New test. + 2010-04-23 Richard Guenther <rguenther@suse.de> PR lto/42653 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr43835.c b/gcc/testsuite/gcc.c-torture/execute/pr43835.c new file mode 100644 index 0000000..97237f6 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr43835.c @@ -0,0 +1,51 @@ +struct PMC { + unsigned flags; +}; + +typedef struct Pcc_cell +{ + struct PMC *p; + long bla; + long type; +} Pcc_cell; + +extern void abort (); +extern void Parrot_gc_mark_PMC_alive_fun(int * interp, struct PMC *pmc) + __attribute__((noinline)); + +void Parrot_gc_mark_PMC_alive_fun (int * interp, struct PMC *pmc) +{ + abort (); +} + +static void mark_cell(int * interp, Pcc_cell *c) + __attribute__((__nonnull__(1))) + __attribute__((__nonnull__(2))) + __attribute__((noinline)); + +static void +mark_cell(int * interp, Pcc_cell *c) +{ + if (c->type == 4 && c->p + && !(c->p->flags & (1<<18))) + Parrot_gc_mark_PMC_alive_fun(interp, c->p); +} + +void foo(int * interp, Pcc_cell *c); + +void +foo(int * interp, Pcc_cell *c) +{ + mark_cell(interp, c); +} + +int main() +{ + int i; + Pcc_cell c; + c.p = 0; + c.bla = 42; + c.type = 4; + foo (&i, &c); + return 0; +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 0635aa7..b318201 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -4162,6 +4162,9 @@ ipa_sra_preliminary_function_checks (struct cgraph_node *node) return false; } + if (TYPE_ATTRIBUTES (TREE_TYPE (node->decl))) + return false; + return true; } |