On Fri, Sep 7, 2012 at 11:01 PM, Markus Trippelsdorf <mar...@trippelsdorf.de> wrote: > Here the problem is that get_base_address() can return NULL_TREE and > this later leads to a segfault. Fix by checking that the return value is > valid. > gcc-4.6 and 4.7 are also affected. > > Please commit if this looks OK. > Thanks.
Hmm, we call the function on VIEW_CONVERT_EXPR<unsigned char[2]>(0)[0] which should have been folded to a constant. And get_base_address should just return the constant tree instead of returning NULL (it does return a plethora of base object kinds already). Your patch looks ok for the branches where I'll install it and come up with sth else for trunk. Thanks, Richard. > Tested on x86_64-pc-linux-gnu > > 2012-09-07 Markus Trippelsdorf <mar...@trippelsdorf.de> > > PR middle-end/54515 > * tree-sra.c (disqualify_base_of_expr): Check for possible > NULL_TREE returned by get_base_address() > > * g++.dg/tree-ssa/pr54515.C: new testcase > > diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr54515.C > b/gcc/testsuite/g++.dg/tree-ssa/pr54515.C > new file mode 100644 > index 0000000..11ed468 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/tree-ssa/pr54515.C > @@ -0,0 +1,19 @@ > +// { dg-do compile } > +// { dg-options "-O2" } > + > +template < typename T > T h2le (T) > +{ > + T a; > + unsigned short &b = a; > + short c = 0; > + unsigned char (&d)[2] = reinterpret_cast < unsigned char (&)[2] > (c); > + unsigned char (&e)[2] = reinterpret_cast < unsigned char (&)[2] > (b); > + e[0] = d[0]; > + return a; > +} > + > +void > +bar () > +{ > + h2le ((unsigned short) 0); > +} > diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c > index aafaa15..2bb92e9 100644 > --- a/gcc/tree-sra.c > +++ b/gcc/tree-sra.c > @@ -984,7 +984,8 @@ static void > disqualify_base_of_expr (tree t, const char *reason) > { > t = get_base_address (t); > - if (sra_mode == SRA_MODE_EARLY_IPA > + if (t > + && sra_mode == SRA_MODE_EARLY_IPA > && TREE_CODE (t) == MEM_REF) > t = get_ssa_base_param (TREE_OPERAND (t, 0)); > > -- > Markus