The following fixes PR64764. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard. 2015-01-26 Richard Biener <rguent...@suse.de> PR middle-end/64764 * tree-ssa-uninit.c (is_pred_expr_subset_of): Handle combining two BIT_AND_EXPR predicates. * gcc.dg/uninit-19.c: New testcase. Index: gcc/tree-ssa-uninit.c =================================================================== --- gcc/tree-ssa-uninit.c (revision 220107) +++ gcc/tree-ssa-uninit.c (working copy) @@ -1377,7 +1377,8 @@ is_pred_expr_subset_of (pred_info expr1, if (expr2.invert) code2 = invert_tree_comparison (code2, false); - if (code1 == EQ_EXPR && code2 == BIT_AND_EXPR) + if ((code1 == EQ_EXPR || code1 == BIT_AND_EXPR) + && code2 == BIT_AND_EXPR) return wi::eq_p (expr1.pred_rhs, wi::bit_and (expr1.pred_rhs, expr2.pred_rhs)); Index: gcc/testsuite/gcc.dg/uninit-19.c =================================================================== --- gcc/testsuite/gcc.dg/uninit-19.c (revision 0) +++ gcc/testsuite/gcc.dg/uninit-19.c (working copy) @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O -Wuninitialized" } */ + +int a, l, m; +float *b; +float c, d, e, g, h; +unsigned char i, k; +void +fn1 (int p1, float *f1, float *f2, float *f3, unsigned char *c1, float *f4, + unsigned char *c2, float *p10) +{ + if (p1 & 8) + b[3] = p10[a]; /* { dg-warning "may be used uninitialized" } */ +} + +void +fn2 () +{ + float *n; + if (l & 6) + n = &c + m; + fn1 (l, &d, &e, &g, &i, &h, &k, n); +}