diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 57e720cb9ad6d6e6b8caa3c4de912205e5184024..c339897488abce0c119a46022e76dfe4fde956c7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-02-09 Andrew Pinski <pinskia@physics.uc.edu> + + PR tree-opt/26179 + * tree-ssa-pre.c (create_component_ref_by_pieces): + Handle RETURN_DECL like VAR_DECL. + 2006-02-09 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/26134 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dd78250d0edce65378d2ffa618a9ba906d40fa29..d7ea0007e4841836903b86748900b7580072b5df 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-02-09 Andrew Pinski <pinskia@physics.uc.edu> + + PR tree-opt/26179 + * g++.dg/opt/pr26179.C: New test. + 2006-02-09 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/26134 diff --git a/gcc/testsuite/g++.dg/opt/pr26179.C b/gcc/testsuite/g++.dg/opt/pr26179.C new file mode 100644 index 0000000000000000000000000000000000000000..32cd7a00ea9dca7575cf59049e8033072c211761 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr26179.C @@ -0,0 +1,22 @@ +/* The problem here is that Load PRE on the tree level + forgot to handle RETURN_DECL which causes us to ICE. */ + +// { dg-do compile } +// { dg-options "-O2" } + +struct a +{ + int i; +}; +void h(struct a&); +void l(void); + +struct a g(void) +{ + struct a fl; + h(fl); + if (fl.i) + l(); + fl.i+=2; + return fl; +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index d2edf218758b75dd1f335e167532cb2cd4d3a1fe..95df38878956ddf59fbc850a4e5aad781b2dfdb8 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -2161,6 +2161,7 @@ create_component_ref_by_pieces (basic_block block, tree expr, tree stmts) break; case VAR_DECL: case PARM_DECL: + case RESULT_DECL: case SSA_NAME: return genop; default: